Я хочу мати можливість передавати сигнали (SIGINT є найважливішим) через ssh.
Ця команда:
ssh server "sleep 1000;echo f" > foo
почне спати на сервері, і через 1000 секунд він помістить 'f \ n' у файл foo на моїй локальній машині. Якщо я натискаю CTRL-C (тобто надсилаю SIGINT до ssh), це вб'є ssh, але воно не вб'є сон на віддаленому сервері. Я хочу, щоб це знищило сон на віддаленому сервері.
Тому я спробував:
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; відлуння», ми, швидше за все, можемо змусити його працювати у всіх реалістичних ситуаціях.
Мені справді не байдуже отримати псевдотермінал на іншому кінці, але мені не вдалося знайти іншого способу отримання ssh для пересилання мого SIGINT.
Чи є інший спосіб?
Редагувати:
Користувач може дати команди, які читають бінарні дані зі stdin, такі як:
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
команду.) Якщо я Право, будь ласка, зробіть ваші приклади більш репрезентативними щодо вашого фактичного використання, щоб можна було дати кращу відповідь.