シェル スクリプト: リモート マシンに ssh して終了: 'exit' は機能しません

シェル スクリプト: リモート マシンに ssh して終了: 'exit' は機能しません

次のようなタイプのシェル スクリプトがあります。

#!/bin/bash

ssh [email protected]
echo "Hi"
exit

リモートサーバーで何かを行うためにローカルで実行します(「echo "Hi"」で表されます)。しかし、実行すると、リモートサーバーにプロンプ​​トが表示されるため、「exit」コマンドは実行されません。次に、リモートプロンプトで手動で「exit」と入力すると、「myremotemachine.comへの接続」が閉じられ、それから 「こんにちは」。シェル スクリプトを正しく終了し、実行した (ローカル) プロンプトが表示されるように設定するにはどうすればよいですか?

https://unix.stackexchange.com/questions/89747/ssh-exits-after-quit-case-in-bash-scriptそしてssh および ssh 経由のシェル: 終了方法は?多少関連があるように思えますが、そこに提示されたアイデアを適応させることはできませんでした。

アップデート

次の、それほどミニマルではないバージョンは につながりますUnmatched '.

#!/bin/bash

date=`date "+%Y-%m-%d"`
rsync -acxzP --delete --link-dest=/u3/mylogin/backup/old_backup /home/mylogin [email protected]:/u3/mylogin/backup/$date\_backup
ssh [email protected] bash -c "'
rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup
exit
'"

このスニペットの二重引用符を削除すると、bash: -c: option requires an argument次のようになります。date: Undefined variable.

答え1

これで問題は解決するはずです。

ssh [email protected] << HERE
rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup
HERE

または、次のようにすることもできます。リモートホストで実行したいコマンドをすべて別のスクリプトに記述します。remote.shのような名前を付けます。

次のコマンドを実行します

ssh [email protected] 'bash -s' < /path/to/remote.sh

remote.sh が含まれる場所。

rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup

答え2

できるよ

$ssh user@comp echo abc<ENTER>

その後、そのコマンドを実行し(abcを出力)、終了します。

答え3

スクリプトの最後に改行がないのではないでしょうか?

LF終了の後に空行 (正確には改行文字)がない場合、スクリプトはプログラム的に「Enter キーを押さない」ことになります。

答え4

barlops の回答は正しいですが、より明確にするために、さらに詳しく説明できると思います。スクリプトを使用しているようなので、次のようなものを提案します。

#!/bin/bash

ssh [email protected] "echo Hi\!"

追加の参考資料: また、特殊文字と、それらをエスケープする必要がある場合についても調べることをお勧めします。bash は、二重引用符で囲まれた感嘆符を自動的に解析します。これを解決するには、一重引用符を使用するか、バックスラッシュ文字を使用して「エスケープ」します。

編集:

#!/bin/bash
date=`date "+%Y-%m-%d"`
rsync -acxzP --delete --link-dest=/u3/mylogin/backup/old_backup /home/mylogin [email protected]:/u3/mylogin/backup/$date\_backup
ssh [email protected] '
date=`date "+%Y-%m-%d"`
rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup
'

簡易版を試したところ、日付変数は問題なく動作しました。これで、発生していた bash -c の問題が解決されるかもしれません。また、最後に exit は不要です。最後のコマンドが実行されると、ssh セッションは自動的に閉じられます。

関連情報