スクリプトでタイムアウトを使用してSSHを実行する方法


173

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

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



ここでsshセッションの滞在時間を増やす」だけにリダイレクトした場合(質問「SSH接続タイムアウトを増やす方法」)、これは間違った場所です。答えはssh-timeoutに関するこのリンクにあります
Peter Krauss

回答:


288
ssh -o ConnectTimeout=10  <hostName>

10は秒単位の時間です。このタイムアウトは、接続の作成にのみ適用されます。


4
ConnectTimeoutは、接続セットアップでタイムアウトを設定するだけですよね?
オーレリアンOoms

10
これは実際には「リモートホストの実行に無限の時間がかかる」場合には機能しません。「ssh -o ConnectTimeout = 5 host 'sleep 10'」は5秒ではなく10秒待機します
Ferry Boender

109

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

ConnectTimeoutはスクリプトがハングするのを防ぎBatchModeはHost unknownでハングするのを防ぎます。YESがknown_hostsに追加され、StrictHostKeyCheckingがフィンガープリントを自動的に追加します。

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


11
-o StrictHostKeyChecking=no質問に対応しないだけでなく、セキュリティを重視するのはひどい考えです。そもそもそれがSSHを使用している理由かもしれません。
2015年

9
-o StrictHostKeyChecking = noの潜在的なセキュリティへの影響を指摘するのは良いことです。ただし、スクリプトが実行中にハングするのを防ぎます。
Doug

2
警告!!!!@Dolphが書いたように、StrictHostKeyChecking=noセキュリティを気にする場合は使用しないでください。@Doug:スクリプトはハングしません-初めて手動でリモートホストにsshすることを要求するだけなので、ホストを知ることができます。しかし、それはMITM攻撃からあなたを守ります。現状では非常に危険なアドバイスなので、この回答を編集してこれを反映してください。そして、それも要求されませんでした。
johndodo

2
私の答えを更新しました。私の経験では、一部のクライアントがハングする可能性があります。
ダグ

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でこのコマンドを探している場合は、 (source:stackoverflow.com/questions/3504945/timeout-command-on-mac-os-x)を試しbrew install coreutilsてから使用してください。gtimeout
ラーチャー、2016

3
これはあなたが望むことをしないかもしれません。次のコマンドを検討してください。timeout 3s ssh user@server 'sleep 5; echo blarg >> /tmp/blarg' これにより、SSHクライアント側のプロセスが強制終了されますが、リモートサーバーでは/ tmp / blargが引き続き変更されます。つまり、リモートサーバーでCPUを集中的に使用する暴走ジョブを実行している場合、プロセスがリークします。
ジェイミーデイビス

1
@JamieDavis ssh user @ server 'timeout 5s sleep 10'はどうですか?
FilipR 2018

18

フラグと接続することもできます

-o ServerAliveInterval = <秒>
そのため、SSHクライアントは<secs>、接続を維持するために、毎秒nullパケットをサーバーに送信します。Linuxでは、これはでグローバルに、/etc/ssh/ssh_configまたはユーザーごとに設定することもできます~/.ssh/config


4
それは質問が要求するものの反対のように聞こえます。
Davor Cubranic 2018

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-may-take-long-to-finish.sh&
./check-if-previous-script-ran-or-exit.sh
echo "スクリプトは2011年2月15日午前9:20に終了しました"> /tmp/done.txt

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


理にかなっています。しかし、実行中のスクリプトは、コンソールに表示される出力をいくつか提供します。前のスクリプトが実行されたか終了したかを確認する方法は?$?または他に何か?
user57421

完了したら、そのスクリプトでファイルを作成できます。回答にコメントを追加しました... grrr
Eduardo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.