sshを介してシグナル(SIGINTが最も重要)を送信できるようにしたい。
このコマンド:
ssh server "sleep 1000;echo f" > foo
サーバーでスリープを開始し、1000秒後にローカルマシンのファイルfooに「f \ n」を入れます。CTRL-Cを押す(つまり、sshにSIGINTを送信する)と、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」を使用していますが、実際にはユーザーが提供するため、何でも含めることができます。ただし、「sleep 1000; echo f」で機能させることができる場合は、現実的なすべての状況で機能させることができます。
反対側で擬似端末を取得することは本当に気にしませんが、SIGINTを転送するsshを取得する他の方法を見つけることができませんでした。
別の方法はありますか?
編集:
ユーザーは、次のような、stdinからバイナリデータを読み取るコマンドを指定できます。
seq 1000 | gzip | ssh server "zcat|bzip2; sleep 1000" | bzcat > foo
ユーザーは、次のようなCPU集中型のコマンドを指定できます。
ssh server "timeout 1000 burnP6"
編集2:
私のために働くと思われるバージョンは次のとおりです。
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