Обробка Ctrl-C в сесії SSH


20

Коли я запускаю сеанс SSH, який виконує тривалу команду, що відбувається з обробкою Ctrl+ C(SIGINT)?

Я бачу, що сеанс SSH закритий, але я не впевнений, хто першим отримує SIGINT: це ...

  1. віддалену тривалу команду? тобто (a) обробник сигналу у віддаленій команді викликається і зупиняє віддалену команду; (b) оболонка, яка її породила, виявляє, що команда зупинилася, а також зупиняється (c) віддалений sshd виявляє, що оболонка зупинена, тому воно закриває з'єднання

    або

  2. локальний ssh ​​приймає сигнал і закриває з'єднання.

Я думаю, що (1) відбувається, але хочу переконатися.

Я також не впевнений у тому, що в цьому випадку відбувається з обробкою оболонки SIGINT. Наприклад, якщо я ...

ssh remote 'while true ; do sleep 1 ; date ; done'

і Ctrl+ C, тоді віддалене з'єднання припиняється. Чи є спосіб запустити віддалену команду під оболонкою, яка залишиться живою після Ctrl+ C? Тобто в цьому випадку зупиніть цикл і дозвольте мені продовжувати працювати над віддаленою оболонкою?


3
Неінтерактивний ssh ​​( ssh remote commandна відміну від ssh remote) буде убитий (з локальної сторони) SIGINT, сформованим шляхом введення ctrl-C. Віддалена сторона, ймовірно, (залежить від ОС) буде працювати, поки вона не спробує прочитати чи записати у закритий сокет. Якщо ви хочете, щоб усі ваші натискання клавіш, включаючи ctrl-C, передавались на віддалений, використовуйте ssh remote.
Марк Плотнік

@MarkPlotnick: Гаразд Позначте - якщо ви додасте свою відповідь нижче як відповідь, я прийму її ... На власних тестах я перевірив, що пульт не отримує жодного сигналу.
ttsiodras

Відповіді:


23

sshможна викликати декількома різними способами, кожен з яких дещо відрізняється трактуванням сигналів, ініційованих терміналом, як Ctrl-C.

  • ssh remotehostзапустить інтерактивний сеанс на remotehost. На стороні клієнта sshспробуємо встановити tty, що використовується stdin, в режим "raw", а sshdна віддаленому хості виділить псевдо-tty і запустить вашу оболонку як оболонку входу (наприклад -bash).

    Встановлення необробленого режиму означає, що символи, які зазвичай надсилають сигнали (наприклад, Ctrl-Cта Ctrl-\), замість цього просто вставляються у вхідний потік. sshвідправить такі символи як є на віддалений хост, де вони, ймовірно, надішлють SIGINT або SIGQUIT і, як правило, вбивають будь-яку команду і повернуть вас до оболонки на віддаленому хості. З'єднання ssh залишатиметься живим, поки віддалена оболонка буде жива.

  • ssh -t remotehost command args ...запустить інтерактивний сеанс remotehost, як і вище, за винятком віддаленого боку your_shell -c "command args ...". Як і вище, якщо ви введете Ctrl-C, він буде відправлений на віддалений хост, де команда, ймовірно, отримає SIGINT і негайно вийде, а потім віддалений оболонку вийде. Потім пульт sshdзакриває з'єднання та sshзвітуєConnection to remotehost closed.

  • ssh remotehost command args ...запустить неінтерактивний сеанс на remotehost. На стороні клієнта неssh буде встановлено режим tty на режим "необроблений" (ну, за винятком читання паролем або парольною фразою). Якщо ви введете , вам буде надіслано SIGINT і негайно буде припинено, навіть не видавшиCtrl-CsshConnection to remotehost closed повідомлення.

    Ці your_shell -c "command args ..."процеси будуть , ймовірно , продовжувати працювати на віддаленому хості . Або вони вийдуть самостійно, або один процес спробує записати дані у тепер закритий ssh-сокет, що спричинить (як правило) фатальний сигнал SIGPIPE для надсилання на нього.


1
Технічно віддалена команда не записує безпосередньо в сокет. Її виступ - труба. І sshd на іншому кінці зчитує дані, шифрує їх та надсилає над сокетом. Кінцевий результат однаковий. Команда отримає сигналізацію, оскільки ця труба відсутня, коли клієнт відключається.
Стефан Шазелас

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