Làm thế nào để làm ssh với thời gian chờ trong một kịch bản?


172

Tôi đang thực thi một tập lệnh kết nối thông qua SSH không có mật khẩu trên một máy chủ từ xa. Tôi muốn đặt thời gian chờ, để nếu máy chủ từ xa mất thời gian vô hạn để chạy, tôi muốn ra khỏi phiên ssh đó và tiếp tục các dòng khác trong tập lệnh sh của tôi.

Bất kỳ ý tưởng về làm thế nào để làm điều đó?


Điều này có lẽ nên được đóng lại để phù hợp với việc đóng một bản sao hoàn chỉnh của cách
Murmel

Nếu bạn chuyển hướng ở đây chỉ để "duy trì nhiều thời gian hơn trong sshphiên của bạn " (câu hỏi "Làm thế nào để tăng thời gian kết nối SSH?"), Đây là vị trí sai . Câu trả lời là tại liên kết này về thời gian chờ ssh .
Peter Krauss

Câu trả lời:


287
ssh -o ConnectTimeout=10  <hostName>

Trong đó 10 là thời gian tính bằng giây. Thời gian chờ này chỉ áp dụng cho việc tạo kết nối.


4
ConnectTimeout chỉ đặt thời gian chờ cho thiết lập kết nối, phải không?
Aurélien Ooms

10
Điều này không thực sự hoạt động đối với "máy chủ từ xa đang mất một thời gian vô hạn để chạy": "ssh -o ConnectTimeout = 5 máy chủ 'ngủ 10'" chờ trong 10 giây, chứ không phải 5.
phà

108

Sử dụng -o ConnectTimeout-o BatchMode=yes -o StrictHostKeyChecking=no.

ConnectTimeout giữ cho tập lệnh không bị treo, BatchMode giữ cho tập lệnh không bị treo với Máy chủ không xác định, CÓ để thêm vào know_hosts và StricthostKeyChecking tự động thêm dấu vân tay.

**** LƯU Ý **** "StricthostKeyChecking" chỉ dành cho các mạng nội bộ nơi bạn tin tưởng máy chủ lưu trữ. Tùy thuộc vào phiên bản máy khách SSH, "Bạn có chắc chắn muốn thêm dấu vân tay của mình" có thể khiến máy khách bị treo vô thời hạn (chủ yếu là các phiên bản cũ chạy trên AIX). Hầu hết các phiên bản hiện đại không gặp phải vấn đề này. Nếu bạn phải xử lý dấu vân tay với nhiều máy chủ, tôi khuyên bạn nên duy trì tệp know_hosts bằng một số công cụ quản lý cấu hình như con rối / ansible / đầu bếp / muối / v.v.


11
Không chỉ -o StrictHostKeyChecking=nokhông giải quyết câu hỏi, mà đó còn là một ý tưởng tồi tệ nếu bạn quan tâm đến bảo mật, đó có thể là lý do bạn sử dụng SSH ngay từ đầu.
Dolph

9
Thật tốt khi chỉ ra ý nghĩa bảo mật có thể có của -o StricthostKeyChecking = no. Tuy nhiên, nó sẽ ngăn tập lệnh bị treo trong khi thực thi.
Doug

2
CẢNH BÁO!!!! Như @Dolph đã viết, KHÔNG sử dụng StrictHostKeyChecking=nonếu bạn quan tâm đến bảo mật. @Doug: tập lệnh sẽ không bị treo - nó sẽ chỉ khăng khăng rằng bạn ssh đến máy chủ từ xa lần đầu tiên, vì vậy nó sẽ làm quen với máy chủ. Nhưng nó sẽ bảo vệ bạn trước các cuộc tấn công của MITM. Vui lòng chỉnh sửa câu trả lời này để phản ánh điều này vì đây là một lời khuyên rất nguy hiểm. Và nó thậm chí không được yêu cầu.
johndodo

2
Cập nhật câu trả lời của tôi. Từ kinh nghiệm của tôi, nó có thể khiến một số khách hàng bị treo.
Doug

50

thử cái này:

timeout 5 ssh user@ip

thời gian chờ thực thi lệnh ssh (với args) và gửi SIGTERM nếu ssh không quay lại sau 5 giây. để biết thêm chi tiết về thời gian chờ, hãy đọc tài liệu này http://man7.org/linux/man-pages/man1/timeout.1.html

hoặc bạn có thể sử dụng thông số của ssh:

ssh -o ConnectTimeout=3 user@ip

4
Nếu bạn đang tìm kiếm lệnh này trên máy Mac, hãy thử brew install coreutilsvà sau đó sử dụng gtimeout (nguồn: stackoverflow.com/questions/3504945/timeout-command-on-mac-os-x ).
larcher 7/07/2016

3
Điều này có thể không làm những gì bạn muốn. Xem xét lệnh timeout 3s ssh user@server 'sleep 5; echo blarg >> /tmp/blarg' Điều này sẽ giết quá trình ở phía máy khách SSH, nhưng / tmp / blarg vẫn được sửa đổi trên máy chủ từ xa. Điều này có nghĩa là nếu bạn đang chạy một công việc chuyên sâu về CPU trên máy chủ từ xa, bạn sẽ rò rỉ các quy trình.
Jamie Davis

1
@JamieDavis những gì về người dùng ssh @ server 'hết thời gian 5s ngủ 10'?
FilipR

18

Bạn cũng có thể kết nối với cờ

-o ServerAliveInterval = <giây>
do đó, máy khách SSH sẽ gửi một gói null đến máy chủ mỗi <secs>giây, chỉ để duy trì kết nối. Trong Linux, điều này cũng có thể được đặt trên toàn cầu /etc/ssh/ssh_confighoặc theo người dùng ~/.ssh/config.


4
Nghe có vẻ trái ngược với những gì câu hỏi yêu cầu.
Davor Cubranic

1

Nếu tất cả các lỗi khác (bao gồm cả việc không có timeoutlệnh), khái niệm trong tập lệnh shell này sẽ hoạt động:

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

Chà, bạn có thể sử dụng nohup để chạy bất cứ thứ gì bạn đang chạy trên 'chế độ không chặn'. Vì vậy, bạn chỉ có thể tiếp tục kiểm tra xem bất cứ thứ gì đáng lẽ phải chạy, chạy, nếu không thì thoát ra.

nohup ./my-script-that-may-take-long-to-finish.sh &
./check-if-preingly-script-ran-or-exit.sh
echo "Script đã kết thúc vào ngày 15 tháng 2 năm 2011, 9:20 AM"> /tmp/done.txt

Vì vậy, trong cái thứ hai bạn chỉ cần kiểm tra nếu tập tin tồn tại.


Có ý nghĩa. nhưng, tập lệnh đang chạy cho tôi một số đầu ra, được hiển thị trên bàn điều khiển .. làm thế nào để kiểm tra xem tập lệnh trước của tôi đã chạy hay thoát? $? hay bất cứ điều gì khác?
dùng57421

Vâng, bạn có thể làm cho tập lệnh đó tạo một tập tin khi hoàn tất. Tôi đã thêm nhận xét vào câu trả lời .... grrr
Eduardo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.