通过管道传输远程 ssh 中的 echo

通过管道传输远程 ssh 中的 echo

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

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<<<
$ 

相关内容