Вам необходимо использовать флаг строки замены для xargs. Например, предположим, что остальная часть вашего конвейера работает, как задумано:
sudo arp-scan --localnet | grep 10 | cut -c1-12 | xargs -I{} -n1 ssh -tt myuser@{}
Обратите внимание, что обе команды xargs и ssh нуждаются в некоторых дополнительных флагах для правильной работы. Особо следует отметить необходимость передачи флагов -tt
в SSH для принудительного выделения PTY на удаленном хосте, когда клиент SSH получает стандартный ввод из канала.
В качестве альтернативы, если вы точно захватываете один IP-адрес, вы можете просто зафиксировать результат в переменной оболочки и вызвать SSH на правильном хосте. Например, использование оболочки Bash:
host_ip=$(sudo arp-scan --localnet | grep 10 | cut -c1-12)
ssh "myuser@${host_ip}"
Основное преимущество этого подхода в том, что его легче отлаживать. Однако ваш пробег может отличаться.
Вы можете реализовать это, если у вас есть что-то, чтобы решить, должен ли сценарий выполняться в фоновом режиме или он уже является одним в фоновом режиме, например. аргумент командной строки.
Предполагая, что вы обычно вызываете свой скрипт
./run.sh
вы можете добавить аргумент командной строки, например. bg
, чтобы сообщить сценарию, что он уже находится во втором выполнении, чтобы он не вызывал себя рекурсивно бесконечное количество раз (или до тех пор, пока системные ресурсы не будут израсходованы ).
./run.sh bg
Вы можете реализовать это следующим образом
#! /bin/sh
if [ "$1" = "bg" ]
then
# do the normal work
else
nohup "$0" bg > /dev/null 2>&1 &
fi