这是一个后续问题IPC::Open3 并确定子进程是否正在等待输入 https://stackoverflow.com/questions/41454627/ipcopen3-and-determining-if-child-is-waiting-for-input尽管他们承认没有关系。
采取以下示例代码:
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
被喂给孩子?
编辑:ikegami 在他的答案的评论中提供了最佳解决方案。它没有回答问题,但它确实解决了我的问题。
我的 ssh 守护进程设置环境变量SSH_TTY
,所以你可以使用perl -MFile::stat -E'say scalar(getpwuid(stat($ENV{SSH_TTY})->uid))'
。默认为scalar(getpwuid($>))
如果没有设置。