Perl IPC::Run3:如何为子进程模拟标准输入的 pty?

2024-04-14

这是一个后续问题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($>))如果没有设置。


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($>)(执行进程的用户名)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Perl IPC::Run3:如何为子进程模拟标准输入的 pty? 的相关文章

随机推荐