Cách tắt phiên SSH đã được bắt đầu với tùy chọn -f (chạy trong nền)


50

Tôi khá lạc lõng với điều này. Từ trang người đàn ông:

 -f      Requests ssh to go to background just before command execution.

Sau khi bắt đầu SSH với -ftùy chọn, tôi có một đường hầm làm việc. Nhưng sau khi sử dụng xong, tôi không biết làm thế nào để tương tác với nó. Ví dụ: tôi không thể đóng đường hầm SSH khi tôi hoàn thành nó.

Các phương pháp thông thường tôi biết không hoạt động. Ví dụ, jobstrả về không có gì. Các ~lệnh không được công nhận (và tôi không biết chính xác làm thế nào để sử dụng nó, dù sao).

Tuy nhiên, pgrepcho tôi biết rằng đường hầm SSH vẫn đang chạy (sau khi tôi đã đóng thiết bị đầu cuối, v.v.). Làm thế nào để tôi tương tác với nó? Làm thế nào để tôi đóng nó?

Câu trả lời:


65

Một giải pháp đặc biệt tốt cho kịch bản là sử dụng master mode, với một ổ cắm cho các lệnh điều khiển:

ssh -f -N -M -S <path-to-socket> -L <port>:<host>:<port> <server>

Để đóng lại:

ssh -S <path-to-socket> -O exit <server>

Điều này tránh cả grepping cho id quá trình và bất kỳ vấn đề thời gian nào có thể liên quan đến các phương pháp khác.


10
Chỉ cần mở rộng một chút cho người không quen thuộc, <path-to-socket> là đường dẫn đến tệp mà cá thể chủ của ssh client sẽ tạo để liên lạc giữa các quá trình với các phiên bản máy khách ssh khác muốn chia sẻ kết nối của cá thể chủ. Các tập tin được tạo sẽ thực sự đại diện cho một ổ cắm tên miền unix. Nó có thể được đặt tên và đặt bất cứ nơi nào và bất cứ nơi nào bạn muốn, ví dụ /tmp/session1(mặc dù nên đặt tên cho nó bằng cách sử dụng % mẫu - xem mô tả ControlPath trong man ssh_config)
golem

1
Ngoài ra, có vẻ như phần <server> của ssh -S <path-to-socket> -O exit <server>lệnh có thể là bất kỳ chuỗi nào, nhưng nó phải có mặt. Đó là loại vụng về.
golem

1
Câu trả lời và câu hỏi này hơi cũ, nhưng tôi muốn chứng thực đây có lẽ là cách xử lý vấn đề "đúng đắn" và chính xác nhất mà tôi từng thấy. Cảm ơn ngài!
zentechinc

41

Tôi tìm thấy giải pháp ở đây: http://www.g-loaded.eu/2006/11/24/auto-closes-ssh-tunnels/

Cách tốt nhất - Đường hầm tự động đóng

Như đã đề cập trước đây, thay vì sử dụng kết hợp chuyển đổi -f -N, chúng ta chỉ có thể sử dụng -f một mình, nhưng cũng thực hiện một lệnh trên máy từ xa. Nhưng, lệnh nào sẽ được thực thi, vì chúng ta chỉ cần khởi tạo một đường hầm?

Đây là khi giấc ngủ có thể là mệnh lệnh hữu ích nhất trong tất cả! Trong tình huống đặc biệt này, giấc ngủ có hai lợi thế:

  • nó không làm gì cả, vì vậy không có tài nguyên nào được tiêu thụ
  • người dùng có thể chỉ định thời gian thực hiện

Làm thế nào những trợ giúp này trong việc tự động đóng đường hầm ssh được giải thích dưới đây.

Chúng tôi bắt đầu phiên ssh trong nền, trong khi thực hiện lệnh ngủ trong 10 giây trên máy từ xa. Số giây không quan trọng. Đồng thời, chúng tôi thực thi vncviewer chính xác như trước:

[me@local]$ ssh -f -L 25901:127.0.0.1:5901 me@remote.example.org sleep 10; \
          vncviewer 127.0.0.1:25901:1

Trong trường hợp này, máy khách ssh được hướng dẫn rẽ nhánh ssh sang nền (-f), tạo đường hầm (-L 25901: 127.0.0.1: 5901) và thực hiện lệnh ngủ trên máy chủ từ xa trong 10 giây (ngủ 10).

Sự khác biệt giữa phương thức này và phương thức trước đó (-N switch), về cơ bản, là trong trường hợp này, mục tiêu chính của máy khách ssh không phải là tạo đường hầm, mà là thực thi lệnh ngủ trong 10 giây. Việc tạo ra đường hầm là một loại hiệu ứng phụ, một mục tiêu thứ yếu. Nếu vncviewer không được sử dụng, máy khách ssh sẽ thoát sau khoảng thời gian 10 giây, vì nó sẽ không có nhiều việc phải làm, phá hủy đường hầm cùng một lúc.

Trong quá trình thực thi lệnh ngủ, nếu một quá trình khác, vncviewer trong trường hợp này, bắt đầu sử dụng đường hầm đó và giữ nó vượt quá thời gian 10 giây, sau đó, ngay cả khi máy khách ssh hoàn thành công việc từ xa (thực thi giấc ngủ), nó không thể thoát vì một quá trình khác chiếm đường hầm. Nói cách khác, máy khách ssh không thể phá hủy đường hầm vì nó cũng sẽ phải giết vncviewer. Khi vncviewer ngừng sử dụng đường hầm, thì máy khách ssh cũng thoát, vì nó đã hoàn thành mục tiêu của nó.

Bằng cách này, không có quá trình ssh nào đang chạy trong nền.


4
Một nhận xét / chỉnh sửa ngắn: Theo như tôi biết bạn phải xác định vncviewer 127.0.0.1::25091như bạn đang sử dụng cú pháp cổng chứ không phải cú pháp hiển thị.
Christian Wolf

Đây là một ý tưởng tuyệt vời và các bước bên lề gọn gàng một vấn đề tôi gặp phải trên Windows. Các phiên bản gần đây của Windows có máy khách ssh và về mặt lý thuyết, nó hỗ trợ tùy chọn -S, nhưng dường như không hoạt động với tôi.
Keeely

9

Để tiêu diệt đường hầm, sử dụng ps -C sshhoặc ps | grep sshhoặc bất kỳ biến thể nào khác để xác định quá trình ssh nào đang chạy đường hầm của bạn. Sau đó giết nó.

Ngoài ra, bạn có thể tìm quy trình bằng cách xác định cổng nào mở cổng này:

netstat -lnpt | awk '$4 ~ /:1234$/ {sub(/\/.*/, "", $7); print $7}'

Nếu bạn muốn giết tất cả các máy khách ssh đang chạy trên máy của bạn (với tư cách là người dùng của bạn), pkill sshsẽ làm điều đó.


6

Như được trả lời bởi những người khác ở đây, pkill sshgiết chết nó.

Để tạo một đường hầm có thể được đưa trở lại, tôi khởi động nó screenmà không có -ftùy chọn, và sau đó tách màn hình ra Ctrl-A D. Để mang lại đường hầm, gọi screen -r.


Lực lượng vũ
phu

1
Cẩn thận nếu bạn đang kết nối từ xa. pkill ssh thậm chí sẽ giết kết nối hiện tại của bạn.
kennyut

@kennyut Còn một lý do nữa để sử dụng screen.
Haotian Yang

0

Khi tôi bắt đầu một đường hầm với:

ssh -fN -D 8080 SOME_IP_HERE -l LOGIN_NAME_HERE
  • -f Yêu cầu ssh đi đến nền ngay trước khi thực hiện lệnh.
  • -NKhông thực hiện một lệnh từ xa. Điều này rất hữu ích cho việc chuyển tiếp cổng.
  • -D Chỉ định chuyển tiếp cổng cấp ứng dụng "động" cục bộ.
  • -l Chỉ định người dùng đăng nhập như trên máy từ xa.

Tôi có thể đóng nó bằng:

ps -lef | grep ssh | grep "8080" | awk "{print \$2}" | xargs kill

-1

Giải pháp tốt nhất tôi tìm thấy để tiêu diệt tất cả các đường hầm trong một dòng lệnh là

ps -lef|grep ssh|grep "\-L"|awk '{print $4}'|xargs kill

đối với các phiên ssh, chỉ cần loại bỏ tùy chọn đường hầm

ps -lef|grep ssh|awk '{print $4}'|xargs kill

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.