성공할 때까지 ssh 명령을 실행하는 방법은 무엇입니까?


28

때때로 장치를 다시 시작하고 ssh준비가되면 다시 연결 해야합니다 .

명령이 성공할 때까지 5 초마다 ssh 명령을 실행하고 싶습니다.

나의 첫 번째 시도 :

watch -n5 ssh me@device.local && exit 1

어떻게해야합니까?


대화식 SSH 세션을 원하십니까?
아무도

@Nobody 그래, 난 할
필립 Kirkbride

좋아, 나는 내 아이디어가 대화 형으로 작동하지 않을 것이라고 생각했지만 짧은 테스트를 통해 그 결과가 나왔다는 것을 알았습니다. :)
아무도

답변:


30

또 다른 옵션은을 사용하는 것 until입니다.

until ssh me@device.local; do
    sleep 5
done

여러 호스트에 대해이 작업을 반복적으로 수행하는 경우의 기능에 배치하십시오 ~/.bashrc.

repeat()
{
read -p "Enter the hostname or IP of your server :" servername
until ssh $servername; do
    sleep 5
done
}

1
감사합니다. 반복 스크립트를 사용하지만 $프롬프트 대신 :-) 를 사용하겠습니다.
Philip Kirkbride

14
그것은 그 주목할 가치가 ssh연결 외부에 뭔가 스크립트가 재 연결을 시도 할 것으로이 경우 세션을 종료 성공적 경우 연결 한 후 비 제로 상태로 캔 출구. 이것은 바람직한 부작용 일 수도 있고 아닐 수도 있습니다.
Austin Hemmelgarn

17
ssh me@device.local
until !!; do sleep 5 ; done

!!마지막 명령을 반복합니다.


4
쉘 역사를 창의적으로 사용! +1
David Foerster

15

OpenSSH에는 ConnectionAttempts거의 원하는 설정이 있습니다. 기본값은 1이지만 ssh_config명령 줄 에서 또는 명령 줄 에서 변경할 수 있습니다 .

ssh -o 'ConnectionAttempts 10' ...

불행히도 1 초로 고정 된 시도 간격을 조정할 수는 없지만 ConnectTimeout동일한 방식으로 연결 시도 시간 제한 (초)을 조정할 수 있습니다 .


이것은 나를 위해 작동하지 않는 것 같습니다 : /
Freedo

@Freedo : 정확히 무엇을 시도했고 정확히 작동하지 않았는지 설명해 주시겠습니까? 또한 문제 에 대한 새로운 질문작성하는 것이 좋습니다 . 의견의 링크를 통해 관심을 끌 수 있습니다.
David Foerster

14
while ! ssh user@host.example.com true; do
    sleep 5
done; echo "Host is back up at $(date)!"

2
또는 서비스가 시작될 때까지 실제로 로그인하지 않으려면 while ! nc -w5 -z host.example.com 22; do [...].
DopeGhoti

4

autosshssh 세션을 유지합니다. 올바른 매개 변수를 사용하면 현재 연결이 불가능할 때 시작할 수 있으며 성공할 때까지 시도합니다. 이것은 잘 작동하지만 다시 연결 부분이 대화식 세션에서 잘 작동하도록하려면 해당 부분을 결합 screen하거나 이와 동등 해야합니다 .

나는 이것을 추천한다 :

AUTOSSH_POLL=5 AUTOSSH_GATETIME=0 autossh -M 0 -o ServerAliveInterval=5 -o ServerAliveCountMax=1 user@host

그러나 자세한 내용은 해당 매뉴얼 페이지를 참조하십시오. 위의 매개 변수와 함께, autosshSSH마다 시작하려고합니다 AUTOSSH_POLL초, AUTOSSH_GATETIME=0그 첫 번째 시도는 (그래서 확실히 당신이 원하는), 실패하면 다시 시도합니다 -M 0autossh에 의해 비활성화 연결 검사를, 이후의 모든 옵션은 SSH에 전달됩니다. -o연결이 5 초 이상 끊어지면 두 옵션이 ssh를 종료합니다.


2

응답으로 코드를 던질 위험이 있으므로이 스크립트는 매일 작동합니다. 나는 그것을 부르고 ressh간단하게 ressh {hostname}또는 조심스럽게 사용할 수 있습니다 .ressh -S {session_name} {hostname}

#!/bin/bash
#
# Repeatedly attempt to reconnect to a remote ssh server
########################################################################
#
prefix="${0/*\/}"
port=
session=
action=ssh              # How to connect remotely

while getopts 'l:Lp:P:S:' OPT
do
    case "$OPT" in
        l)      [[ s == "$OPTARG" ]] && action=list ;;
        L)      action=list ;;
        [Pp])   port="$OPTARG" ;;
        S)      session="$OPTARG";; ## ; [[ $session =~ ^[0-9]+$ ]] && session="${prefix}-$session" ;;
    esac
done
shift $(($OPTIND - 1))

host="$1"
shift

if [[ -z "$host" ]]
then
    echo "ERROR: Missing hostname" >&2
    exit 1
fi


if [[ list == "$action" ]]
then
    ssh ${port:+-p $port} "$host" "screen -ls"
    exit 0
fi

# Connect repeatedly to the target host system
#
[[ -z "$session" ]] && session="${prefix}-$$.$host"

while :
do
    ssh -tt ${port:+-p $port} "$host" "screen -dr $session || screen -S $session $*"
    ss=$?
    [[ 0 -eq $ss ]] && break

    [[ 255 -eq $ss ]] && sleep 4
    sleep 1
    echo "Reconnecting to session $session on $host..."
done


# All done
#
exit 0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.