ssh
接続されたサーバーを離れずにコマンドが成功したかどうかを表示する必要があります。
私は次のコマンドを使用します。
ssh -q user1@server1 "echo 2>&1" && echo SSH_OK || echo SSH_NOK
このコマンドの問題は、接続サーバーにとどまらないことです。ssh
コマンドの後にテストを追加したくなく、これまでに行ったことをコマンドで実行したいと思います。
ここでの仕組みの例は次のとおりです。
[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」を出力する必要があります。リモートサーバーからそしてlocalhostの「SSH_NOK」:
ssh -t -q $host 'echo '"$host"'SSH_OK; exec $SHELL' || echo "$host: SSH_NOK"
しかし、私は現在使用中のコンピュータを示すプロンプトを設定するようにJohnの提案に固執します。これは実際にあなたの質問で提案したものです。追加の印刷が本当に役に立つかどうかをもう一度考えてみたいかもしれません。
また、正確に達成することが何であるかを詳細に説明したいかもしれません。より良い方法があるかもしれません。たとえば、出力が解析され、エラーで終わる可能性があるが出力で検出できるスクリプトを実行する場合は、スクリプトの実行true
後(またはスクリプトの前に実行された最後のコマンドとして)それを追加する必要があります。セッションが正常に終了し(つまり、終了ステータスが0)、「echo SSH_NOK」が呼び出されないことを確認します。
答え2
あなたが望むものは達成できません。新しいサーバーに滞在している場合、状態エコーを取得するコマンド部分はサーバーをシャットダウンする前に実行されません。これがSSHがどのように機能するかです。プロンプトに新しいホスト名が表示されると、そのホスト名が有効でターゲットサーバーに存在することがわかります。
答え3
あなたはそれを処理する必要がありますecho 2>&1
。
はい
$ ssh -q skinner "echo 2>&1"
$
ホストスキナーの1つで行うことは次のとおりです。
$ 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%/*}"