วิธีการทำ ssh กับการหมดเวลาในสคริปต์?


173

ฉันกำลังเรียกใช้สคริปต์ที่เชื่อมต่อผ่าน SSH โดยไม่ใช้รหัสผ่านบนโฮสต์ระยะไกล ฉันต้องการตั้งค่าการหมดเวลาเพื่อให้หากโฮสต์ระยะไกลใช้เวลาไม่ จำกัด ในการทำงานฉันต้องการออกจากเซสชัน ssh นั้นและดำเนินการต่อบรรทัดอื่น ๆ ในสคริปต์ sh ของฉัน

มีความคิดเกี่ยวกับวิธีการทำอย่างไร


นี่ควรจะปิดเพื่อให้สอดคล้องกับการปิดซ้ำที่สมบูรณ์ของวิธีการลดค่าหมดเวลาเชื่อมต่อ ssh [ปิด]
Murmel

หากคุณเปลี่ยนเส้นทางไปที่นี่เท่านั้นที่จะ"อยู่เวลามากขึ้นของคุณในsshเซสชั่น" (คำถาม "วิธีการเพิ่มหมดเวลาการเชื่อมต่อ SSH?") นี้เป็นสถานที่ที่ผิด คำตอบอยู่ที่การเชื่อมโยงนี้เกี่ยวกับ SSH
Peter Krauss

คำตอบ:


288
ssh -o ConnectTimeout=10  <hostName>

โดยที่ 10 คือเวลาเป็นวินาที การหมดเวลานี้ใช้กับการสร้างการเชื่อมต่อเท่านั้น


4
ConnectTimeout ตั้งค่าการหมดเวลาเฉพาะในการตั้งค่าการเชื่อมต่อใช่ไหม
Aurélien Ooms

10
สิ่งนี้ใช้งานไม่ได้สำหรับ "โฮสต์ระยะไกลกำลังใช้เวลาไม่ จำกัด ในการรัน": "ssh -o ConnectTimeout = 5 โฮสต์ 'sleep 10'" รอ 10 วินาทีไม่ใช่ 5
Ferry Boender

109

ใช้และ-o ConnectTimeout-o BatchMode=yes -o StrictHostKeyChecking=no

ConnectTimeoutป้องกันไม่ให้สคริปต์หยุดทำงาน, BatchMode ป้องกันไม่ให้แขวนด้วยโฮสต์ที่ไม่รู้จัก, YES เพื่อเพิ่ม known_hosts และStrictHostKeyCheckingเพิ่มลายนิ้วมือโดยอัตโนมัติ

**** หมายเหตุ **** "StrictHostKeyChecking" มีไว้สำหรับเครือข่ายภายในที่คุณไว้วางใจคุณโฮสต์ ขึ้นอยู่กับเวอร์ชันของไคลเอ็นต์ SSH "คุณแน่ใจหรือไม่ว่าคุณต้องการเพิ่มลายนิ้วมือ" สามารถทำให้ไคลเอ็นต์หยุดทำงานแบบไม่มีกำหนด (ส่วนใหญ่เป็นเวอร์ชันเก่าที่ใช้งานบน AIX) รุ่นที่ทันสมัยที่สุดไม่ประสบปัญหานี้ หากคุณต้องจัดการกับลายนิ้วมือกับโฮสต์หลายตัวฉันขอแนะนำให้รักษาไฟล์ known_hosts ด้วยเครื่องมือจัดการการกำหนดค่าบางอย่างเช่น puppet / ansible / chef / salt / etc


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

หมดเวลาเรียกใช้งานคำสั่ง ssh (พร้อม args) และส่ง SIGTERM หาก ssh ไม่กลับมาหลังจาก 5 วินาที สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการหมดเวลาโปรดอ่านเอกสารนี้: 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 ที่ควบคุมไม่ได้บนเซิร์ฟเวอร์ระยะไกลคุณจะรั่วไหลกระบวนการ
เจมี่เดวิส

1
@JamieDavis เกี่ยวกับผู้ใช้ ssh @ server 'timeout 5s sleep 10' คืออะไร?
FilipR

18

คุณสามารถเชื่อมต่อกับธง

-o ServerAliveInterval = <secs>
ดังนั้นไคลเอ็นต์ SSH จะส่งแพ็คเก็ต null ไปยังเซิร์ฟเวอร์ในแต่ละ<secs>วินาทีเพียงเพื่อให้การเชื่อมต่อยังมีชีวิตอยู่ ใน Linux นี้อาจจะตั้งยังทั่วโลกในหรือต่อผู้ใช้ใน/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-may-take-long-to-finish.sh &
./check-if-previous-script-ran-or-exit.sh
echo "สคริปต์สิ้นสุดในวันที่ 15 กุมภาพันธ์ 2011, 9:20 น."> /tmp/done.txt

ดังนั้นในวินาทีที่สองคุณเพียงแค่ตรวจสอบว่าไฟล์ที่มีอยู่


มีเหตุผล. แต่สคริปต์ที่ทำงานอยู่ให้ฉันออกบางส่วนซึ่งจะปรากฏบนคอนโซล .. วิธีการตรวจสอบว่าสคริปต์ก่อนหน้าของฉันทำงานหรือออกจาก? $? หรืออะไรอย่างอื่น?
user57421

คุณสามารถทำให้สคริปต์นั้นสร้างไฟล์เมื่อเสร็จแล้ว ฉันได้เพิ่มความคิดเห็นในคำตอบ .... grrr
Eduardo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.