Làm thế nào để ngăn chặn / tiêu diệt một đường hầm tự động?


17

Bây giờ tôi có một đường hầm tự động, cách chính xác để ngăn chặn nó là gì?

Dường như không có cách dễ dàng để làm điều này. Tài liệu không rõ ràng về phần này.

Cách dễ dàng dường như là khởi động lại máy? Điều này có đúng không?

Câu trả lời:


21

Không, cách giết người thích hợp autosshchỉ đơn giản là giết quá trình autossh, không có gì khác.

Lý do là

# file $(which autossh)
/usr/bin/autossh: POSIX shell script, ASCII text executable

đó autosshchỉ đơn giản là một kịch bản shell, không phải là một dịch vụ . Nó bắt đầu một chương trình mới, ở dòng cuối cùng của nó,

exec /usr/lib/autossh/autossh "$@"

lại không phải là một dịch vụ. Đối với exec(bạn có thể kiểm tra kỹ nó trong wiki của tin tặc Bash ), đó là một lệnh shell-shell thay thế shell hiện tại bằng lệnh sau ( /usr/lib/autossh/autossh "$@"trong trường hợp này) mà không bắt đầu một quy trình mới. Vì vậy, cách duy nhất để dừng lại autosshlà giết tập lệnh gọi

pkill -3 autossh

(cảm ơn dviljoen vì đã chỉ ra tầm quan trọng của việc sử dụng cờ -3 , xem bên dưới). Ngẫu nhiên, việc hủy sshkết nối sẽ không hoạt động, bởi vì lệnh gọi ( nghĩa là lệnh ở trên) sẽ chỉ bắt đầu một kết nối mới ngay khi nhận ra kết nối cũ đã bị hủy.


1
Trên thực tế, bạn nên giết autossh mà không có -9. Nếu một kết nối đã được thực hiện thông qua đường hầm, nó sẽ sinh ra một quy trình sshd con để xử lý nó. Giết autossh cha bằng -9 sẽ bỏ lại quá trình sshd. Đường hầm vẫn sẽ hoạt động cho đến khi quá trình sshd hết thời gian. Nếu bạn sử dụng tín hiệu mặc định (-3) khi tắt, nó sẽ tắt một cách duyên dáng và thực hiện quá trình sshd được sinh ra với nó.
dviljoen

xin chào vì -3 là tín hiệu tiêu diệt mặc định, bạn thực sự không cần phải vượt qua -3, bạn có thể bỏ qua nó
Andrés Alcarraz

@ AndrésAlcarraz Bạn thực sự chắc chắn về điều đó? SIGTERMlà mặc định, và đó là một 15. SIGQUIT3, xem superuser.com/questions3532147/what-does-kill-3-meanen.wikipedia.org/wiki/Kill_(command) - Ngoài ra, FWIW, tôi chỉ kiểm tra và -15không tắt nó, vì vậy SIGTERMkhông thể được sử dụng.
Daniel F

Và sử dụng pkillkhông có tín hiệu (= the default) cũng không chấm dứt autossh.
Daniel F

@DanielF Bạn nói đúng, tôi đã nhầm lẫn "tín hiệu mặc định (-3)" từ nhận xét của dvijoen
Andrés Alcarraz

5

chạy ssh tự động với:

AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh

giết nó bằng:

kill pid

BTW

pkill -9 autossh là một sai

-9đảm bảo quy trình không thoát ra một cách duyên dáng, vì vậy sshquy trình vẫn ở đó khi autosshquy trình bị giết

-9vẫn không tệ, nếu bạn có nhiều đường hầm đang chạy, pkillsẽ giết tất cả

Cách chính xác là đặt AUTOSSH_PIDFILEenv var thì killpid đó thôi


Chào mừng đến với Siêu người dùng. Nó xuất hiện đoạn cuối cùng của bạn là câu trả lời thực tế của bạn, trong khi phần còn lại của câu hỏi của bạn là một nhận xét về một câu trả lời khác . Với bản chất Q & A của trang web này, sẽ rất hữu ích khi thêm đủ chi tiết vào câu trả lời của bạn để nó có thể tự đứng vững. Cảm ơn bạn đã đóng góp và đừng quên xem tour .
Tôi nói Phục hồi lại

4

Tìm kiếm quy trình:

ps phụ | grep ssh

Cột secon là số PID

Tiêu diệt quá trình bởi PID :)

giết -9 mã số

Sử dụng sudo nếu bạn không có quyền root.


1

Tôi biết điều này đã được trả lời, nhưng trái với các ý kiến ​​trên, sử dụng pkill -3 autosshKHÔNG giết chết các quy trình con sshd cho tôi.

Tôi sử dụng chức năng này trong .bashrctập tin của tôi .
Về cơ bản, nó giống như thêm một --killđối số vào autossh.

  if [ "$1" = "--kill" ]; then
    ps aux | 
    grep -P "(/usr/bin/ssh|/usr/lib/autossh/autossh)\s.*$2" |
    awk '{print $2}' |
    xargs -r kill
  else
    $(which autossh) "$@"
    echo "" # prevents line wrapping when you kill the ssh process
  fi

Bạn có thể chạy which sshwhich autosshkiểm tra các đường dẫn trên hệ thống của bạn.

Miễn là đối số đầu tiên không có --kill, nó chỉ chuyển các đối số sang chế độ tự động.

Kịch bản này giết chết các trường hợp autossh & ssh. Điều này rất quan trọng nếu bạn đang sử dụng chuyển tiếp cổng bởi vì, CHỈ giết cá thể autossh không giết đường hầm, nó chỉ ngăn nó kết nối lại nếu / khi cuối cùng nó ngắt kết nối.

Bạn cũng có thể chỉ định một thuật ngữ tìm kiếm (tên máy chủ) để chỉ giết các đường hầm cụ thể.

autossh --kill dbserver1Chỉ giết các kết nối đến dbserver1
autossh --kill dbserversẽ giết dbserver1, dbserver2, v.v.
autossh --kill dbserversẽ giết TẤT CẢ các kết nối tự động

Để làm rõ, nó chỉ NÊN giết các phiên SSH được bắt đầu bằng autossh.

Nếu bạn chạy ps aux | grep sshtrong khi bạn có cả phiên autossh và ssh đang chạy, bạn sẽ thấy những phiên bắt đầu bằng autossh sử dụng đường dẫn đầy đủ (/ usr / bin / ssh và / usr / lib / autossh / autossh).
Kịch bản này chỉ khớp kết quả với các quy trình bắt đầu với đường dẫn speicifc. Tôi đã làm điều này bởi vì tôi (và tôi giả sử hầu hết mọi người) thường gõ sshvà không phải là đường dẫn đầy đủ, điều này giúp nó không giết chết các phiên ssh bình thường của tôi.

Hy vọng điều này sẽ giúp người khác.


bất kỳ lý do cụ thể cho $(which autossh)thay vì đơn giản autossh?
MestreLion
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.