Voglio essere in grado di inviare segnali (SIGINT è il più importante) tramite ssh.
Questo comando:
ssh server "sleep 1000;echo f" > foo
inizierà lo sleep sul server e dopo 1000 secondi inserirà 'f \ n' nel file foo sul mio computer locale. Se premo CTRL-C (cioè invio SIGINT a ssh), ucciderà ssh, ma non ucciderà la sospensione sul server remoto. Voglio che uccida il sonno sul server remoto.
Quindi ho provato:
ssh server -t "sleep 1000;echo f" > foo
Ma se stdin non è un terminale ottengo questo errore:
Pseudo-terminal will not be allocated because stdin is not a terminal.
e quindi SIGINT non viene ancora inoltrato.
Quindi ho provato:
ssh server -t -t "sleep 1000;echo f" > output
Ma poi l'output in foo non è 'f \ n' ma invece 'f \ r \ n' che è disastroso nella mia situazione (dato che il mio output è un dato binario).
In quanto sopra uso "sleep 1000; echo f", ma in realtà viene fornito dall'utente, quindi può contenere qualsiasi cosa. Tuttavia, se riusciamo a farlo funzionare per "sleep 1000; echo f", molto probabilmente possiamo farlo funzionare per tutte le situazioni realistiche.
Non mi interessa davvero ottenere uno pseudo-terminale dall'altra parte, ma non sono stato in grado di trovare nessun altro modo di ottenere ssh per inoltrare il mio SIGINT.
C'è un altro modo?
Modificare:
L'utente può dare comandi che leggono dati binari da stdin, come:
seq 1000 | gzip | ssh server "zcat|bzip2; sleep 1000" | bzcat > foo
L'utente potrebbe fornire comandi ad alta intensità di CPU, come:
ssh server "timeout 1000 burnP6"
Edit2:
La versione che sembra funzionare per me è:
your_preprocessing |
uuencode a | ssh -tt -oLogLevel=quiet server "stty isig -echoctl -echo ; uudecode -o - |
your_command |
uuencode a" | uudecode -o - |
your_postprocessing
Grazie a digital_infinity per avermi indicato nella giusta direzione.
ssh
debba essere più complicato di quello che mostri come esempi, perché puoi ottenere il comportamento che desideri con un semplice riarrangiamento:sleep 1000 && ssh server "echo f" > foo
(Deve essere&&
, no;
, in modo che l'uccisionesleep
impedisca l'ssh
esecuzione del comando.) Se io ho ragione, rendi i tuoi esempi più rappresentativi del tuo reale utilizzo, in modo da poter dare una risposta migliore.