Я хочу иметь возможность отправлять сигналы (SIGINT является наиболее важным) через SSH.
Эта команда:
ssh server "sleep 1000;echo f" > foo
начнет спать на сервере и через 1000 секунд поместит 'f \ n' в файл foo на моей локальной машине. Если я нажму CTRL-C (то есть отправлю SIGINT в ssh), это убьет ssh, но не остановит sleep на удаленном сервере. Я хочу, чтобы это убило сон на удаленном сервере.
Итак, я попробовал:
ssh server -t "sleep 1000;echo f" > foo
Но если stdin не терминал, я получаю эту ошибку:
Pseudo-terminal will not be allocated because stdin is not a terminal.
и тогда SIGINT все еще не передан.
Итак, я попробовал:
ssh server -t -t "sleep 1000;echo f" > output
Но тогда вывод в foo - это не 'f \ n', а вместо 'f \ r \ n', что губительно в моей ситуации (так как мой вывод - двоичные данные).
Выше я использую «sleep 1000; echo f», но на самом деле он предоставляется пользователем, поэтому он может содержать все, что угодно. Однако, если мы можем заставить его работать для «сна 1000; эхо f», мы, скорее всего, можем заставить его работать для всех реалистичных ситуаций.
Я действительно не беспокоюсь о получении псевдо-терминала на другом конце, но я не смог найти какой-либо другой способ заставить ssh переслать мой SIGINT.
Есть ли другой способ?
Редактировать:
Пользователь может давать команды, которые читают двоичные данные из стандартного ввода, такие как:
seq 1000 | gzip | ssh server "zcat|bzip2; sleep 1000" | bzcat > foo
Пользователь может давать команды, которые интенсивно используют процессор, такие как:
ssh server "timeout 1000 burnP6"
Edit2:
Версия, которая, кажется, работает для меня:
your_preprocessing |
uuencode a | ssh -tt -oLogLevel=quiet server "stty isig -echoctl -echo ; uudecode -o - |
your_command |
uuencode a" | uudecode -o - |
your_postprocessing
Спасибо digital_infinity за указание в правильном направлении.
ssh
должно быть более сложным, чем то, что вы показываете в качестве примеров, потому что вы можете получить желаемое поведение с помощью простой перестановки:sleep 1000 && ssh server "echo f" > foo
(Должно быть&&
, нет;
, так что убийствоsleep
препятствует выполнениюssh
команды.) Если я Правильно, пожалуйста, сделайте ваши примеры более репрезентативными для вашего фактического использования, чтобы можно было дать лучший ответ.