【问题标题】:How can I retrieve the userid used to execute sudo command via ssh without a tty如何在没有 tty 的情况下通过 ssh 检索用于执行 sudo 命令的用户 ID
【发布时间】:2016-11-15 23:52:37
【问题描述】:

在没有 tty 的情况下,获取通过 ssh 对系统进行身份验证并执行以下命令(作为示例)的用户 ID 的最佳方法是什么。

tty 在技术上是不可能的,因为这些命令将通过 pssh 执行并在许多系统中自动执行。

>ssh -q node1 "sudo su - idm -c 'who am i'"
>ssh -q node1 "sudo su - idm -c 'echo hello'"
hello
>ssh -q node1"sudo su - idm -c 'logname'"
logname: no login name

【问题讨论】:

  • 我能够在更简单的场景中从 ssh 执行各种命令,例如ssh tharrison@myremotenode "whoami"logname 也有效,但 who am i 没有。请编辑您的答案以包含有关用户idm 的性质的信息——当您在node1 上登录终端时,您的输出是什么?
  • 问题不在于命令不起作用,因为它们显然起作用了。我要确定的是“登录”到系统并执行原始 sudo su - 从执行的命令中。
  • 是的,当然这些命令在您的终端会话的上下文中工作。但是 tty 和远程会话在环境方面非常不同——例如,可能某些命令依赖于 tty 才能工作,而远程会话中没有这些命令。 sudo 也增加了皱纹。据我所知,您的问题中没有足够的关于上下文的信息来提供权威的答案。

标签: bash unix ssh ksh sudo


【解决方案1】:

可能不是最好的解决方案,但有一种方法可以在实际执行预期命令之前捕获用户名,如下所示:ssh -q node1 'sudo su - idm -c "echo $USER"'

USER 变量将包含用于连接到“node1”的用户,因为它是在登录期间初始化的,有或没有 tty。该变量将在 ssh 运行后和 sudo 命令启动之前被替换。 使用的引号很重要,因为在 ssh 实际启动之前不应替换变量。 如果您想从脚本内部启动命令,这将没有用处,除非您提供 $USER 作为该脚本的参数,然后从参数列表内部使用它。

另一种可能性是使用 Parent PID ,这是另一个可用的变量,可以通过爬回进程树来找到: ssh -q node1 'sudo su - idm -c "ps -hp $PPID -o user"' 将显示“sshuser”。

或者从脚本内部(不是很好,但它有效):

# cat ~idm/test.sh
#!/bin/bash -x
SSHUSER=$(ps -hp $(ps -hp $(ps -hp $PPID -o ppid) -o ppid) -o user)
echo $SSHUSER

执行:

# ssh node1 'sudo su - idm -c "./test.sh"'
sshuser

有3个“ps”命令,因为脚本的父级是“su”,“su”的父级是“sudo”,最后“sudo”的父级持有您需要的用户名。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    我首先要说我似乎无法复制您的问题。

    $ ssh -T pc "sudo su - ghoti2 -c 'whoami'"
    ghoti2
    $ ssh -T pc "sudo su - ghoti2 -c 'logname'"
    ghoti
    

    -T 选项应该禁用 tty 的分配,但 logname 仍然有效。这在我们正在运行的操作系统中可能存在细微差别。我使用 FreeBSD。你还没有提到你正在使用什么。

    也就是说,如果问题是您的登录使用被sudo 隐藏,您可能需要查看广告调整您的sudo 配置和使用情况。

    例如,以下 sudo 配置使登录用户对正在运行的命令可见:

        Defaults>root          !set_logname
    

    来自man sudoers 的该选项的文档指出:

       set_logname     Normally, sudo will set the LOGNAME, USER and USERNAME
                       environment variables to the name of the target user
                       (usually root unless the -u option is given).  However,
                       since some programs (including the RCS revision control
                       system) use LOGNAME to determine the real identity of
                       the user, it may be desirable to change this behavior.
                       This can be done by negating the set_logname option.
                       Note that if the env_reset option has not been
                       disabled, entries in the env_keep list will override
                       the value of set_logname.  This flag is on by default.
    

    请注意,无论是否设置,当您误用 sudo 并使用它启动 su 时,您就否定了它的有用性。即使在我的 sudo 配置中禁用了此选项,我也会得到以下信息:

    $ ssh -T pc sudo su - ghoti2 -c env
    TERM=su
    BLOCKSIZE=K
    MAIL=/var/mail/ghoti2
    PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/home/ghoti2/bin
    SHELL=/bin/tcsh
    HOME=/home/ghoti2
    USER=ghoti2
    HOSTTYPE=FreeBSD
    VENDOR=amd
    OSTYPE=FreeBSD
    MACHTYPE=x86_64
    SHLVL=1
    PWD=/home/ghoti2
    LOGNAME=ghoti2
    GROUP=unknown
    HOST=pc
    

    在这种情况下,虽然 sudo 可能会保留 LOGNAME、USER 和 USERNAME 变量,但它们会被 su - 覆盖。

    但如果我正确使用sudo 选项,我也可以这样做:

    $ ssh pc sudo -u ghoti2 env
    PATH=/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/ghoti/bin:/usr/X11R6/bin:/usr/games
    TERM=su
    LC_COLLATE=C
    SHELL=/bin/tcsh
    LOGNAME=ghoti2
    USER=ghoti2
    USERNAME=ghoti2
    MAIL=/var/mail/ghoti2
    HOME=/home/ghoti2
    SUDO_COMMAND=/usr/bin/env
    SUDO_USER=ghoti
    SUDO_UID=1001
    SUDO_GID=1001
    

    注意$SUDO_USER 变量。它作为环境的一部分提供给sudo 运行的任何东西。当然,在你的使用中,它是不可用的,因为你通过运行su -消除了这部分环境。 (您应该man su 了解详情。)


    或者,如果不能改进您的 sudo 使用,那么将登录用户作为参数提供给通过 sudo 运行的任何内容怎么样?

    $ ssh node1 "sudo su - idm -c '/path/to/script $USER'"
    

    这将包括由连接的客户端扩展的$USER 变量。或者,通过颠倒引号:

    $ ssh node1 'sudo su - idm -c "/path/to/script $USER"'
    

    您可以确保$USER 在远程端展开。

    然后,在 script 中,变量 $1 将是使用 sudo 进行身份验证的用户名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多