In meinem Skript mache ich so etwas:
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
Das Echo gibt folgende Ausgabe aus:
ssh [email protected] 'some/path/script.sh arg1 arg2; some/path/script2.sh arg1 arg2;'
Nach dem "exec"-Ding bekomme ich die Ausgabe:
bash: some/path/script.sh arg1 arg2; some/path/script2.sh arg1 arg2;: No such file or directory
Wenn Sie den Befehl jedoch aus der Echo-Ausgabe kopieren und direkt vom Terminal aus ausführen, funktioniert er einwandfrei. Irgendwelche Ideen, warum?
Antwort1
exec
ersetzt die Shell durch ein Programm, das mit den angegebenen Argumenten aufgerufen wird. Die Shell erkennt zwei Token: „exec“ und „some/path/script.sh arg1 arg2; some/path/script2.sh arg1 arg2;“. Das zweite Argument wird als Pfad zu einem auszuführenden Programm interpretiert, einschließlich aller Leerzeichen und Semikolons. Nur eine Shell kann Argumente bei Leerzeichen aufteilen und Befehle durch ein Semikolon trennen. Daher sollten Sie das exec
durch einen Aufruf einer Shell ersetzen, etwa sh -c "$ssh_command"
.
Antwort2
Neinkönnte für Sie nützlich sein.
Versuchen Sie, so etwas über den unten stehenden Link zu integrieren.
ssh -n -f Benutzer@Host "sh -c'cd /wo auch immer; nohup ./was auch immer > /dev/null 2>&1 &'"