0

シェル スクリプトを作成していて、サーバーに SSH で接続し、いくつかのアクションを実行してから終了する必要があります。

これを行うには、次のようなコードを使用しています。

ssh -t username@server '
cd uploads/; \
tar -xvzf torrent.tar.gz; \
'

ただし、次のように変数を使用する必要があります。

DIR="uploads/";

ssh -t username@server '
cd $DIR; \
tar -xvzf torrent.tar.gz; \
'

cdSSH接続が確立されるまで明らかに実行されておらず、それまでに$DIR変数がないため、これは機能していないようです(私の推測)。しかし、変数を使用する方法はありますか?

おそらくより良い質問は、SSH 接続が確立された後にアクションを実行するようにスクリプトをレイアウトするより良い方法はありますか? アポストロフィをエスケープして注意する必要があり、ある時点で、実際に SSH 接続内から別のサーバーに SSH 接続しています。これは醜いコードです!

編集: ' の代わりに " を使用すると、変数が機能することを読んでください。しかし、私の質問はまだフォーマットについて立っていますか?

4

3 に答える 3

0

一重引用符 (') の代わりに、二重引用符 (") を使用しないのはなぜですか。$DIR を展開する必要があります。

于 2012-12-18T12:49:27.777 に答える
0

展開を許可するには、二重引用符を使用します。たとえば、これを試してください:

echo "$DIR"

echo '$DIR'

そして結果に注意してください。

これをシェルスクリプトでラップする価値があります:

#!/bin/bash -x
# ...

-x はシェル展開などを出力します。これにより、デバッグが非常に簡単になります。

上記の手段を使用してコマンドをフィードするのではなく、ヒアドキュメントを使用できます。例えば

ssh username@host <<EOF
ls
EOF

リモートホストで「ls」を実行します。

于 2012-12-18T12:49:39.727 に答える
0

私はあなたが書く必要があると思います:

   ssh username@server "( cd $DIR; tar -xvzf torrent.tar.gz; )"

これは接続後に実行する必要があります。そうでない場合は、 "(の代わりに("を使用し、明らかにその後閉じます

于 2012-12-18T12:52:31.653 に答える