web-dev-qa-db-ja.com

シェルスクリプト:リモートマシンに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 argumentdate: Undefined variable.が表示されます

2
Marius Hofert

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

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
7
R J

できるよ

$ssh user@comp echo abc<ENTER>

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

1
barlop

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の問題が修正されます。また、最後に出口は不要です。最後のコマンドが実行されると、sshセッションは自動的に閉じられます。

1
Ctark

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

終了後に空行がない場合(正確にはLF-改行文字)、スクリプトはプログラムで「Enterキーを押し」ません。

1
Kamil