web-dev-qa-db-ja.com

スクリプトでタイムアウトを設定してsshを実行する方法は?

リモートホストでパスワードなしのSSH経由で接続するスクリプトを実行しています。タイムアウトを設定したいので、リモートホストの実行に無限の時間がかかっている場合は、そのsshセッションから出て、shスクリプト内の他の行を続行します。

それを行う方法についてのアイデアはありますか?

141
user57421
ssh -o ConnectTimeout=10  <hostName>

10は秒単位の時間です。

241
user57421

-o ConnectTimeoutおよび-o BatchMode=yes -o StrictHostKeyChecking=noを使用します。

ConnectTimeoutはスクリプトのハングを防ぎ、BatchModeはホストとのハングを防ぎますunknown、YESをknown_hostsに追加し、StrictHostKeyCheckingは指紋を自動的に追加します。

****注****「StrictHostKeyChecking」は、ホストを信頼する内部ネットワークのみを対象としています。 SSHクライアントのバージョンによっては、「指紋を追加してもよろしいですか」により、クライアントが無期限にハングすることがあります(主にAIXで実行されている古いバージョン)。最新のバージョンのほとんどは、この問題の影響を受けません。複数のホストで指紋を処理する必要がある場合は、puppet/ansible/chef/salt/etcなどの何らかの構成管理ツールでknown_hostsファイルを維持することをお勧めします。

99
Doug

これを試して:

timeout 5 ssh user@ip

timeoutは、sshコマンド(引数付き)を実行し、sshが5秒後に返らない場合にSIGTERMを送信します。タイムアウトの詳細については、このドキュメントをお読みください。 http://man7.org/linux/man-pages/man1/timeout.1.html

または、sshのパラメーターを使用できます。

ssh -o ConnectTimeout=3 user@ip
40
Lee HoYo

他のすべてが失敗した場合(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
Philip Kearns

まあ、Nohupを使用して、「ノンブロッキングモード」で実行しているものを実行できます。したがって、実行、実行、または終了するはずだったものをチェックし続けることができます。

 Nohup ./my-script-that-may-take-long-to-finish.sh&
 ./ check-if-previous-script-ran-or-exit.sh 
 
 echo「スクリプトは2011年2月15日9:20 AMに終了しました」> /tmp/done.txt

2番目のファイルでは、ファイルが存在するかどうかを確認するだけです。

0
Eduardo