web-dev-qa-db-ja.com

SSH接続を確認するbashスクリプトを作成する方法は?

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

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

72
chutsu

戻り値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 with egrep 'open|closed|filtered'

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

完了するだけです。

138
user156676
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
20
Brian Ott

このようなものを使用できます

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

Ssh接続が正常であれば、これは「ok」を出力します

15
Adrià Cidre

@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
9
iarroyo

試してください:

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

リモートフォルダが存在するか、または他のファイルテストが本当にあるかを確認したい場合:

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

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

0
Sheljohn

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
Mike Q

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

上記のリンクは、Python接続を確認するためのスクリプトを作成することです。同様の方法を使用して使用できます。

ping -w 1 -c 1 "IP Address" 

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

0
Dheeraj Kumar

複数のインターフェイスでサーバーに接続するには

ssh -o ConnectTimeout=1 -q [email protected];[ $? = 1 ] || ssh -o ConnectTimeout=1 -q [email protected]
0
Necktwi

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