2

これは、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 varSSH_TTYを設定するので、perl -MFile::stat -E'say scalar(getpwuid(stat($ENV{SSH_TTY})->uid))'. scalar(getpwuid($>))設定されていない場合のデフォルト。

4

1 に答える 1

1

who -m特に標準入力に接続された端末に関する情報を提供します。

-m     only hostname and user associated with stdin

端末を交換したため、端末から情報を取得できません。

$ who -m
ikegami  pts/1        ...

$ who -m </dev/null

$

をドロップして-m、 だけを使用できますwho

$ who </dev/null
ikegami  pts/1        ...

$ENV{USER}または、代わりにor getpwuid($>)(プロセスを実行しているユーザーの名前) を使用することもできます。

于 2017-01-06T07:58:12.693 に答える