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.
sshharus 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 pembunuhansleepmencegahsshperintah untuk menjalankan.) Jika saya Benar, tolong jadikan contoh Anda lebih representatif dari penggunaan Anda yang sebenarnya, sehingga jawaban yang lebih baik dapat diberikan.