Làm thế nào để đóng đường hầm ssh này? [đóng cửa]


96

Tôi đã mở một đường hầm ssh như được mô tả trong bài đăng này: Zend_Db: Làm cách nào để kết nối với cơ sở dữ liệu MySQL qua đường hầm SSH?

Nhưng bây giờ tôi không biết mình đã thực sự làm gì. Lệnh này có ảnh hưởng gì đến máy chủ không? Và làm cách nào để đóng đường hầm này, bởi vì bây giờ tôi không thể sử dụng mysql cục bộ của mình đúng cách.

Tôi sử dụng OSX Lion và máy chủ chạy trên Ubuntu 11.10.

Câu trả lời:


241

Giả sử bạn đã chạy lệnh này: ssh -f user@mysql-server.com -L 3306:mysql-server.com:3306 -Nnhư được mô tả trong bài đăng bạn đã liên kết.

Phân tích lệnh:

  1. ssh: điều đó khá dễ hiểu. Lời mời ssh.
  2. -f: (Từ man sshtrang)

    Yêu cầu ssh chuyển sang nền ngay trước khi thực hiện lệnh. Điều này hữu ích nếu ssh định yêu cầu mật khẩu hoặc cụm mật khẩu, nhưng người dùng muốn nó ở chế độ nền.

    Về cơ bản, gửi sshđến nền sau khi bạn đã nhập bất kỳ mật khẩu nào để thiết lập kết nối; nó trả lại lời nhắc shell cho bạn localhostthay vì đăng nhập cho bạn remote-host.

  3. user@mysql-server.com: máy chủ từ xa bạn muốn đăng nhập.
  4. -L 3306:mysql-server.com:3306: Đây là một chút thú vị. -L(từ man sshtrang):

    [bind_address:] port: host: hostport Chỉ định rằng cổng nhất định trên máy chủ cục bộ (máy khách) sẽ được chuyển tiếp tới máy chủ nhất định và cổng ở phía từ xa.

    Vì vậy, -L 3306:mysql-server.com:3306liên kết với các địa phương cảng 3306đến cảng từ xa 3306 trên máy chủ mysql-server.com.

    Khi bạn kết nối với cổng cục bộ3306 , kết nối sẽ được chuyển tiếp qua kênh an toàn tới mysql-server.com. Máy chủ từ xa , mysql-server.comsau đó kết nối với mysql-server.comtrên cổng 3306.

  5. -N: không thực hiện lệnh. Điều này hữu ích cho "chỉ các cổng chuyển tiếp" (trích dẫn trang người).

Lệnh này có ảnh hưởng gì đến máy chủ không?

Có, nó thiết lập kết nối giữa localhostmysql-server.com trên cổng 3306 .

Và làm cách nào để đóng đường hầm này ...

Nếu bạn đã sử dụng -f, bạn sẽ nhận thấy rằng sshquá trình bạn đã mở sẽ đi vào nền. Phương pháp đẹp hơn đóng nó là chạy ps aux | grep 3306, tìm pidcủa ssh -f ... -L 3306:mysql-server.com:3306 -N, và kill <pid>. (Hoặc có thể kill -9 <pid>; tôi quên nếu chỉ killhoạt động). Điều đó có lợi ích tuyệt vời là không giết chết tất cả các sshkết nối khác của bạn ; nếu bạn có nhiều hơn một, việc thiết lập lại chúng có thể là một ... hơi đau.

... bởi vì bây giờ tôi không thể sử dụng mysql cục bộ của mình đúng cách.

Điều này là do bạn đã "nắm bắt" quy trình cục bộ một cách hiệu quả mysqlvà chuyển tiếp bất kỳ lưu lượng truy cập nào cố gắng kết nối với quy trình đó, tắt đến quy trình từ xa mysql . Một giải pháp tốt hơn nhiều sẽ là không sử dụng cổng cục bộ 3306 trong chuyển tiếp cổng. Sử dụng thứ gì đó không được sử dụng, chẳng hạn như 33060. (Các số cao hơn thường ít được sử dụng hơn; việc chuyển tiếp một kết hợp như thế này khá phổ biến: "2525-> 25", "8080-> 80", "33060-> 3306" hoặc tương tự. Làm cho việc ghi nhớ dễ dàng hơn một chút).

Vì vậy, nếu bạn đã sử dụng ssh -f user@mysql-server.com -L 33060:mysql-server.com:3306 -N, sau đó bạn sẽ trỏ hàm Zend connect-to-mysql của mình tới localhosttrên cổng 33060, sẽ kết nối với mysql-server.comtrên cổng 3306. Rõ ràng là bạn vẫn có thể kết nối localhosttrên cổng 3306, vì vậy bạn vẫn có thể sử dụng mysqlmáy chủ cục bộ .


5
Lời giải thích tốt nhất tôi đã đọc trong một thời gian. Điều này rất hữu ích khi truy cập cơ sở dữ liệu từ xa từ các môi trường được cài đặt cục bộ như R chẳng hạn. Hoạt động tốt với xác thực khóa công khai / riêng tư. Không phải với mật khẩu vì tôi không tìm ra cách chuyển mật khẩu.
Matt Bannert

Chấp nhận câu trả lời này là tốt nhất vì đã giải thích cặn kẽ.
Jacob

Câu trả lời hay! Bằng cách này, -9không cần thiết cho kill, xem xét quá trình này vẫn đang làm việc tốt ;-)
Lucio Paiva

46

Điều này sẽ giết tất cả các phiên ssh mà bạn đã mở từ thiết bị đầu cuối.

sudo killall ssh

Nó nói: 'Không tìm thấy quy trình phù hợp nào'.
Jacob

Có vẻ như nó là như vậy. Mysql cũng hoạt động tốt, nhưng sau đó Apache bắt đầu phàn nàn. Tôi đã khởi động lại và mọi thứ hoạt động như mong đợi. Tôi đoán là vấn đề đã được giải quyết :)
Jacob vào

5
Vâng, bạn không muốn làm điều này nếu nó là một môi trường sản ... bạn sẽ đá ở ngoài tất cả các quản trị viên khác
texasbruce

12
Chạy killall sshlà một lệnh khá liều lĩnh. Tôi khuyên bạn nên tìm kiếm danh sách quy trình của mình (tức là ps aux | grep sshnhư được đề xuất bởi @simont ở trên) để khám phá id quy trình cụ thể của quy trình đường hầm ssh của bạn. Sau đó, bạn có thể giết pid đó cụ thể.
Ben

Có một cơ hội tốt là bạn sẽ không muốn tất cả chúng bị giết.
wobbily_col

22

Lưu ý: thêm dưới dạng câu trả lời vì nhận xét không hỗ trợ khối mã.

Theo ý kiến ​​của tôi, tốt hơn là KHÔNG sử dụng -fvà thay vào đó chỉ cần làm nền cho quá trình như bình thường &. Điều đó sẽ cung cấp cho bạn pid chính xác mà bạn cần để giết:

ssh -N -L1234:other:1234 server &
pid=$!
echo "waiting a few seconds to establish tunnel..."
sleep 5
... do yer stuff... launch mysql workbench whatever
echo "killing ssh tunnel $pid"
kill $pid

Hoặc tốt hơn, chỉ cần tạo điều này dưới dạng tập lệnh trình bao bọc:

# backend-tunnel <your cmd line, possibly 'bash'>
ssh -N -L1234:other:1234 server &
pid=$!
echo "waiting a few seconds to establish tunnel..."
sleep 5
"$@"
echo "killing ssh tunnel $pid"
kill $pid

backend-tunnel mysql-workbench

backend-tunnel bash


12
Việc sử dụng -fcho phép sshphiên tiếp tục ngay cả khi phiên đầu cuối đóng, không giống như đẩy xuống nền. Lấy việc pidsử dụng ps aux | grep ssh | grep <LOCAL-PORT>là khá đơn giản.
simont

1
@simont sử dụng pid rõ ràng được trả về từ công việc nền sẽ an toàn hơn, bất kể bạn làm nền như thế nào. nếu bạn có nhiều hơn một quy trình ssh đang chạy, bạn sẽ có một khoảng thời gian tồi tệ
aaron

Việc sử dụng -fcũng có lợi thế là nhắc người dùng cục bộ nhập mật khẩu đăng nhập, nếu cần. Nếu bạn sử dụng &, người dùng sẽ không nhìn thấy lời nhắc đó trừ khi họ đưa quy trình lên nền trước (ví dụ: bằng cách sử dụng fg).
Bdoserror


3
lần đầu tiên <LOCAL-PORT> của bạn xảy ra trong pid của một quy trình cũng chứa văn bản 'ssh' (chẳng hạn như một quy trình ssh hoặc sshd khác hoặc chỉnh sửa tệp có tên 'ssh'), bạn sẽ nhận ra rằng điều này cách tiếp cận, trong khi thuận tiện trong các tình huống đơn giản, không chống đạn
aaron
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.