Ответ 1
В конечном итоге я нашел такое решение:
#/bin/bash
ssh -t -x [email protected] 'mysqldump db' -r file.sql
Итак - я использую '-t' вместо '-n'. Удаление "-n" или использование другого пользователя, кроме root, не помогает.
В 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
В конечном итоге я нашел такое решение:
#/bin/bash
ssh -t -x [email protected] 'mysqldump db' -r file.sql
Итак - я использую '-t' вместо '-n'. Удаление "-n" или использование другого пользователя, кроме root, не помогает.
Знаете ли вы, какие параметры вы передаете в ssh? Я предполагаю, что нет. Опция -n перенаправляет ввод из /dev/null, поэтому процесс, который вы выполняете на удаленном узле, вероятно, не видит SIGINT из Ctrl-C.
Теперь позвольте говорить о том, насколько плохая идея разрешить удаленные корневые входы:
Это действительно, очень плохая идея. Посмотрите HOWTO: настройте ssh-ключи для некоторых советов, как безопасно управлять удаленным процессом по ssh. Если вам нужно удаленно запускать что-то с привилегиями, вам, вероятно, понадобится решение, которое включает открытый ключ ssh со встроенной командой и script, который выполняется с правами root sudo.
Когда ваша сессия ssh закончится, ваша оболочка получит SIGHUP. (сигнал зависания). Вы должны убедиться, что он отправляет это для всех процессов, запущенных с него. Для bash попробуйте shopt -s huponexit; your_command
. Это может не сработать, потому что в man-странице говорится, что huponexit работает только для интерактивных оболочек.
Я помню, как это работает с пользователями, выполняющими задания в моем кластере, и нужно ли им использовать nohup или нет (чтобы получить противоположное поведение того, что вы хотите), но я не могу найти что-либо на странице bash о том, игнорируют ли дочерние процессы по умолчанию SIGHUP. Надеюсь, huponexit сделает трюк. (Вы можете поместить этот shopt в свой .bashrc, а не в командной строке, я думаю.)
Ваш ssh -t
должен работать, однако, поскольку, когда соединение закрывается, считывание с терминала приведет к EOF или ошибке, и это заставит большинство программ выйти.
trap "some_command" SIGINT
выполнит some_command
локально, когда вы нажмете Ctrl + C. help trap
расскажет вам о других вариантах.
Что касается вопроса ssh
, я мало знаю о ssh. Может быть, вы можете заставить его вызывать ssh -n -x [email protected] 'killall mysqldump'
вместо some_command
, чтобы убить удаленную команду?