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以从终端查找谁拥有标准输入,这是为了在使用 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试图查看谁拥有终端的标准输入并且终端已被父脚本替换,我相信我需要找到一种方法来调用从父级运行时使用模拟 pty 的 who -m。无论是通过修改孩子还是父母或两者都无关紧要,因为我可以同时修改两者。

所以我的问题是:我怎样才能在父母内部运行孩子并且仍然依赖who -m被喂给孩子的输出?

编辑:ikegami 在他的回答评论中提供了最好的解决方案。它没有回答问题,但确实解决了我的问题。

我的 ssh 守护进程设置了 env var SSH_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并使用 just who

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

或者,您可以改用$ENV{USER}or getpwuid($>)(进程正在执行的用户的名称)。

于 2017-01-06T07:58:12.693 回答