Saya ingin dapat mengirim sinyal (SIGINT adalah yang paling penting) melalui ssh.
Perintah ini:
ssh server "sleep 1000;echo f" > foo
akan mulai tidur di server dan setelah 1000 detik akan meletakkan 'f \ n' di file foo di mesin lokal saya. Jika saya menekan CTRL-C (yaitu mengirim SIGINT ke ssh) itu akan mematikan ssh, tetapi tidak akan mematikan sleep di server jauh. Saya ingin mematikan tidur di server jauh.
Jadi saya mencoba:
ssh server -t "sleep 1000;echo f" > foo
Tetapi jika stdin bukan terminal saya mendapatkan kesalahan ini:
Pseudo-terminal will not be allocated because stdin is not a terminal.
dan kemudian SIGINT masih belum diteruskan.
Jadi saya mencoba:
ssh server -t -t "sleep 1000;echo f" > output
Tapi kemudian output di foo bukan 'f \ n' tetapi sebaliknya 'f \ r \ n' yang merupakan bencana dalam situasi saya (karena output saya adalah data biner).
Di atas saya menggunakan "sleep 1000; echo f", tetapi pada kenyataannya yang disediakan oleh pengguna, sehingga dapat berisi apa saja. Namun, jika kita dapat membuatnya berfungsi untuk "sleep 1000; echo f" kita kemungkinan besar dapat membuatnya bekerja untuk semua situasi yang realistis.
Saya benar-benar tidak peduli tentang mendapatkan terminal semu di ujung lain, tetapi saya tidak dapat menemukan cara lain untuk mendapatkan ssh untuk meneruskan SIGINT saya.
Apakah ada cara lain?
Edit:
Pengguna dapat memberikan perintah yang membaca data biner dari stdin, seperti:
seq 1000 | gzip | ssh server "zcat|bzip2; sleep 1000" | bzcat > foo
Pengguna dapat memberikan perintah yang intensif cpu, seperti:
ssh server "timeout 1000 burnP6"
Sunting2:
Versi yang sepertinya berfungsi untuk saya adalah:
your_preprocessing |
uuencode a | ssh -tt -oLogLevel=quiet server "stty isig -echoctl -echo ; uudecode -o - |
your_command |
uuencode a" | uudecode -o - |
your_postprocessing
Terima kasih kepada digital_infinity karena mengarahkan saya ke arah yang benar.
ssh
harus lebih rumit daripada apa yang Anda tunjukkan sebagai contoh, karena Anda bisa mendapatkan perilaku yang Anda inginkan dengan penataan ulang sederhana:sleep 1000 && ssh server "echo f" > foo
(Itu harus&&
, tidak;
, sehingga pembunuhansleep
mencegahssh
perintah untuk menjalankan.) Jika saya Benar, tolong jadikan contoh Anda lebih representatif dari penggunaan Anda yang sebenarnya, sehingga jawaban yang lebih baik dapat diberikan.