Perl:打开管道进行编写,但程序不是;“等待”;标准时间

Perl:打开管道进行编写,但程序不是;“等待”;标准时间,perl,pipe,stdout,stdin,Perl,Pipe,Stdout,Stdin,我正在尝试从perl脚本运行程序。 我将STDOUT和STDERR重定向到两个不同的文件。 我正在运行的程序要求输入一个密码,我试图将该密码打印到进程句柄,但由于该程序立即打印一个身份验证错误,警告我没有向STDIN写入任何内容,因此该密码不起作用 我使用的代码与此类似: my $s = qq(some_program > someprogram.out 2> someprogram.err); open(my $f, "|$s") or die "Couldn't run prog

我正在尝试从perl脚本运行程序。 我将STDOUT和STDERR重定向到两个不同的文件。 我正在运行的程序要求输入一个密码,我试图将该密码打印到进程句柄,但由于该程序立即打印一个身份验证错误,警告我没有向STDIN写入任何内容,因此该密码不起作用

我使用的代码与此类似:

my $s = qq(some_program > someprogram.out 2> someprogram.err);
open(my $f, "|$s") or die "Couldn't run program: $! $?";
# print `cat someprogram.out`; # An error has already been printed here!
print $f "password\n";
close $f or die "$!: $?";
我已经在perl调试器中运行了它,并注意到当调试器运行开放行时,我可以运行注释掉的打印行,并且错误已经在输出文件中

那么,为了让它工作,我忘记做什么了? 我如何告诉open“等待标准输入”

---更新

我在命令行中做了这样的测试:

echo password | some_program
并打印了身份验证错误。因此,看起来有些程序实际上不是从标准输入法而是从tty读取


有没有一种方法可以打印到tty以便程序可以在Perl中从那里读取密码?

考虑到
某些程序是一个bash脚本(Shell),它在命令行上接受密码,这可以使用Perl中的
系统调用来完成。系统调用,即Perl中的程序执行不会因为密码而停止,最好的办法是在使用系统调用调用程序之前向用户询问密码。使用backticks执行系统调用,如下所示

my $outfile="/path/to/someprogram.out";
my $errfile="/path/to/someprogram.err";
print "Enter password:\n";
$passwd=<>;
print "some_program $passwd\n";
`some_program $passwd > $outfile 2> $errfile`;

你确定某个程序正在从标准输入读取密码吗?如果某个程序是ssh,举一个例子,它可能试图从终端读取,这不一定与标准输入相同。嗨,mob。我不确定,但看起来情况就是这样。我有什么选择?Ssh不能很好地使用管道使用Expect。@mob@Len我想说的是,
一些程序没有从STDIN读取数据,也没有从终端执行;并不是说是宋承宪。我在命令行中做了一个类似的测试:
echo password | some_program
,出现身份验证错误。所以程序没有从标准输入读取数据。
my $outfile="/path/to/someprogram.out";
my $errfile="/path/to/someprogram.err";
print "Enter password:\n";
$passwd=<>;
my $command="some_program $passwd > $outfile 2> $errfile";
print "$command\n";
system($command);