SSH接続を確認するbashスクリプトを作成する方法は?
-
05-07-2019 - |
質問
リモートマシンにログインして秘密鍵と公開鍵を作成するbashスクリプトを作成中です。
私の問題は、リモートマシンの信頼性があまり高くなく、常に稼働しているわけではないことです。 SSH接続が確立されているかどうかを確認するbashスクリプトが必要です。将来使用するためにキーを実際に作成する前。
解決
sshが提供する戻り値でこれを確認できます:
$ ssh -q user@downhost exit
$ echo $?
255
$ ssh -q user@uphost exit
$ echo $?
0
編集:別のアプローチはnmapを使用することです(キーやログインスタッフは必要ありません):
$ a=`nmap uphost -PN -p ssh | grep open`
$ b=`nmap downhost -PN -p ssh | grep open`
$ echo $a
22/tcp open ssh
$ echo $b
(empty string)
ただし、メッセージをgrepする必要があります(nmapは、ポートがフィルターされているか、閉じているか、開いているかを示すために戻り値を使用しません)。
EDIT2:
ssh-portの実際の状態に関心がある場合は、 grep open
を egrep 'open | closed | filtered'
に置き換えることができます:
$ nmap host -PN -p ssh | egrep 'open|closed|filtered'
完了しました。
他のヒント
ssh -q -o "BatchMode=yes" -i /home/sicmapp/.ssh/id_rsa <ID>@<Servername>.<domain> "echo 2>&1" && echo $host SSH_OK || echo $host SSH_NOK
このようなものを使用できます
$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)
これは&quot; ok&quot;を出力します。 ssh接続に問題がない場合
@ Adri&#224;の応答を補完するCidre
できること:
status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)
if [[ $status == ok ]] ; then
echo auth ok, do something
elif [[ $status == "Permission denied"* ]] ; then
echo no_auth
else
echo other_error
fi
試してください:
echo quit | telnet IP 22 2>/dev/null | grep Connected
誰かがリモートマシンでポート22が開いているかどうかだけをチェックしたい場合、この単純なnetcatコマンドは便利です。 nmapとtelnetが利用できないため、私はそれを使用しました。さらに、私のssh設定はキーボードパスワード認証を使用します。
これは、GUESSWHOzによって提案されたソリューションの変形です。
nc -q 0 -w 1 "${remote_ip}" 22 < /dev/null &> /dev/null && echo "Port is reachable" || echo "Port is unreachable"
リモートフォルダーの存在を確認する場合、または実際に他のファイルテストを実行する場合:
if [ -n "$(ssh "${user}@${server}" [ -d "$folder" ] && echo 1; exit)" ]; then
# exists
else
# doesn't exist
fi
&quot; $(ssh ...)&quot;
の引用符を忘れないでください。
複数のインターフェースでサーバーに接続するには
ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.61;[ $? = 1 ] || ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.51
BASH 4+スクリプトを使用した例:
# -- ip/host and res which is result of nmap (note must have nmap installed)
ip="192.168.0.1"
res=$(nmap ${ip} -PN -p ssh | grep open)
# -- if result contains open, we can reach ssh else assume failure) --
if [[ "${res}" =~ "open" ]] ;then
echo "It's Open! Let's SSH to it.."
else
echo "The host ${ip} is not accessible!"
fi
ここで間違った問題を解決しようとしているように感じます。 sshデーモンをより安定させようとするべきではありませんか? monit のようなものを実行してみてください。デーモンが実行されているかどうかを確認し、実行されていない場合は再起動します。 t(sshdがシャットダウンする背後にある根本的な問題を見つける時間を与えます)。または、ネットワークサービスは面倒ですか? man ifup
を見てください。 Whole Damn Thingはあなたをシャットダウンするのが好きですか?まあ、それはより大きな問題です...ログを見て(syslogで開始)、ハードウェア障害またはサービスを停止しているハードウェア(温度モニターですか?)を見つけてみてください。
スクリプトをフォールトトレラントにすることは素晴らしいことですが、ボックスをフォールトトレラントにすることもできます。