私のスクリプトでは、次のようなことを行います。
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
ただし、エコー出力からコマンドをコピーし、ターミナルから直接実行すると、うまく動作します。理由について何かご存知ですか?
答え1
exec
シェルをプログラムに置き換え、指定された引数で呼び出します。シェルは 2 つのトークンを認識します: "exec" と "some/path/script.sh arg1 arg2; some/path/script2.sh arg1 arg2;"。2 番目の引数は、すべてのスペースとセミコロンを含めて、実行するプログラムへのパスとして解釈されます。シェルだけが、引数を空白で分割し、コマンドをセミコロンで区切ることを知っています。したがって、 をexec
のようなシェルの呼び出しに置き換える必要がありますsh -c "$ssh_command"
。
答え2
ノフップあなたにとって役に立つかもしれません。
以下のリンクから、次のようなものを統合してみてください。
ssh -n -f ユーザ@ホスト "sh -c'cd /whereever; nohup ./whatever > /dev/null 2>&1 &'"