サーバーにSSHで接続し、スクリーンセッションを開始して、cd
入って実行しpath/to/my/script/
たい test.sh
と思います。
初心者として私は試しました
ssh [email protected] screen -dm bash -c 'cd path/to/my/script/; pwd > ~/output.txt'
path/to/my/script/
で見ることができると予想しましたが、そこでoutput.txt
私のホームディレクトリを見ました。これはcd
、コマンドが実際には機能しないため、bashが実行されないことを意味しますtest.sh
。
この問題をどのように解決できますか?
ベストアンサー1
短い答え:次のようにコマンドの周りに引用符を追加してください。
ssh [email protected] "screen -dm bash -c 'cd path/to/my/script/; pwd > ~/output.txt'"
何が起こっているかを確認するには、いくつかのデバッグ情報を取得するオプションを指定できます-v
。ssh
この場合、次のような行が表示されます。元のコマンドの場合
debug1: Sending command: screen -dm bash -c cd path/to/my/script/; pwd > ~/output.txt
そして、追加の引用符は次のように変更されます。
debug1: Sending command: screen -dm bash -c 'cd path/to/my/script/; pwd > ~/output.txt'
したがって、sshは渡された引数を取得してすべてを接続し、リモートの末尾でリンクされた引数のリストを別の引数に分割するようです。 Cと同様に、パラメータリストを使用して呼び出すと、argv
元のバージョンでは次の結果が得られます。
argv[0] = ssh
argv[1] = [email protected]
argv[2] = screen
argv[3] = -dm
argv[4] = bash
argv[5] = -c
argv[6] = cd path/to/my/script/; pwd > ~/output.txt
これで原則として、これは別のパラメータとして相手にssh
渡すことができ、その場合は期待どおりに機能する可能性があります。ただし、デバッグ行に見られるように(ソースコードによると同じように見える)、パラメータは文字列で連結されます。argv[2]
argv[6]
screen -dm bash -c cd path/to/my/script/; pwd > ~/output.txt
その後、リモート側で解釈されます。ここで目的のタスクを実行しない理由も明らかです。次に、2つのタスクを順番に実行します。まず、ホームディレクトリでscreen -dm bash -c cd path/to/my/script/
(screen
ディレクトリのみを変更するセッションを開始)、次にpwd > ~/output.txt
ホームディレクトリでも実行します。
完全性のために二重引用符付きのコマンドの引数は次のとおりです。
argv[0] = ssh
argv[1] = [email protected]
argv[2] = screen -dm bash -c 'cd path/to/my/script/; pwd > ~/output.txt'
screen -dm bash -c 'cd path/to/my/script/; pwd > ~/output.txt'
これにより、期待通りに動作するもう一方の端(デバッグラインに示すように)に送信されます。