스크립트에서 시간 초과로 ssh를 수행하는 방법은 무엇입니까?


173

원격 호스트에서 암호가없는 SSH를 통해 연결하는 스크립트를 실행하고 있습니다. 원격 호스트가 실행하는 데 무한한 시간이 걸리면 해당 ssh 세션에서 나오고 sh 스크립트에서 다른 행을 계속하고 싶습니다. 시간 초과를 설정하고 싶습니다.

그것을하는 방법에 대한 아이디어가 있습니까?


이것은 아마의 전체 중복의 폐쇄와 일치 할 닫아야합니다 SSH 연결 시간 제한 값을 감소하는 방법 [마감]
Murmel

" ssh세션 에서 더 많은 시간을 머 무르십시오 " ( "SSH 연결 시간 초과를 늘리는 방법은 무엇입니까?") 로만 리디렉션 한 경우 이는 잘못된 위치 입니다. 대답은 ssh-timeout에 대한이 링크에 있습니다.
피터 크라우스

답변:


288
ssh -o ConnectTimeout=10  <hostName>

여기서 10은 초 단위의 시간입니다. 이 시간 초과는 연결 생성에만 적용됩니다.


4
ConnectTimeout은 연결 설정에서만 시간 제한을 설정합니다.
Aurélien Ooms

10
"원격 호스트를 실행하는 데 시간이 오래 걸립니다"에는 실제로 작동하지 않습니다. "ssh -o ConnectTimeout = 5 호스트 'sleep 10'"은 5 초가 아닌 10 초 동안 대기합니다.
Ferry Boender

109

-o ConnectTimeout및을 사용하십시오 -o BatchMode=yes -o StrictHostKeyChecking=no.

ConnectTimeout 은 스크립트가 정지되지 않도록하고 BatchMode 는 호스트가 알 수 없음으로 알려진 것을 방지하고 YES는 known_hosts에 추가하고 StrictHostKeyChecking을 유지합니다. 은 지문을 자동으로 추가합니다.

**** 참고 **** "StrictHostKeyChecking"은 호스트를 신뢰하는 내부 네트워크 전용입니다. SSH 클라이언트의 버전에 따라 "지문을 추가 하시겠습니까?"로 인해 클라이언트가 무기한 중단 될 수 있습니다 (주로 AIX에서 실행되는 이전 버전). 대부분의 최신 버전에서는이 문제가 발생하지 않습니다. 여러 호스트의 지문을 처리해야하는 경우 puppet / ansible / chef / salt / etc와 같은 일종의 구성 관리 도구로 known_hosts 파일을 유지하는 것이 좋습니다.


11
-o StrictHostKeyChecking=no이 문제를 해결할 뿐만 아니라 보안에 관심이 있다면 끔찍한 생각입니다. 이는 처음에 SSH를 사용하는 이유 일 수 있습니다.
Dolph

9
-o StrictHostKeyChecking = no의 가능한 보안 영향을 지적하는 것이 좋습니다. 그러나 실행 중에 스크립트가 정지되는 것을 방지합니다.
Doug

2
경고!!!! @Dolph가 썼 듯이 StrictHostKeyChecking=no보안에 관심이 있다면 사용하지 마십시오 . @ Doug : 스크립트가 멈추지 않습니다-처음으로 수동으로 원격 호스트에 ssh해야한다고 주장하므로 호스트를 알게됩니다. 그러나 MITM 공격으로부터 사용자를 보호합니다. 이것은 매우 위험한 조언이므로 반영하기 위해이 답변을 편집하십시오. 그리고 그것은 요구되지 않았습니다.
johndodo

2
내 답변을 업데이트했습니다. 내 경험으로는 일부 클라이언트가 중단 될 수 있습니다.
Doug

50

이 시도:

timeout 5 ssh user@ip

timeout은 ssh 명령 (args 포함)을 실행하고 ssh가 5 초 후에도 반환되지 않으면 SIGTERM을 보냅니다. 시간 초과에 대한 자세한 내용은 다음 문서를 참조하십시오. http://man7.org/linux/man-pages/man1/timeout.1.html

또는 ssh의 매개 변수를 사용할 수 있습니다.

ssh -o ConnectTimeout=3 user@ip

4
당신이 Mac에서이 명령을 찾고 있다면, 시도 brew install coreutils하고 사용 gtimeout (출처 : stackoverflow.com/questions/3504945/timeout-command-on-mac-os-x ).
larcher

3
이것은 당신이 원하는 것을하지 않을 수 있습니다. 명령 고려 timeout 3s ssh user@server 'sleep 5; echo blarg >> /tmp/blarg' 이것은 SSH 클라이언트 측의 프로세스를 종료를하지만, / tmp를 / blarg 여전히 원격 서버에서 수정됩니다. 즉, 원격 서버에서 CPU 사용량이 많은 작업을 실행하면 프로세스가 누출됩니다.
Jamie Davis

1
@JamieDavis ssh user @ server 'timeout 5s sleep 10'은 어떻습니까?
FilipR

18

당신은 또한 플래그와 연결할 수 있습니다

-o ServerAliveInterval = <초>
따라서 SSH 클라이언트는 <secs>연결을 유지하기 위해 매 초 마다 null 패킷을 서버로 보냅니다 . 리눅스에서 이것은 전역으로 /etc/ssh/ssh_config또는 사용자별로 설정할 수도 있습니다 ~/.ssh/config.


4
그것은 질문이 요구하는 것과 반대되는 것처럼 들립니다.
Davor Cubranic

1

timeout명령이 없는 것을 포함하여 다른 모든 방법이 실패하면 이 셸 스크립트의 개념이 작동합니다.

 #!/bin/bash
 set -u
 ssh $1 "sleep 10 ; uptime" > /tmp/outputfile 2>&1 & PIDssh=$!
 Count=0
 while test $Count -lt 5 && ps -p $PIDssh > /dev/null
 do
    echo -n .
    sleep 1
    Count=$((Count+1))
 done
 echo ""

 if ps -p $PIDssh > /dev/null
 then
    echo "ssh still running, killing it"
    kill -HUP $PIDssh
 else
    echo "Exited"
 fi

0

글쎄, 당신은 nohup을 사용하여 '비 차단 모드'에서 실행중인 모든 것을 실행할 수 있습니다. 따라서 실행, 실행 및 종료 해야하는 것이 있으면 계속 확인할 수 있습니다.

nohup ./my-script-that-take-long-to-finish.sh &
./check-if-previous-script-ran-or-exit.sh
echo "스크립트는 2011 년 2 월 15 일 오전 9시 20 분에 종료되었습니다"> /tmp/done.txt

두 번째 파일에서는 파일이 존재하는지 확인합니다.


말이된다. 그러나 실행중인 스크립트는 콘솔에 표시되는 출력을 제공합니다. 이전 스크립트가 실행 또는 종료되었는지 확인하는 방법은 무엇입니까? $? 또는 다른 것?
user57421

글쎄, 그 스크립트가 끝나면 파일을 만들 수 있습니다. 답변에 댓글을 추가했습니다 .... grrr
Eduardo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.