これは、IPC::Open3 に対するフォローアップの質問であり、子供が入力を待っているかどうかを判断しますが、明らかに関係はありません。
次のサンプル コードを見てください。
use strict;
use warnings;
use IPC::Run3;
sub foo
{
my $cmd = shift;
my $CH_IN = "foo\n";
run3($cmd, \$CH_IN, my $CH_OUT, my $CH_ERR);
return 1;
}
my @LIST = ( 'command','arg1','arg2','arg3' );
foo \@LIST;
上記のコードcommand
は別の perl スクリプトです。子スクリプトはwho -m
、端末から stdin の所有者を見つけるために呼び出します。これは、root または別の汎用システム ユーザーを使用して子スクリプトまたは親スクリプトが呼び出された場合に使用することを目的としています。
親から呼び出されたときに子から取得するエラーは次のとおりです。
Use of uninitialized value in split at child.pl line 354.
WHOAMI is undef
以下の子コード。
354行目あたりのコード:
# Function Name: 'determine_user'
# Function Inputs: 'Optional Scalar: Username to login as'
# Function Returns: 'If username is provided: Scalar: the username provided, If username is not provided: The output of who -m'
# Function Description: 'Figures out the user to login as'
sub determine_user
{
my $USER = shift;
if (!defined $USER)
{
my $WHOAMI;
open my $WHOPROC, q{-|}, 'who -m' or die "Unable to open 'who -m' for output.\n";
$WHOAMI=<$WHOPROC>;
close $WHOPROC or die "Unable to close 'who -m'.\n";
$USER = split m{[\s]+}xms, $WHOAMI or die "WHOAMI is undef\n"; # This is line 354
}
chomp $USER;
return $USER;
}
上記のコードは、コマンドラインから子スクリプトを呼び出すと問題なく動作しますwho -m
が、ターミナルの stdin の所有者を確認しようとしており、ターミナルが親スクリプトに置き換えられているため、呼び出す方法を見つける必要があると思います親から実行する場合は、エミュレートされた pty を使用して who -m を実行します。子、親、またはその両方を変更するかどうかは問題ではありません。両方を変更できるからです。
who -m
だから私の質問は、どうすれば親の中で子を実行し、それでも子に与えられた出力に頼ることができますか?
編集:池上は、彼の回答のコメントで最良の解決策を提供しました。質問には答えませんが、私の問題は解決します。
私の ssh デーモンは env var
SSH_TTY
を設定するので、perl -MFile::stat -E'say scalar(getpwuid(stat($ENV{SSH_TTY})->uid))'
.scalar(getpwuid($>))
設定されていない場合のデフォルト。