2008-12-01 13 views
17

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

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

Простой сценарий:

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

ответ

17

Eventual Я нашел решение так:

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

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

+5

Мне нужен был -t -t (дважды), чтобы он работал. – gravitation 2013-08-14 00:29:06

1
trap "some_command" SIGINT 

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

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

2

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

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

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

2

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

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

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