1

perl スクリプトからプログラムを実行しようとしています。STDOUT と STDERR を 2 つの異なるファイルにリダイレクトします。私が実行しているプログラムは、プロセスハンドルに出力しようとするパスワードを要求しますが、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を待つ」ようにopenに指示するにはどうすればよいですか?

- -アップデート!

コマンドラインで次のようなテストを行いました。

echo password | some_program

認証エラーが出力されました。そのため、some_programは実際には STDIN からではなく tty から読み取っているようです。

プログラムがPerlでそこからパスワードを読み取ることができるように、ttyに出力する方法はありますか?

4

1 に答える 1

0

コマンドラインでパスワードを受け入れるbashスクリプト(シェル)であると考えると、これはperlの呼び出しをsome_program使用して実行できます。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);
于 2012-07-30T23:29:27.013 に答える