Tôi muốn có thể gửi tín hiệu (SIGINT là quan trọng nhất) thông qua ssh.
Lệnh này:
ssh server "sleep 1000;echo f" > foo
sẽ bắt đầu ngủ trên máy chủ và sau 1000 giây, nó sẽ đặt 'f \ n' vào tệp foo trên máy cục bộ của tôi. Nếu tôi nhấn CTRL-C (tức là gửi SIGINT tới ssh) thì nó sẽ giết ssh, nhưng nó sẽ không giết được giấc ngủ trên máy chủ từ xa. Tôi muốn nó giết giấc ngủ trên máy chủ từ xa.
Vì vậy, tôi đã cố gắng:
ssh server -t "sleep 1000;echo f" > foo
Nhưng nếu stdin không phải là thiết bị đầu cuối, tôi gặp lỗi này:
Pseudo-terminal will not be allocated because stdin is not a terminal.
và sau đó SIGINT vẫn không được chuyển tiếp.
Vì vậy, tôi đã cố gắng:
ssh server -t -t "sleep 1000;echo f" > output
Nhưng sau đó, đầu ra trong foo không phải là 'f \ n' mà thay vào đó là 'f \ r \ n', điều này thật tai hại trong tình huống của tôi (vì đầu ra của tôi là dữ liệu nhị phân).
Ở trên tôi sử dụng "ngủ 1000; echo f", nhưng trong thực tế được cung cấp bởi người dùng, do đó nó có thể chứa bất cứ thứ gì. Tuy nhiên, nếu chúng ta có thể làm cho nó hoạt động cho "ngủ 1000; echo f" thì rất có thể chúng ta có thể làm cho nó hoạt động cho tất cả các tình huống thực tế.
Tôi thực sự không quan tâm đến việc có một thiết bị đầu cuối giả ở đầu kia, nhưng tôi đã không thể tìm thấy bất kỳ cách nào khác để có được ssh để chuyển tiếp SIGINT của tôi.
Có cách nào khác không?
Chỉnh sửa:
Người dùng có thể đưa ra các lệnh đọc dữ liệu nhị phân từ stdin, chẳng hạn như:
seq 1000 | gzip | ssh server "zcat|bzip2; sleep 1000" | bzcat > foo
Người dùng có thể đưa ra các lệnh chuyên sâu về cpu, như:
ssh server "timeout 1000 burnP6"
Chỉnh sửa2:
Phiên bản có vẻ phù hợp với tôi là:
your_preprocessing |
uuencode a | ssh -tt -oLogLevel=quiet server "stty isig -echoctl -echo ; uudecode -o - |
your_command |
uuencode a" | uudecode -o - |
your_postprocessing
Cảm ơn digital_infinity đã chỉ cho tôi đi đúng hướng.
ssh
phải phức tạp hơn những gì bạn thể hiện như các ví dụ, bởi vì bạn có thể có được hành vi bạn muốn với một sự sắp xếp lại đơn giản:sleep 1000 && ssh server "echo f" > foo
(Nó phải&&
, không;
, để việc giết chếtsleep
ngănssh
lệnh chạy.) Nếu tôi 'đúng, xin vui lòng làm cho các ví dụ của bạn đại diện hơn cho việc sử dụng thực tế của bạn, để có thể đưa ra câu trả lời tốt hơn.