2011-02-08 39 views
113

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

Bất kỳ ý tưởng nào về cách thực hiện?

+0

này có lẽ nên được đóng lại để phù hợp với việc đóng cửa một bản sao hoàn chỉnh của này [làm thế nào để giảm giá trị thời gian chờ kết nối ssh \ [đóng \]] (https://stackoverflow.com/questions/18389367/how-to-decrease-ssh-connection-timeout-value) – Murmel

+0

Nếu bạn chuyển hướng ở đây chỉ để * " ở lại nhiều thời gian hơn trong phiên 'ssh' của bạn" * (câu hỏi "Làm thế nào để tăng thời gian chờ kết nối SSH?"), đây là ** địa điểm sai **. Câu trả lời là tại [liên kết này về ssh-timeout] (https://bjornjohansen.no/ssh-timeout). –

Trả lời

190
ssh -o ConnectTimeout=10 <hostName> 

Trong trường hợp 10 là thời gian tính bằng giây.

+4

ConnectTimeout chỉ đặt thời gian chờ trên thiết lập kết nối, phải không? –

+0

Có .___________ – johndodo

+4

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

-8

thế nào về cách sử dụng lệnh này trong vòng lặp

set timeout -1 
+0

Bạn có thể cho tôi biết thêm thông tin về cách đặt thời gian chờ nếu tôi sử dụng trong vòng lặp hay không .. tập lệnh thực thi trên máy chủ từ xa – user57421

0

Vâng, bạn có thể sử dụng nohup để chạy bất cứ điều gì bạn đang chạy trên 'chế độ non-blocking'. Vì vậy, bạn chỉ có thể tiếp tục kiểm tra nếu nó được cho là chạy, chạy, nếu không thoát.

 
nohup ./my-script-that-may-take-long-to-finish.sh & 
./check-if-previous-script-ran-or-exit.sh 
 

echo "Script ended on Feb 15, 2011, 9:20AM" > /tmp/done.txt 

Vì vậy, trong một giây bạn chỉ cần kiểm tra nếu tập tin tồn tại.

+0

Làm cho tinh thần. nhưng, kịch bản đ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 kịch bản trước của tôi đã chạy hay thoát? $? hoặc bất cứ điều gì khác? – user57421

+0

Bạn cũng có thể làm cho tập lệnh đó tạo tệp khi hoàn tất. Tôi đã thêm nhận xét vào câu trả lời .... grrr – Eduardo

84

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

ConnectTimeout giữ kịch bản từ treo, BatchMode giữ cho nó khỏi treo với Host không rõ, YES để thêm vào known_hosts, và StrictHostKeyChecking thêm dấu vân tay tự động.

**** LƯU Ý **** "StrictHostKeyChecking" chỉ dành cho các mạng nội bộ nơi bạn tin tưởng bạn lưu trữ. Tùy thuộc vào phiên bản của máy khách SSH, "Bạn có chắc chắn muốn thêm vân tay của mình" có thể khiến khách hàng 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 bị vấn đề này. Nếu bạn phải đối phó với dấu vân tay với nhiều máy chủ, tôi khuyên bạn nên duy trì tệp known_hosts với một số loại công cụ quản lý cấu hình như con rối/ansible/đầu bếp/muối/v.v.

+8

Không chỉ '-o StrictHostKeyChecking = no' không giải quyết câu hỏi, nhưng đó 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 đang sử dụng SSH ngay từ đầu. – Dolph

+4

Tốt nhất là chỉ ra các tác động bảo mật có thể xảy ra của -o StrictHostKeyChecking = no. Tuy nhiên, nó sẽ ngăn chặn các kịch bản từ treo trong khi thực hiện. – Doug

+1

CẢNH BÁO !!!! Như @Dolph đã viết, KHÔNG sử dụng 'StrictHostKeyChecking = no' nếu bạn quan tâm đến bảo mật. @ Doug: kịch bản sẽ không treo - nó sẽ chỉ nhấn mạnh rằng bạn ssh đến máy chủ từ xa bằng tay lần đầu tiên, vì vậy nó được biết máy chủ. Nhưng nó sẽ bảo vệ bạn khỏi 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ì nó là một lời khuyên rất nguy hiểm khi nó đứng. Và nó thậm chí không được yêu cầu. – johndodo

13

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

-o ServerAliveInterval=<secs>
để máy khách SSH sẽ gửi gói rỗng tới máy chủ mỗi <secs> giây, chỉ để giữ kết nối còn sống. Trong Linux, điều này cũng có thể được đặt trên toàn cầu ở /etc/ssh/ssh_config hoặc cho mỗi người dùng trong ~/.ssh/config.

+1

Điều đó nghe có vẻ ngược lại với những gì câu hỏi yêu cầu. –

29

thử điều này:

timeout 5 ssh [email protected] 

thời gian chờ thực thi lệnh ssh (với args) và gửi một SIGTERM nếu ssh không trả lại sau 5 giây. để biết thêm chi tiết về thời gian chờ, đọ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 param của ssh:

ssh -o ConnectTimeout=3 [email protected] 
+2

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

+0

Điều này có thể không làm những gì bạn muốn. Hãy xem xét lệnh 'timeout 3s ssh user @ server 'sleep 5; echo blarg >>/tmp/blarg'' Điều này sẽ giết chế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 rằng nếu bạn đang chạy một công việc tốn nhiều CPU chạy trốn trên máy chủ từ xa, bạn sẽ bị rò rỉ các quy trình. –

Các vấn đề liên quan