Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何在没有tty的情况下通过ssh检索用于执行sudo命令的用户ID_Bash_Unix_Ssh_Ksh_Sudo - Fatal编程技术网

Bash 如何在没有tty的情况下通过ssh检索用于执行sudo命令的用户ID

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:

在没有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-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变量,但它们会被覆盖