원격 SSH의 파이프 에코

원격 SSH의 파이프 에코

제가 작성하지 않은 대본이 있습니다. 실행되면 일부 정보를 인쇄한 다음 사용자가 Enter 키를 누를 것으로 예상하고 정보의 마지막 부분을 인쇄합니다. 이것이 나에게 필요한 것입니다. 프로그래밍 방식으로 마지막 부분, 즉 출력의 마지막 줄을 가져와야 합니다. 다음과 같이 로컬에서 스크립트를 실행하면 다음과 같습니다.

RESULT=$(echo -ne '\n' | script $param)  

출력을 가져와 처리할 수 있지만 동일한 출력을 원격으로 실행하려고 하면, 즉

RESULT=$(echo -ne '\n' | ssh remoteserver script $param)  

스크립트가 정지됩니다. 새 라인의 파이프가 원격 SSH에서 작동하지 않는 것 같습니다.

이 문제를 어떻게 해결할 수 있나요?

고쳐 쓰다:
스크립트는 터미널에서 직접 입력을 받으며 만일의 경우를 대비해 Perl 스크립트입니다.

답변1

터미널을 위조하고 필요한 데이터를 "입력"하십시오. 먼저 testproggie원격 시스템에서 테스트 프로그램을 시작하십시오.

#!/usr/bin/env perl
use 5.14.0;
use warnings;

say "one thing";

open my $fh, '<', '/dev/tty' or die "nope on /dev/tty: $!\n";
readline $fh;

say "another thing";

개행 문자를 원격으로 사용하면 실패합니다.

$ printf "\n" | ssh test.example.edu ./testproggie
one thing
nope on /dev/tty: No such device or address
$ 

이제 remotenl로컬 시스템에서 터미널을 위조합니다.

#!/usr/bin/env expect

#set timeout 999
#match_max 99999

# this assumes the remote side does not do anything silly with
# the shell; if it does you may need to spawn a remote shell
# and then {send "./testproggie\r"} to that and then...
spawn -noecho ssh -q -t test.example.edu ./testproggie
# this can be improved if you know what the line before the
# wait-for-the-return-key will contain
expect -re .
send "\r"
expect eof

# this could be simplified with better expect calls, above
regexp {([^\r\n]+)\r\n$} $expect_out(buffer) unused lastline
puts ">>>$lastline<<<"

그리고 그것을 실행

$ ./remotenl
one thing

another thing
>>>another thing<<<
$ 

관련 정보