ssh
接続されたサーバーを離れることなく、コマンドが成功したかどうかを示す情報を取得する必要があります。
私はこのコマンドを使用します:
ssh -q user1@server1 "echo 2>&1" && echo SSH_OK || echo SSH_NOK
このコマンドの問題は、接続されたサーバーに留まらないことです。コマンドの後に test を追加したくありませんssh
。これまでと同じように、1 つのコマンドで実行したいのです。
これが現在どのように機能するかのサンプルです:
[nir@dhcppc4 ~]$ ssh -q user1@server1 "echo 2>&1" && echo SSH_OK || echo SSH_NOK
SSH_NOK
[nir@dhcppc4 ~]$ hostname
dhcppc4
[nir@dhcppc4 ~]$ ssh -q user1@server2 "echo 2>&1" && echo SSH_OK || echo SSH_NOK
SSH_OK
[nir@dhcppc4 ~]$ hostname
dhcppc4
私が欲しいもののサンプルは次のとおりです。
[nir@dhcppc4 ~]$ ssh -q user1@server1 "echo 2>&1" && echo SSH_OK || echo SSH_NOK
SSH_NOK
[nir@dhcppc4 ~]$ hostname
dhcppc4
[nir@dhcppc4 ~]$ ssh -q user1@server2 "echo 2>&1" && echo SSH_OK || echo SSH_NOK
SSH_OK
[nir@server2 ~]$ hostname
server2
答え1
「SSH_OK」を出力する必要がありますリモートサーバー上ローカルホストでは「SSH_NOK」:
ssh -t -q $host 'echo '"$host"'SSH_OK; exec $SHELL' || echo "$host: SSH_NOK"
しかし、私は John の提案に従って、現在使用しているマシンを示すプロンプトを設定することをお勧めします。これは実際に質問で提案されたことです。すべての追加の印刷が本当に役立つかどうかを再検討したほうがよいかもしれません。
また、正確に何を達成しようとしているのかをもう少し詳しく説明すると、もっと良い方法があるかもしれません。たとえば、出力が解析され、エラーで終了する可能性があるスクリプトを実行している場合、その出力からエラーを検出できる場合は、true
スクリプトの実行後に (またはスクリプトが完全に終了する前に実行される最後のコマンドとして) を追加する必要があります。これにより、セッションが正常に終了し (つまり、終了ステータスがゼロになる)、「echo SSH_NOK」が呼び出されなくなります。
答え2
希望どおりに実行できません。新しいサーバーに留まる場合、サーバーを終了するまで、ステータス エコーを取得するコマンドの部分を実行しません。これが SSH の動作方法です。プロンプトに新しいホスト名が表示された場合、正常に動作し、ターゲット サーバー上にいることがわかります。
答え3
からの出力を処理する必要がありますecho 2>&1
。
例
$ ssh -q skinner "echo 2>&1"
$
私のホストの 1 つである skinner を使用する場合、次の操作を実行します。
$ ssh -q skinnerrr "echo 2>&1 > /dev/null" && echo SSH_OK || echo SSH_NOK
SSH_NOK
$ ssh -q skinner "echo 2>&1 > /dev/null" && echo SSH_OK || echo SSH_NOK
SSH_OK
答え4
最初にリモートサーバーに接続できることを確認し、その後ローカルとリモートでさまざまな操作を実行したい場合、次のことをお勧めします。
- リモート接続を確立します(閉じないでください)。
- 自分の仕事をやりなさい。
リモート接続を確立するには、マスター セッションを実行します。次に、リモート操作を実行するには、既存の接続にピギーバックします。スレーブ接続は既存の TCP ストリームを使用するため、追加の認証は不要です。したがって、ネットワークまたはリモート ホストがダウンした場合を除いて、スレーブ接続は成功します (確立も高速です)。
ssh_control=$(mktemp -d)/ssh.control
ssh -M -o ControlMaster=yes -o ControlPath="$ssh_control" -n user1@server1
if [ $? -eq 0 ]; then
do_some_local_stuff
ssh -o ControlMaster=yes -o ControlPath="$ssh_control" -n user1@server1
do_some_more_local_stuff
if ! ssh -O check -o ControlMaster=yes -o ControlPath="$ssh_control" -n user1@server1; then
echo 'Uh-oh! The SSH connection died abruptly.'
fi
fi
ssh -O exit -o ControlMaster=yes -o ControlPath="$ssh_control" -n user1@server1
rm "$ssh_control"
rmdir "${ssh_control%/*}"