2012-07-30 76 views
1

我試圖從一個perl腳本運行一個程序。 我將STDOUT和STDERR重定向到兩個不同的文件。 我正在運行的程序要求輸入一個密碼,我嘗試打印到進程句柄,但這不起作用,因爲程序立即打印出一個驗證錯誤,警告我我沒有向STDIN寫入任何內容。Perl:打開管道進行寫入,但程序沒有「等待」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調試運行此,發現當調試運行開行,我可以運行註釋掉打印線和錯誤已經在輸出文件中。

那麼,我爲什麼忘了這麼做? 我如何判斷開放「等待STDIN」?

---更新!

我沒有在命令行這樣的試驗:

echo password | some_program 

和印刷的認證錯誤。所以它看起來像some_program實際上不是從STDIN讀取,而是從tty讀取。

有沒有一種方法可以打印到tty,以便程序可以從Perl那裏讀取密碼?

+2

你確定'some_program'是從標準輸入讀取密碼?如果'some_program'是ssh,爲了給出很多例子之一,它可能試圖從終端讀取,這與標準輸入不一定相同。 – mob 2012-07-30 18:24:40

+0

嗨,暴徒。我不確定,但看起來是這樣的。我有什麼選擇? – 2012-07-30 19:15:01

+0

Ssh不會和你的菸斗搭配得很好 - 使用Expect。 – 2012-07-30 21:57:17

回答

0

考慮到some_program是一個bash腳本(Shell),它在其命令行上接受密碼,這可以使用perl中的system調用完成。系統調用,即Perl內的程序執行不會暫停密碼,最好的方法是在使用系統調用調用程序之前先詢問用戶密碼。使用反引號執行系統調用,如下所示;

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`; 

或使用system();

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);