1

私はこのスクリプトを持っています:

ssh -T user@$123.456.789.123 <<EOF

    cd www

    var=$(tail index.htm)

    echo $var

EOF

私がすべきだと思ったのは:

  1. SSH経由でサーバーに接続し、
  2. 次に、フォルダーwwwに変更し、
  3. 次に、index.htmの末尾を変数varに格納します。
  4. そして最後に結果をエコーし​​ます。

代わりに、フォルダーの変更前にtailが実行されているように見えるため、 index.htmファイルが見つかりません。

さまざまなコマンドを試してみましたが、変数に保存しようとしているコマンド置換の結果が、SSH接続が開かれた直後、他のスクリプトの前に実行されるように見えるたびに。

ここで何が欠けていますか?

4

3 に答える 3

3

$(...)、ヒア ドキュメントのコンテンツが に渡される前に、ローカルに展開されていますssh。リテラル テキストをリモート サーバーに送信するには、ヒア ドキュメント区切り文字を引用します。

ssh -T user@$123.456.789.123 <<'EOF'
    cd www
    var=$(tail index.htm)
    echo "$var"
EOF

$var(また、シェルから埋め込まれたスペースを保護するために の拡張を引用します。)

于 2013-10-16T18:17:06.733 に答える
2

tail、リモート ホストではなく、ローカル マシンの bash スクリプトで実行されています。コマンドを実行する前に、置換が行われますssh

スクリプトは次のように簡単に置き換えることができます。

ssh -T user@$123.456.789.123 tail www/index.htm
于 2013-10-16T18:16:19.163 に答える
2

これらのコマンドをリモートサーバーに送信したい場合は、次のように書くことができます

ssh -T user@$123.456.789.123 'cd www && var=$(tail index.htm) && echo $var'

前の結果に基づいて次のコマンドを調整すると、SSH は意味のある戻りコードを返すことができることに注意してください。ヒアドキュメントでは、何が起こっても (tail失敗など)、失敗しないため、SSH は $?=0 を返しますecho

別のオプションは、そこでスクリプトを作成し、ssh で起動することです。

于 2013-10-16T18:23:40.323 に答える