Як вбити сеанс SSH, який розпочався за допомогою параметра -f (запустити у фоновому режимі)


50

Я сильно загубився на цьому. На чоловіковій сторінці:

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

Після запуску SSH з -fопцією у мене працює робочий тунель. Але після того, як я закінчую його використання, я не знаю, як продовжувати взаємодію з ним. Наприклад, я не можу закрити тунель SSH, коли закінчую його.

Звичайні мені методи не працюють. Наприклад, jobsнічого не повертає. ~Команда не розпізнана (і я не знаю точно , як використовувати його, у всякому разі).

Однак pgrepмені каже, що тунель SSH все ще працює (після того, як я закрию термінал тощо). Як я взаємодію з ним? Як його закрити?

Відповіді:


65

Особливо хорошим рішенням для сценаріїв є використання master modeрозетки для команд управління:

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

Щоб знову його закрити:

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

Це дозволяє уникнути як прив'язки до ідентифікаторів процесів, так і будь-яких проблем із тимчасовим враженням, які можуть бути пов'язані з іншими підходами.


10
Щоб трохи розширити для непосвячених, <path-to-socket> - це шлях до файлу, який створить головний екземпляр ssh-клієнта для міжпроцесорного спілкування з іншими екземплярами клієнта ssh, які хочуть поділитися з’єднанням головного екземпляра. Створений файл буде фактично представляти сокет домену unix. Він може бути названий і розташований у будь-якому місці та де завгодно, наприклад /tmp/session1(хоча рекомендується називати його за допомогою % шаблонів - див. Опис ControlPath в man ssh_config)
golem

1
Також здається, що <server> частиною ssh -S <path-to-socket> -O exit <server>команди може бути будь-який рядок, але він повинен бути присутнім. Це якась незграбна.
голем

1
Ця відповідь і питання дещо старі, але я хотів схвалити це як, мабуть, найелегантніший і «правильний» спосіб вирішення цієї проблеми, який я бачив. Дякую вам сер!
zentechinc

41

Я знайшов рішення тут: http://www.g-loaded.eu/2006/11/24/auto-closing-ssh-tunnels/

Найкращий спосіб - тунелі, які автоматично закриваються

Як вже було сказано раніше, замість того, щоб використовувати комбінацію комутаторів -f -N, ми можемо просто використовувати -f поодинці, але також виконувати команду на віддаленій машині. Але яку команду слід виконати, оскільки нам потрібно лише ініціалізувати тунель?

Це коли сон може бути найкориснішою командою з усіх! У цій конкретній ситуації сон має дві переваги:

  • вона нічого не робить, тому ніяких ресурсів не витрачається
  • користувач може вказати, як довго він буде виконуватися

Як вони допомагають в автоматичному закритті тунелю ssh, пояснюється нижче.

Ми починаємо сеанс ssh у фоновому режимі, виконуючи команду сну протягом 10 секунд на віддаленій машині. Кількість секунд не має вирішального значення. Одночасно ми виконуємо vncviewer точно так само, як і раніше:

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

У цьому випадку клієнту ssh доручається відкинути сеанс ssh на задній план (-f), створити тунель (-L 25901: 127.0.0.1: 5901) та виконати команду сну на віддаленому сервері протягом 10 секунд (сон 10).

Відмінність цього методу від попереднього (-N перемикача), в основному, полягає в тому, що в цьому випадку головна мета клієнта ssh - це не створити тунель, а скоріше виконати команду сну протягом 10 секунд. Створення тунелю - це якась побічна дія, вторинна мета. Якщо vncviewer не використовувався, ssh-клієнт виходив би через 10 секунд, оскільки у нього більше не буде роботи, руйнуючи тунель одночасно.

Під час виконання команди сну, якщо інший процес, vncviewer в цьому випадку, починає використовувати цей тунель і тримає його зайнятим понад 10 секунд, тоді, навіть якщо ssh-клієнт закінчить віддалене завдання (виконання сну), він не може вихід, тому що інший процес займає тунель. Іншими словами, ssh-клієнт не може знищити тунель, оскільки він також повинен вбити vncviewer. Коли vncviewer перестає користуватися тунелем, ssh-клієнт теж виходить, оскільки він вже досяг своєї мети.

Таким чином, жодні процеси ssh не залишаються запущеними у фоновому режимі.


4
Коротке зауваження / виправлення: Наскільки я знаю, ви повинні вказати, vncviewer 127.0.0.1::25091як ви використовуєте синтаксис порту, а не синтаксис відображення.
Крістіан Вольф

Це відмінна ідея і акуратно побіжно вирішує проблему, яку я мав у Windows. Останні версії Windows постачаються з ssh-клієнтом, і він теоретично підтримує опцію -S, але, схоже, не працює для мене.
Кілі

9

Щоб вбити тунель, використовуйте ps -C sshабо ps | grep sshбудь-який інший варіант, щоб визначити, який ssh ​​процес працює у вашому тунелі. Тоді вбий.

Крім того, ви можете шукати процес, визначивши, який із цих портів відкритий:

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

Якщо ви хочете вбити всіх ssh-клієнтів, що працюють на вашій машині (як ваш користувач), pkill sshзробіть це.


6

Як тут відповіли інші, pkill sshце вбиває.

Щоб створити тунель, який можна було б повернути назад, я запускаю його screenбез -fможливості, а потім від'єдную екран за допомогою Ctrl-A D. Щоб повернути тунель, дзвоніть screen -r.


Груба сила, але дієва
мафроз

1
Остерігайтеся, якщо ви підключаєтесь віддалено. pkill ssh навіть знищить ваше поточне з'єднання.
kennyut

@kennyut Ще одна причина використання screen.
Хаотичний Ян

0

Коли я запускаю тунель із:

ssh -fN -D 8080 SOME_IP_HERE -l LOGIN_NAME_HERE
  • -f Запрошує ssh перейти до фону безпосередньо перед виконанням команди.
  • -NНе виконуйте віддалену команду. Це корисно лише для переадресації портів.
  • -D Вказує локальну "динамічну" переадресацію порту на рівні додатків.
  • -l Вказує користувача для входу в систему, як на віддаленій машині.

Я можу закрити це:

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

-1

Найкраще рішення, яке я знайшов, щоб убити всі тунелі в одному командному рядку

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

для сеансів ssh просто видаліть опцію тунелю

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.