GNU/Linux >> Linux の 問題 >  >> Linux

SSH サーバーが起動するのを待つ Linux コマンド

解決策 1:

SSH で接続して、稼働しているかどうかを制御できるホストがありませんが、これは機能するはずです:

while ! ssh <ip>
do
    echo "Trying again..."
done

または、より明示的なシェル スクリプト:

#!/bin/sh

ssh $1
while test $? -gt 0
do
   sleep 5 # highly recommended - if it's in your local network, it can try an awful lot pretty quick...
   echo "Trying again..."
   ssh $1
done

(たとえば) waitforssh.sh として保存します。 sh waitforssh.sh 192.168.2.38 で呼び出します

解決策 2:

次のような単純な方法で、5 秒待機してから STDERR を破棄するという単純な処理が行われます

until ssh <host> 2> /dev/null
  do
    sleep 5
  done

解決策 3:

function hurryup () { 
    until ssh -o ConnectTimeout=2 "$1"@"$2"
        do sleep 1
    done
}
hurryup root "10.10.0.3"

-o ConnectTimeout=2 ssh: connect to host 10.10.0.3 port 22: Operation timed out を報告して、ネットワーク パケットに応答しないことを回避する少しハックな方法です。 反応するまで。

次に、ホストがネットワーク パケットに応答すると、ssh: connect to host 10.10.0.3 port 22: Connection refused の間に 1 秒間のスリープが発生します。 ssh が起動するのを待ちます。

解決策 4:

これは私が使用している「ping_ssh」スクリプトです。タイムアウトのケース、迅速な成功を処理し、パスワードのプロンプトを表示したり、「nc」ベースのソリューションのようにポートが開いていても応答しないことにだまされたりしません。これは、さまざまなスタックオーバーフロー関連サイトにあるいくつかの回答を組み合わせたものです。

#!/usr/bin/bash
HOST=$1
PORT=$2
#HOST="localhost"
#PORT=8022
if [ -z "$1" ]
  then
    echo "Missing argument for host."
    exit 1 
fi

if [ -z "$2" ]
  then
    echo "Missing argument for port."
    exit 1 
fi
echo "polling to see that host is up and ready"
RESULT=1 # 0 upon success
TIMEOUT=30 # number of iterations (5 minutes?)
while :; do 
    echo "waiting for server ping ..."
    # https://serverfault.com/questions/152795/linux-command-to-wait-for-a-ssh-server-to-be-up
    # https://unix.stackexchange.com/questions/6809/how-can-i-check-that-a-remote-computer-is-online-for-ssh-script-access
    # https://stackoverflow.com/questions/1405324/how-to-create-a-bash-script-to-check-the-ssh-connection
    status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 ${HOST} -p ${PORT} echo ok 2>&1)
    RESULT=$?
    if [ $RESULT -eq 0 ]; then
        # this is not really expected unless a key lets you log in
        echo "connected ok"
        break
    fi
    if [ $RESULT -eq 255 ]; then
        # connection refused also gets you here
        if [[ $status == *"Permission denied"* ]] ; then
            # permission denied indicates the ssh link is okay
            echo "server response found"
            break
        fi
    fi
    TIMEOUT=$((TIMEOUT-1))
    if [ $TIMEOUT -eq 0 ]; then
        echo "timed out"
        # error for jenkins to see
        exit 1 
    fi
    sleep 10
done

Linux
  1. Linuxコマンドラインに関する8つのヒント

  2. Linuxユーザー向けの12のIPコマンド例

  3. 初心者向けのLinuxkillallコマンド(8例)

  1. LinuxのWコマンド

  2. Linuxのコマンドで

  3. 初心者向けのLinuxdirコマンド(10例)

  1. 初心者向けのLinuxrmコマンドの説明(8例)

  2. 初心者向けのLinuxlnコマンドチュートリアル(5つの例)

  3. 初心者向けのLinuxnlコマンドチュートリアル(7つの例)