2010-01-04 30 views
25

Tôi đã viết một small bash script mà cần một đường hầm ssh để vẽ dữ liệu từ một máy chủ từ xa, vì vậy nó đòi hỏi user:ssh: kiểm tra nếu một đường hầm đang sống

echo "Please open an ssh tunnel using 'ssh -L 6000:localhost:5432 example.com'" 

tôi muốn kiểm tra xem người dùng đã mở đường hầm này và thoát ra bằng một thông báo lỗi nếu không có đường hầm nào tồn tại. Có cách nào để truy vấn đường hầm ssh, tức là kiểm tra xem cổng địa phương 6000 có thực sự được tunnel đến máy chủ đó không?

Cảm ơn,

Adam

+0

này một phần có thể giúp "lsof -i | grep ssh" – qartal

Trả lời

26

Đây là thử nghiệm của tôi. Hy vọng nó rất hữu ích.

# $COMMAND is the command used to create the reverse ssh tunnel 
COMMAND="ssh -p $SSH_PORT -q -N -R $REMOTE_HOST:$REMOTE_HTTP_PORT:localhost:80 [email protected]$REMOTE_HOST" 

# Is the tunnel up? Perform two tests: 

# 1. Check for relevant process ($COMMAND) 
pgrep -f -x "$COMMAND" > /dev/null 2>&1 || $COMMAND 

# 2. Test tunnel by looking at "netstat" output on $REMOTE_HOST 
ssh -p $SSH_PORT [email protected]$REMOTE_HOST netstat -an | egrep "tcp.*:$REMOTE_HTTP_PORT.*LISTEN" \ 
    > /dev/null 2>&1 
if [ $? -ne 0 ] ; then 
    pkill -f -x "$COMMAND" 
    $COMMAND 
fi 
+0

Dường như có lỗi trong mã ở trên. nếu [$? -Một 0], 0 có lẽ là một 1. egrep từ xa sẽ thiết lập $? thành 0 nếu tìm thấy thành công một trận đấu. Trong mọi trường hợp, tôi cần phải sử dụng 1 để có được lệnh này để ngăn chặn giết chết đường hầm hiện có mỗi khi tôi chạy lệnh. – user2495504

7

Đây thực sự là nhiều hơn một câu hỏi serverfault-type, nhưng bạn có thể sử dụng netstat.

cái gì đó như:

# netstat -lpnt | grep 6000 | grep ssh 

này sẽ cho bạn biết nếu có một quá trình ssh lắng nghe trên cổng xác định. nó cũng sẽ cho bạn biết PID của quá trình.

Nếu bạn thực sự muốn kiểm tra lại rằng quá trình ssh được bắt đầu với các tùy chọn bên phải, bạn sau đó có thể tra cứu quá trình bằng cách PID trong một cái gì đó giống như

# ps aux | grep PID 
+2

Lưu ý rằng điều này giải pháp không hoạt động trên OS X, bởi vì netstat trên OS X là khác nhau. – hlin117

5

Sử dụng autossh. Đó là công cụ có nghĩa là để theo dõi kết nối ssh.

16

Autossh là lựa chọn tốt nhất - Quy trình kiểm tra không hoạt động trong mọi trường hợp (ví dụ zombie quá trình, liên quan đến mạng vấn đề)

dụ:

autossh -M 2323 -c arcfour -f -N -L 8088:localhost:80 host2 
25

Netcat là bạn của bạn:

nc -z localhost 6000 || echo 'no tunnel open'; exit 1 
+0

Chà, thật là hữu ích.Tôi đang tạo một kịch bản mà trước hết tạo ra một đường hầm ssh, và bây giờ tôi đang sử dụng netcat để biết khi nào nó sẵn sàng chấp nhận các kết nối. Làm việc như một say mê. – Hubro

0
#!/bin/bash 

# Check do we have tunnel to example.com server 
lsof -i [email protected]:6000 > /dev/null 

# If exit code wasn't 0 then tunnel doesn't exist. 
if [ $? -eq 1 ] 
then 
    echo ' > You missing ssh tunnel. Creating one..' 
    ssh -L 6000:localhost:5432 example.com 
fi 

echo ' > DO YOUR STUFF < ' 
0

Đây là những bước chi tiết để kiểm tra hoặc khắc phục sự cố một đường hầm SSH. Bạn có thể sử dụng một số trong số đó trong một tập lệnh. Tôi đang thêm câu trả lời này bởi vì tôi đã phải khắc phục sự cố liên kết giữa hai ứng dụng sau khi họ ngừng hoạt động. Chỉ cần grepping cho quá trình ssh là không đủ, vì nó vẫn còn đó. Và tôi không thể sử dụng nc -z vì tùy chọn đó không có sẵn trên câu lệnh netcat của tôi.

Hãy bắt đầu lại từ đầu. Giả sử có một máy, sẽ được gọi là địa phương với địa chỉ IP là 10.0.0.1 và một máy khác, được gọi là từ xa, tại 10.0.3.12. Tôi sẽ thêm các tên máy chủ này vào các lệnh dưới đây, vì vậy rõ ràng là chúng đang được thực hiện ở đâu.

Mục tiêu là tạo một đường hầm sẽ chuyển tiếp lưu lượng TCP từ địa chỉ vòng lặp trên máy từ xa trên cổng 123 đến máy cục bộ trên cổng 456.Điều này có thể được thực hiện với các lệnh sau, trên máy cục bộ:

local:~# ssh -N -R 123:127.0.0.1:456 10.0.3.12 

Để kiểm tra xem tiến trình đang chạy, chúng tôi có thể làm:

local:~# ps aux | grep ssh 

Nếu bạn thấy lệnh trong đầu ra, chúng tôi Có thể tiến hành. Nếu không, hãy kiểm tra xem khóa SSH đã được cài đặt trong điều khiển từ xa chưa. Lưu ý rằng loại trừ tên người dùng trước IP từ xa, làm cho ssh sử dụng tên người dùng hiện tại.

Tiếp theo, chúng tôi muốn kiểm tra xem đường hầm được mở trên điều khiển từ xa:

remote:~# netstat | grep 10.0.0.1 

Chúng tôi sẽ nhận được một kết quả tương tự như sau:

tcp 0 0 10.0.3.12:ssh 10.0.0.1:45988 ESTABLISHED 

Sẽ được tốt đẹp để thực sự thấy một số dữ liệu đi qua từ xa đến máy chủ. Đây là nơi netcat có sẵn. Trên CentOS, nó có thể được cài đặt với yum install nc.

Trước tiên, mở một cổng lắng nghe trên máy cục bộ:

local:~# nc -l 127.0.0.1:456 

Sau đó, tạo ra một kết nối trên điều khiển từ xa:

remote:~# nc 127.0.0.1 123 

Nếu bạn mở một thiết bị đầu cuối thứ hai để máy tính cục bộ, bạn có thể xem kết nối. Một cái gì đó như thế này:

local:~# netstat | grep 456 
tcp 0 0 localhost.localdom:456 localhost.localdo:33826 ESTABLISHED 
tcp 0 0 localhost.localdo:33826 localhost.localdom:456 ESTABLISHED 

Vẫn còn tốt hơn, đi trước và gõ một cái gì đó trên remote:

remote:~# nc 127.0.0.1 8888 
Hallo? 
anyone there? 

Bạn sẽ thấy điều này được phản ánh trên các thiết bị đầu cuối tại địa phương:

local:~# nc -l 127.0.0.1:456 
Hallo? 
anyone there? 

Đường hầm đang làm việc! Nhưng nếu bạn có một ứng dụng, được gọi là tên ứng dụng, được cho là đang nghe trên cổng 456 trên máy cục bộ? Chấm dứt nc ở cả hai bên rồi chạy ứng dụng của bạn. Bạn có thể kiểm tra xem nó lắng nghe trên cổng đúng với this:

local:~# netstat -tulpn | grep LISTEN | grep appname 
tcp 0 0 127.0.0.1:456 0.0.0.0:* LISTEN 2964/appname 

Bằng cách này, cách chạy lệnh tương tự trên điều khiển từ xa sẽ hiển thị sshd lắng nghe trên cổng 127.0.0.1:123.

0

Chúng tôi có thể kiểm tra bằng lệnh ps

# ps -aux | grep ssh 

sẽ hiển thị tất cả dịch vụ shh chạy và chúng tôi có thể tìm thấy các dịch vụ đường hầm được liệt kê

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