SSH接続をチェックするbashスクリプトを作成するにはどうすればよいですか?


90

リモートマシンにログインして秘密鍵と公開鍵を作成するbashスクリプトを作成中です。

私の問題は、リモートマシンの信頼性が低く、常に稼働しているとは限らないことです。SSH接続が確立されているかどうかを確認するbashスクリプトが必要です。将来使用するために実際にキーを作成する前。


2
通常、実行ssh-keygenしてローカルマシンでssh-copy-idキーペアを生成し、次に公開キーをリモートマシンにコピーします。あなたは違うことをしているようです。なぜ、あなたの目標は何ですか?
ephemient 2009

1
リモートマシンが接続を確立する方法を明らかに変更しているので、moshの展開を検討してください。mosh.mit.edu不安定な接続でSSHを補完することを目的としています。私はそれでとても良い経験をしています。
aeyoun 2013

私はそれが少し遅れを知っているが、それは彼らが鍵となったことを非常に簡単思わ@ephemientないローカルマシンのためか、いないローカルユーザーのために。
放棄されたカート

回答:


176

これは、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のポートの実際の状態に興味があるなら、あなたは置き換えることができgrep openegrep 'open|closed|filtered'

$ nmap host -PN -p ssh | egrep 'open|closed|filtered'

完全にするためだけに。


1
完了するために、どのリターンコードが成功を意味し、どのリターンコードがSSHの失敗を意味するかを示すことができますか?
ヘンリーチウ2015

SSHの試行がそこでハングした場合はどうなるでしょうか。
Sibbs Gambling 2017

2
素晴らしい答えです!ただし、sshダウンしたホストへのアクセスの試行が、たとえば60秒のタイムアウト後にのみ失敗することについては言及していません。これは、一部の使用法では禁止される場合があります。また、ホスト名がで定義されている~/.ssh/config場合、最初のsshアプローチは機能しますが、2番目のnmap方法はFailed to resolve "<hostname>"。で失敗します。
ssc 2017年

2
コマンドについての説明はまったくありません...または実際に何をしているのですか..何$?ですか?など
Toskan

#1のさらにより簡潔な形 ssh -q user@downhost exit | echo $? エコーにパイプ接続結果
philn5d

23

あなたはこのようなものを使うことができます

$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)

ssh接続に問題がない場合、これは「ok」を出力します


22
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

2
1行の出力:(ssh -q -o "BatchMode = yes" -o "ConnectTimeout = 3" user@host.com "echo 2>&1" && echo SSH_OK || echo SSH_NOK)| tail -n1
Xdg 2014

15

@Adrià 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

7

試してみてください:

echo quit | telnet IP 22 2>/dev/null | grep Connected

1
このアプローチの問題は、ssh_configで定義されたホスト(つまり、/ etc / ssh / configまたは〜/ .ssh / config)を認識しないことです
Ding-Yi Chen

1

以下のsshコマンドには、0接続が成功した場合の終了コードと、それ以外の場合はゼロ以外の値が必要です。

ssh -q -o BatchMode=yes user@remote.com exit

if [ $? != "0" ]; then
    echo "Connection failed"
fi

すごい!宛先ポートがフィルタリングされた場合に終了を高速化するために、-o ConnectTimeout = 5も追加することをお勧めします。
ダニエル

0

誰かがリモートマシンでポート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"

0

リモートフォルダが存在すること、または他のファイルを確認したい場合は、実際にテストしてください。

if [ -n "$(ssh "${user}@${server}" [ -d "$folder" ] && echo 1; exit)" ]; then
    # exists
else
    # doesn't exist
fi

の引用符を忘れないでください"$(ssh ...)"


これは質問に答えません。OPは、リモートsshの場所にあるファイルをチェックせずに、SSH接続を確立できるかどうかをチェックしたいと考えています。
RakibFiha19年

0

複数のインターフェースを備えたサーバーに接続するには

ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.61;[ $? = 1 ] || ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.51

0

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

0

https://onpyth.blogspot.com/2019/08/check-ping-connectivity-to-multiple-host.html

上記のリンクは、接続をチェックするためのPythonスクリプトを作成するためのものです。同様の方法を使用して、次を使用できます。

ping -w 1 -c 1 "IP Address" 

bashスクリプトを作成するコマンド。


2
これは、リモートIPにのみpingを実行します。ssh接続が可能かどうかを保証するものではありません。
RJ

ご指摘いただきありがとうございます。sshxlinu.blogspot.com/ 2019/09 /のコードは 次のとおりです。exportuser = "username" export pass = "password" export i = "hostname" export SSHPASS = $ pass sshpass -e ssh $ user @ $ i -q "echo $ iはアクセス可能です"
DheerajKumar19年

-7

ここで間違った問題を解決しようとしているように感じます。sshデーモンをより安定させようとしてはいけませんか?monitのようなものを実行してみてください。デーモンが実行されているかどうかを確認し、実行されていない場合は再起動します(sshdがシャットダウンする背後にある根本的な問題を見つける時間を与えます)。それともネットワークサービスは面倒ですか?見てみてくださいman ifup。Whole Damn Thingはあなたをシャットダウンするのが好きですか?まあ、それはもっと大きな問題です...ログを見て(syslogで始めて)、ハードウェア障害やボックスをシャットダウンしているサービス(おそらく温度モニター?)を見つけてみてください。

スクリプトをフォールトトレラントにすることは素晴らしいことですが、boxenフォールトトレラントにすることもできます。


4
サム:スクリプトにチェックさせるための有効なユースケースがあります。例(私のように):rsyncを介して自宅のNASにデータをバックアップするために自分のマシンでcronジョブを実行しています。今、私は外にいるか、かなり頻繁に切断されており、接続が利用できなかった場合はスケジュールを変更する必要があります。私のボクセンは非常にうまく動作しますが、ことわざにあるように、それは常にケーブル(別名ネットワーク)です
stwissel 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.