SSHを介してリモートサーバーから情報を受信する関数でスクリプトを作成しました。
session_check() {
ssh -o BatchMode=yes $USER@$SERVER my_command | grep "value" > /dev/null
}
計画どおりにアクセスはキーを使用しますが、キーがリモートシステムにロードされない場合は、次の結果が表示されます。
Permission denied (publickey,password)
サーバーへのアクセスに成功したがコマンドが失敗すると、同じ方法で1が返されるため、return 0または1は使用できません。どういうわけか「許可拒否」メッセージを非表示にし、そのようなメッセージが受信されたときにのみ満たされる条件を設定する必要があります。
はっきり書いたことを願っています。よろしくお願いします!
修正する
stderr() の使い方を見出しましたが2>> (grep "value")
、上記の関数とはまだ使用できませんね。したがって、後で使用できるようにstderrをどこかにリダイレクトする必要があります。しかし、どういうわけかサーバー上でコマンドを実行できないようにruseltを取得するには(サーバーに接続できる場合)、通常、単一のコマンドではこれは可能ではないと思います。コマンドを実行する前に、接続が成功したことを確認する必要があります。どう思いますか?
ベストアンサー1
my_command
スクリプトでパイプを使用しているため、終了ステータスを無視しました。パイプラインの終了状態は、パイプラインの最後のコマンドの終了状態になります。
ただし、Bashを使用すると、パイプライン内のすべてのコマンドの終了コードを確認できます。これで、リモートコマンドが常に成功していることを確認するだけです。終了状態を無視したため、新しいエラーは発生しません。
session_check() {
ssh -o BatchMode=yes $USER@$SERVER 'my_command; exit 0' | grep -q "value"
local rc=$?
if [[ ${PIPESTATUS[0]} != 0 ]]; then
return 127
fi
return $rc
}
終了状態も取得するのはmy_command
難しいかもしれません。これにより、2つの別々のコマンドに分けることができます。
session_check() {
status=$(ssh -o BatchMode=yes $USER@$SERVER 'my_command; echo $?') &&
sed '$d' <<<"$status" | grep -q "value"
return $(sed -n '$p' <<<"$status")
}
ssh
コマンドから出力されたテキストの最後の行に終了コードをこっそり引いて、それを繰り返し繰り返す方法に注意してください。これは効率のためにリファクタリングする必要がありますが、少なくとも必要に応じてそれを実装する方法を示しています。
ここではいくつかのBash専用機能を使用しています。スクリプトはshebang#!/bin/bash
ではなくそこにあるはずです。#!/bin/sh
これらのトリックが必要なことは、シェル処理モデルで制御されたエラー処理の観点から実現可能性の端に近づいていることを示しています。おそらく、Pythonのような最新のスクリプト言語でいくつかまたはすべてを書き換えたいと思うかもしれません。