2009-09-10 29 views
46

Tôi đang trong quá trình tạo tập lệnh bash để đăng nhập vào các máy từ xa và tạo khóa riêng tư và công khai.Cách tạo tập lệnh bash để kiểm tra kết nối SSH?

Vấn đề của tôi là các máy từ xa không phải là rất đáng tin cậy, và chúng không phải lúc nào cũng lên. Tôi cần một kịch bản bash mà sẽ kiểm tra xem kết nối SSH là lên. Trước khi thực sự tạo ra chìa khóa để sử dụng trong tương lai.

+2

Thông thường, người ta chạy 'ssh-keygen' để tạo một cặp khóa trên máy cục bộ, sau đó' ssh-copy-id' để sao chép khóa công khai sang các máy từ xa. Có vẻ như bạn đang làm những việc khác nhau. Tại sao, mục tiêu của bạn là gì? – ephemient

+1

Vì bạn rõ ràng đang thay đổi cách các máy từ xa thiết lập kết nối, hãy xem xét triển khai * mosh *. http://mosh.mit.edu/ Nó được thiết kế để bổ sung SSH vào các kết nối không ổn định. Tôi có kinh nghiệm rất tốt với nó. – Aeyoun

Trả lời

92

Bạn có thể kiểm tra điều này với ssh trở lại giá trị mang đến cho bạn:

$ ssh -q [email protected] exit 
$ echo $? 
255 

$ ssh -q [email protected] exit 
$ echo $? 
0 

EDIT: cách tiếp cận khác sẽ được sử dụng nmap (bạn sẽ không cần phải có chìa khóa hoặc đăng nhập-công cụ):

$ a=`nmap uphost -PN -p ssh | grep open` 
$ b=`nmap downhost -PN -p ssh | grep open` 

$ echo $a 
22/tcp open ssh 
$ echo $b 
(empty string) 

Nhưng bạn sẽ phải grep thông báo (nmap không sử dụng giá trị trả về để hiển thị nếu cổng được lọc, đóng hoặc mở).

EDIT2:

Nếu bạn quan tâm đến tình trạng thực tế của ssh-cổng, bạn có thể thay thế grep open với egrep 'open|closed|filtered':

$ nmap host -PN -p ssh | egrep 'open|closed|filtered' 

Chỉ cần được hoàn tất.

+0

Để hoàn tất, bạn có thể chỉ ra mã trả về nào có nghĩa là thành công và điều đó có nghĩa là lỗi SSH không? –

+0

Tự hỏi điều gì sẽ xảy ra nếu nỗ lực SSH bị treo ở đó? –

+1

Câu trả lời hay! Tuy nhiên, bạn không đề cập đến việc cố gắng 'ssh' thành một máy chủ lưu trữ không thành công chỉ sau một thời gian chờ, ví dụ:60 giây - điều này có thể bị cấm đối với một số tập quán. Ngoài ra, nếu một tên máy chủ nếu được định nghĩa trong '~/.ssh/config', phương thức' ssh' đầu tiên hoạt động trong khi 'nmap' cách thứ hai thất bại với' Không thể giải quyết "" '. – ssc

-2

Tôi cảm thấy như bạn đang cố giải quyết vấn đề sai ở đây. Bạn không nên cố gắng làm cho các trình nền ssh trở nên ổn định hơn? Hãy thử chạy một cái gì đó như monit, mà sẽ kiểm tra xem daemon đang chạy và khởi động lại nó nếu nó không phải là (cho bạn thời gian để tìm vấn đề gốc đằng sau sshd tắt trên bạn). Hoặc là dịch vụ mạng phiền hà? Hãy thử xem man ifup. Liệu Thiệt hại Toàn bộ Thing chỉ muốn đóng cửa bạn? Vâng, đó là một vấn đề lớn hơn ... thử xem nhật ký của bạn (bắt đầu với syslog) để tìm lỗi phần cứng hoặc dịch vụ đang đóng hộp xuống của bạn (có thể là một màn hình nhiệt độ?).

Làm cho khả năng chịu lỗi của tập lệnh của bạn là rất tốt, nhưng bạn cũng có thể muốn giảm khả năng chịu lỗi của boxen.

+2

Sam: có các trường hợp sử dụng hợp lệ để tập lệnh kiểm tra. Ví dụ: (như tôi): Tôi có một công việc cron chạy trên máy của mình để sao lưu dữ liệu của mình qua rsync vào trang chủ của mình. Bây giờ tôi đang ở bên ngoài hoặc thậm chí bị ngắt kết nối khá thường xuyên và cần phải lên lịch lại nếu kết nối không có sẵn. Boxen của tôi chạy khá tốt, nhưng khi nói đi: nó luôn luôn là cáp (aka network) – stwissel

2

Hãy thử:

echo quit | telnet IP 22 2>/dev/null | grep Connected 
+1

Một vấn đề của phương pháp này là nó không nhận ra các host được định nghĩa trong ssh_config (tức là/etc/ssh/config hoặc ~/.ssh/config) –

16
ssh -q -o "BatchMode=yes" -i /home/sicmapp/.ssh/id_rsa <ID>@<Servername>.<domain> "echo 2>&1" && echo $host SSH_OK || echo $host SSH_NOK 
+1

Một dòng đầu ra: (ssh -q -o "BatchMode = yes" -o "ConnectTimeout = 3" [email protected] "echo 2> & 1" && echo SSH_OK || echo SSH_NOK) | đuôi -n1 – Xdg

11

Bạn có thể sử dụng một cái gì đó như thế này

$(ssh -o BatchMode=yes -o ConnectTimeout=5 [email protected] echo ok 2>&1) 

Sản lượng này sẽ "ok" nếu kết nối ssh là ok

4

Bổ sung vào phản ứng của @Adrià Cidre bạn có thể làm:

status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 [email protected] echo ok 2>&1) 

if [[ $status == ok ]] ; then 
    echo auth ok, do something 
elif [[ $status == "Permission denied"* ]] ; then 
    echo no_auth 
else 
    echo other_error 
fi 
Các vấn đề liên quan