제가 작성하지 않은 대본이 있습니다. 실행되면 일부 정보를 인쇄한 다음 사용자가 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<<<
$