Подтвердить что ты не робот

Как заставить ssh убивать удаленный процесс, когда я прерываю сам ssh?

В bash script Я выполняю команду на удаленной машине через ssh. Если пользователь нарушает script, нажав Ctrl + C, он останавливает только script - даже не клиент ssh. Более того, даже если я убью ssh-клиент, удаленная команда все еще запущена...

Как сделать bash, чтобы убить локальный клиент ssh и вызов удаленной команды на Crtl + c?

Простой script:

#/bin/bash
ssh -n -x [email protected] 'mysqldump db' -r file.sql
4b9b3361

Ответ 1

В конечном итоге я нашел такое решение:

#/bin/bash
ssh -t -x [email protected] 'mysqldump db' -r file.sql

Итак - я использую '-t' вместо '-n'. Удаление "-n" или использование другого пользователя, кроме root, не помогает.

Ответ 2

Знаете ли вы, какие параметры вы передаете в ssh? Я предполагаю, что нет. Опция -n перенаправляет ввод из /dev/null, поэтому процесс, который вы выполняете на удаленном узле, вероятно, не видит SIGINT из Ctrl-C.

Теперь позвольте говорить о том, насколько плохая идея разрешить удаленные корневые входы:

Это действительно, очень плохая идея. Посмотрите HOWTO: настройте ssh-ключи для некоторых советов, как безопасно управлять удаленным процессом по ssh. Если вам нужно удаленно запускать что-то с привилегиями, вам, вероятно, понадобится решение, которое включает открытый ключ ssh со встроенной командой и script, который выполняется с правами root sudo.

Ответ 3

Когда ваша сессия ssh закончится, ваша оболочка получит SIGHUP. (сигнал зависания). Вы должны убедиться, что он отправляет это для всех процессов, запущенных с него. Для bash попробуйте shopt -s huponexit; your_command. Это может не сработать, потому что в man-странице говорится, что huponexit работает только для интерактивных оболочек.

Я помню, как это работает с пользователями, выполняющими задания в моем кластере, и нужно ли им использовать nohup или нет (чтобы получить противоположное поведение того, что вы хотите), но я не могу найти что-либо на странице bash о том, игнорируют ли дочерние процессы по умолчанию SIGHUP. Надеюсь, huponexit сделает трюк. (Вы можете поместить этот shopt в свой .bashrc, а не в командной строке, я думаю.)

Ваш ssh -t должен работать, однако, поскольку, когда соединение закрывается, считывание с терминала приведет к EOF или ошибке, и это заставит большинство программ выйти.

Ответ 4

trap "some_command" SIGINT

выполнит some_command локально, когда вы нажмете Ctrl + C. help trap расскажет вам о других вариантах.

Что касается вопроса ssh, я мало знаю о ssh. Может быть, вы можете заставить его вызывать ssh -n -x [email protected] 'killall mysqldump' вместо some_command, чтобы убить удаленную команду?