Chcę mieć możliwość wysyłania sygnałów (najważniejszy jest SIGINT) przez ssh.
To polecenie:
ssh server "sleep 1000;echo f" > foo
rozpocznie tryb uśpienia na serwerze i po 1000 sekundach umieści „f \ n” w pliku foo na moim komputerze lokalnym. Jeśli nacisnę CTRL-C (tj. Wyślę SIGINT do ssh), to zabije ssh, ale nie zabije snu na zdalnym serwerze. Chcę, żeby zabiło sen na zdalnym serwerze.
Więc próbowałem:
ssh server -t "sleep 1000;echo f" > foo
Ale jeśli stdin nie jest terminalem, pojawia się ten błąd:
Pseudo-terminal will not be allocated because stdin is not a terminal.
a następnie SIGINT nadal nie jest przekazywany.
Więc próbowałem:
ssh server -t -t "sleep 1000;echo f" > output
Ale wtedy wyjście w foo nie jest „f \ n”, ale zamiast „f \ r \ n”, co jest katastrofalne w mojej sytuacji (ponieważ moje dane wyjściowe to dane binarne).
W powyższym przykładzie używam „sleep 1000; echo f”, ale w rzeczywistości jest on dostarczany przez użytkownika, więc może zawierać wszystko. Jeśli jednak uda nam się sprawić, że będzie działał dla „snu 1000; echo f”, najprawdopodobniej sprawimy, że będzie działał we wszystkich realistycznych sytuacjach.
Naprawdę nie dbam o to, aby uzyskać pseudo-terminal na drugim końcu, ale nie byłem w stanie znaleźć żadnego innego sposobu na uzyskanie ssh do przekazania mojego SIGINT.
Czy jest inny sposób?
Edytować:
Użytkownik może wydawać polecenia odczytujące dane binarne ze standardowego wejścia, takie jak:
seq 1000 | gzip | ssh server "zcat|bzip2; sleep 1000" | bzcat > foo
Użytkownik może wydawać polecenia wymagające dużej mocy obliczeniowej, takie jak:
ssh server "timeout 1000 burnP6"
Edycja2:
Wydaje mi się, że wersja działa:
your_preprocessing |
uuencode a | ssh -tt -oLogLevel=quiet server "stty isig -echoctl -echo ; uudecode -o - |
your_command |
uuencode a" | uudecode -o - |
your_postprocessing
Dzięki digital_infinity za wskazanie mi właściwego kierunku.
ssh
musi być bardziej skomplikowane niż to, co pokazujesz jako przykłady, ponieważ możesz uzyskać pożądane zachowanie za pomocą prostej rearanżacji:sleep 1000 && ssh server "echo f" > foo
(Musi być&&
, nie;
, aby zabijaniesleep
uniemożliwiało uruchomieniessh
polecenia). Jeśli ja mam rację, proszę, aby przykłady były bardziej reprezentatywne dla faktycznego wykorzystania, aby można było podać lepszą odpowiedź.