Bash 如何在没有tty的情况下通过ssh检索用于执行sudo命令的用户ID
在没有tty的情况下,获取通过ssh向系统进行身份验证并执行以下命令(作为示例)的用户ID的最佳方法是什么 tty在技术上是不可能的,因为这些命令将通过pssh执行,并在许多系统中自动执行Bash 如何在没有tty的情况下通过ssh检索用于执行sudo命令的用户ID,bash,unix,ssh,ksh,sudo,Bash,Unix,Ssh,Ksh,Sudo,在没有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:
>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-q node1'sudo su-idm-c“echo$USER”
用户变量将包含用于连接到“node1”的用户,因为它是在登录期间初始化的,有或没有tty。该变量将在ssh运行之后和sudo命令启动之前被替换。
使用的引号很重要,因为在实际启动ssh之前不应替换变量。
如果您希望从脚本内部启动命令,则此命令无效,除非您将$USER作为参数提供给该脚本,然后从参数列表中在内部使用它
另一种可能性是使用父PID,这是另一个可用变量,可以通过返回流程树找到:
ssh-q node1'sudo su-idm-c“ps-hp$PPID-o user”
将显示“sshuser”
或者从脚本内部(虽然不是很好,但很有效):
执行时:
# ssh node1 'sudo su - idm -c "./test.sh"'
sshuser
有3个“ps”命令,因为脚本的父级是“su”,“su”的父级是“sudo”,最后,“sudo”的父级保存着您需要的用户名
我希望它能帮助您。可能不是最好的解决方案,但有一种方法可以在实际执行预期命令之前捕获用户名,如:
ssh-q node1'sudo su-idm-c“echo$USER”
用户变量将包含用于连接到“node1”的用户,因为它是在登录期间初始化的,有或没有tty。该变量将在ssh运行之后和sudo命令启动之前被替换。
使用的引号很重要,因为在实际启动ssh之前不应替换变量。
如果您希望从脚本内部启动命令,则此命令无效,除非您将$USER作为参数提供给该脚本,然后从参数列表中在内部使用它
另一种可能性是使用父PID,这是另一个可用变量,可以通过返回流程树找到:
ssh-q node1'sudo su-idm-c“ps-hp$PPID-o user”
将显示“sshuser”
或者从脚本内部(虽然不是很好,但很有效):
执行时:
# ssh node1 'sudo su - idm -c "./test.sh"'
sshuser
有3个“ps”命令,因为脚本的父级是“su”,“su”的父级是“sudo”,最后,“sudo”的父级保存着您需要的用户名
我希望它能对你有所帮助。首先我要说,我似乎不能重复你的问题
$ 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!设置日志名
此选项的文档来自man sudoers
,其中说明:
请注意,无论是否设置了此选项,当您错误地使用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\u 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进行身份验证的用户名。首先,我要说,我似乎无法复制您的问题
$ 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!设置日志名
此选项的文档来自man sudoers
,其中说明:
请注意,无论是否设置了此选项,当您错误地使用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变量,但它们会被覆盖