Bir komut dosyasında zaman aşımı ile ssh nasıl yapılır?


173

Uzak bir ana bilgisayarda parolasız SSH ile bağlanan bir komut dosyası yürütüyorum. Uzak ana bilgisayar çalıştırmak için sonsuz zaman alıyorsa, bu ssh oturumundan çıkmak ve sh komut dosyamdaki diğer satırlara devam etmek istiyorum, böylece bir zaman aşımı ayarlamak istiyorum.

Nasıl yapılacağı hakkında bir fikrin var mı?



Buraya yalnızca " sshoturumunuzda daha fazla zaman ayırmak " için yönlendirdiyseniz ("SSH Bağlantısı zaman aşımı nasıl artırılır?" Sorusu), burası yanlış yerdir . Cevap bu bağlantıda ssh-timeout ile ilgilidir .
Peter Krauss

Yanıtlar:


288
ssh -o ConnectTimeout=10  <hostName>

Burada 10 saniye cinsinden zamandır. Bu Zaman Aşımı yalnızca bağlantının oluşturulması için geçerlidir.


4
ConnectTimeout yalnızca bağlantı kurulumunda bir zaman aşımı süresi belirler, değil mi?
Aurélien Ooms

10
Bu aslında "uzak ana bilgisayar çalıştırmak için sonsuz zaman alıyor" için işe yaramaz: "ssh -o ConnectTimeout = 5 ana bilgisayar 'uyku 10'" 5 değil, 10 saniye bekler
Ferry Boender

109

Kullanın -o ConnectTimeoutve -o BatchMode=yes -o StrictHostKeyChecking=no.

ConnectTimeout komut dosyasının askıda kalmasını önler , BatchMode ana bilgisayar bilinmeyen ile askıda kalmasını engeller , EVET bilinen_anahtarlara eklemek için EVET ve StrictHostKeyChecking parmak izini otomatik olarak ekler.

**** NOT **** "StrictHostKeyChecking" yalnızca ana bilgisayarlara güvendiğiniz dahili ağlar için tasarlanmıştır. SSH istemcisinin sürümüne bağlı olarak, "Parmak izinizi eklemek istediğinizden emin misiniz?" İstemcinin süresiz olarak askıda kalmasına neden olabilir (esas olarak AIX üzerinde çalışan eski sürümler). Modern sürümlerin çoğu bu sorundan muzdarip değildir. Birden fazla ana bilgisayarla parmak izleri ile uğraşmak zorunda kalırsanız, bilinen_hosts dosyasını kukla / ansible / chef / salt / etc gibi bir tür yapılandırma yönetimi aracıyla korumanızı öneririz.


11
Sadece -o StrictHostKeyChecking=nosoruyu ele almakla kalmaz, aynı zamanda güvenliği önemsiyorsanız, bu da SSH'yi kullanmanızın nedeni olabilir.
Dolph

9
-O StrictHostKeyChecking = no'nun olası güvenlik sonuçlarına işaret etmek iyidir. Ancak, komut dosyasının yürütme sırasında askıda kalmasını önler.
Doug

2
UYARI!!!! @Dolph'un yazdığı gibi, StrictHostKeyChecking=nogüvenliği hiç önemsemiyorsanız KULLANMAYIN . @Doug: script asılmayacak - sadece ilk defa manuel olarak uzak ana bilgisayara ssh ısrar edecek, bu yüzden ana bilgisayarı tanımaya başlar. Ancak sizi MITM saldırılarına karşı koruyacaktır. Lütfen bu cevabı, bunu yansıtmak için çok tehlikeli bir tavsiye olduğu için yansıtın. Ve hatta istenmedi.
johndodo

2
Cevabım güncellendi. Deneyimlerime göre, bazı müşterilerin askıda kalmasına neden olabilir.
Doug

50

bunu dene:

timeout 5 ssh user@ip

timeout ssh komutunu çalıştırır (args ile) ve ssh 5 saniye sonra geri dönmezse SIGTERM gönderir. zaman aşımı hakkında daha fazla bilgi için bu belgeyi okuyun : http://man7.org/linux/man-pages/man1/timeout.1.html

veya ssh parametresini kullanabilirsiniz:

ssh -o ConnectTimeout=3 user@ip

4
Mac'te bu komutu arıyorsanız, brew install coreutilskullanmayı deneyin ve ardından gtimeout (source: stackoverflow.com/questions/3504945/timeout-command-on-mac-os-x ).
larcher

3
Bu istediğinizi yapmayabilir. timeout 3s ssh user@server 'sleep 5; echo blarg >> /tmp/blarg' Bu komutu SSH istemci tarafındaki işlemi öldürür, ancak / tmp / blarg uzak sunucuda yine de değiştirilir. Bu, uzak sunucuda kaçak CPU yoğun bir iş çalıştırıyorsanız, işlemlere sızacağınız anlamına gelir.
Jamie Davis

1
@JamieDavis ssh user @ server 'timeout 5s sleep 10' hakkında ne dersiniz?
FilipR

18

Bayrakla da bağlanabilirsiniz

-o ServerAliveInterval = <secs>
SSH istemcisi <secs>, bağlantıyı canlı tutmak için her saniye sunucuya boş bir paket gönderir . Linux'ta bu, küresel olarak /etc/ssh/ssh_configveya kullanıcı başına da ayarlanabilir ~/.ssh/config.


4
Bu, sorunun ne istediğinin tam tersi gibi görünüyor.
Davor Cubranic

1

Diğer her şey başarısız olursa ( timeoutkomutun olmaması dahil ) bu kabuk betiğindeki kavram çalışır:

 #!/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

Eh, 'engellemeyen modda' çalıştırdığınız her şeyi çalıştırmak için nohup kullanabilirsiniz. Böylece, koşması, koşması veya başka türlü çıkması gerekip gerekmediğini kontrol etmeye devam edebilirsiniz.

nohup ./my-script-that-may-take-long-to-finish.sh &
./check-if-previous-script-ran-or-exit.sh
echo "Script 15 Şubat 2011, 09:20 AM'de sona erdi"> /tmp/done.txt

Yani ikincisinde dosyanın var olup olmadığını kontrol edersiniz.


Mantıklı. ancak, çalışan komut dosyası bana konsolda görüntülenen bazı çıktı verir .. önceki komut dosyası çalıştırıldı veya çıkmak nasıl kontrol edilir? , $? ya da başka bir şey?
user57421

Bu betiğin bittiğinde bir dosya oluşturmasını sağlayabilirsiniz. Cevaba yorum ekledim .... grrr
Eduardo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.