这是 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($>))
如果未设置,则默认为。