我有一个不是我写的剧本。当它运行时,它会输出一些信息,然后期望用户按回车键,然后输出最后一部分信息。这就是我需要的。我需要以编程方式获取最后一部分,即最后一行输出。当我在本地运行脚本时,如下所示:
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<<<
$