ssh를 통해 신호를 보낼 수 있기를 원합니다 (SIGINT가 가장 중요합니다).
이 명령은
ssh server "sleep 1000;echo f" > foo
서버에서 절전 모드를 시작하고 1000 초 후에 로컬 시스템의 foo 파일에 'f \ n'을 넣습니다. CTRL-C를 누르면 (즉, SIGINT를 ssh로 전송) 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
. 실행 명령)하는 경우 I 맞습니다. 실제 사용량을 더 잘 대표 할 수 있도록 더 나은 답변을 드릴 수 있도록 예제를 작성하십시오.