В моем сценарии я делаю что-то вроде этого:
command="some/path/script.sh arg1 arg2; some/path/script2.sh arg1 arg2;"
ssh_command="ssh root@$ip '$command'"
echo $ssh_command
exec $ssh_command
Команда echo выдает следующий вывод:
ssh [email protected] 'some/path/script.sh arg1 arg2; some/path/script2.sh arg1 arg2;'
После «exec» я получаю вывод:
bash: some/path/script.sh arg1 arg2; some/path/script2.sh arg1 arg2;: No such file or directory
Однако, когда копируешь команду из вывода echo и запускаешь ее прямо из терминала, все работает как часы. Есть идеи, почему?
решение1
exec
заменяет оболочку программой, вызывая ее с предоставленными аргументами. Оболочка видит 2 токена: "exec" и "some/path/script.sh arg1 arg2; some/path/script2.sh arg1 arg2;". Второй аргумент интерпретируется как путь к программе для выполнения, включая все пробелы и точки с запятой. Только оболочка знает, что аргументы нужно разделять пробелами, а команды — точкой с запятой. Поэтому следует заменить на exec
вызов оболочки, например sh -c "$ssh_command"
.
решение2
Нохупможет быть вам полезно.
Попробуйте интегрировать что-то вроде этого по ссылке ниже.
ssh -n -f пользователь@хост "ш -с'cd /whereever; nohup ./whatever > /dev/null 2>&1 &'"