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

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

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



답변

ssh -o ConnectTimeout=10  <hostName>

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


답변

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

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

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


답변

이 시도:

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


답변

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

-o ServerAliveInterval = <초>

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


답변

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


답변

글쎄, 당신은 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

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


답변