问题描述
我正在尝试使用 su 命令以另一个用户身份运行应用程序
在这种情况下,我正在尝试运行 irssi
blah@ubuntu: su - [username] irssi
(enter password)
blah@ubuntu:
(nothing happens)
blah@ubuntu: su - [username] -c irssi
(nothing)
我运行 gksu 并设置相同的参数,它可以工作,并且不要求我输入用户密码。问题是什么?我该如何解决?
我应该注意用户是这样创建的
adduser --system --disabled-login [username]
如果有什么不同的话……叹息。
最佳方法
This answer should still help you, even taking the edits to the question into account. In particular, an account created with
--disabled-login
has no password set and no other means of logging in, but it should still be possible to usesudo
(explained below) to run commands or a shell as the user. This is, in fact, how theroot
account is set up in Ubuntu.
命令 su - irssi
存在多个问题。
此命令尝试启动名为 irssi
的用户拥有的 shell。
如果出现以下情况,它将失败:
-
没有
irssi
用户。 -
irssi
用户的帐户被禁用。 -
irssi
用户的帐户已禁用交互式登录。有时,允许帐户使用 FTP 等服务,但通过将其 shell 设置为立即退出的内容(如/bin/false
)来禁止其正常登录。然后登录立即结束,没有任何消息。 -
您输入的密码对于
irssi
用户不正确。
-
标志使得 shell 模拟了一个初始登录 shell——也就是说,它真的很像以 irssi
登录。如果没有 -
标志,如果 su
命令成功,您仍然会获得 irssi
拥有的 shell ,但 HOME
等环境变量将保持不变。
如果您想运行名为 irssi
的程序,则必须以不同的方式调用 su
:
su username - -c irssi
如果您省略 -c username
,则它与 -c root
相同 – 它尝试以 root 身份运行命令。
或者,您可以启动一个 shell,然后运行以下命令:
-
使用
su username -
启动 shell。 -
在 shell 中,运行命令 (
irssi
)。 -
如果完成,请运行
exit
离开 shell。
以 root
运行命令
如果您想将 irssi
作为 root
运行,则 su
不是这样做的方法。根登录是 disabled by default on Ubuntu, and there is only rarely any reason to re-enable them 。如果您启用了 root
登录,那么您应该可以使用 su
成为 root
。无需启用 root
帐户的原因是,无论您是否启用,您仍然可以使用 root
和 sudo
运行命令。
当您使用 sudo
运行命令时,输入您的密码,而不是您希望运行命令的用户的密码。只有管理员可以使用 root
和 sudo
运行任意命令(当然,除非您重新配置 sudo
以允许其他人这样做)。因此,不允许管理系统的用户使用自己的密码以 root
的身份运行命令。
使用 sudo
将 irssi
作为 root
运行:
sudo irssi
你会在提示时输入你的密码,而不是 root
的。
除了您输入的密码外,这与以下内容相同:
su -c irssi
除了 sudo
版本可以成功,因为它不需要启用 root
帐户。
与 su
一样,您可以使用 sudo
作为另一个非 root
用户运行命令。使用 sudo
将 irssi
作为 username
运行:
sudo -u username irssi
如果您希望 sudo
在 HOME
方面表现得像 su -
——也就是说,您想使用目标用户的 HOME
环境变量,您可以使用 -H
标志运行 sudo
:
sudo -H irssi
sudo -H -u username irssi
您可以使用 sudo
启动整个 shell,就像使用 su
一样。除了输入谁的密码外,此命令与 su
的效果相同:
sudo -s
此命令与 su -
具有相同的效果:
sudo -i
(i
代表初始登录 shell。)
您也可以以其他用户身份启动 shell:
sudo -u username -s
sudo -u username -i
进一步阅读 sudo
要了解有关 sudo
的更多信息,请查看:
-
上游
sudo
站点(由sudo
的作者提供)。 -
man sudo
为什么 gksu
不工作而 su
工作?
gksu
可能通过运行 sudo
来工作。
gksu
是 su
和 sudo
的前端。在 Ubuntu 中,它默认使用 sudo
(因为在 Ubuntu 中,su
通常不用于成为 root
,而只是成为其他非 root
用户的次要方式)。
您可以通过运行 gksu --su-mode
使 gksu
使用 su
作为前端。
您可以通过运行 gksu-properties
来确定 gksu
是处于 su
模式还是 sudo
模式,并且(如果您愿意)更改此设置。这是一个 per-user 设置。
当 gksu
处于 sudo
模式时,它的行为与 gksudo
相同。
进一步阅读 gksu
-
This subsection of the Ubuntu community wiki ,在“图形
sudo
”上。 -
man gksu
-
上游
gksu
网站(由gksu
的制造商提供)。 -
Stefano Palazzo’s answer here 关于在 Ubuntu 中解释
gksu
与gksudo
。
Post-Solution 分析
您最终发现您能够使用以下命令运行必要的命令:
sudo -u username irssi
(这是上面列出的技术。)
最终,您报告了两条信息,足以解释为什么其他技术失败了,但成功了:
-
username
帐户是使用--disabled-login
标志创建的,这使得它没有密码(也没有其他登录方式)。没有密码并不意味着可以使用空白密码登录。这意味着没有密码足以进行身份验证。结合其他身份验证方式的消除,这意味着username
根本无法进行身份验证。因此,所有基于
su
的解决方案都已淘汰。但是sudo
可以工作,因为使用sudo
您不会以您将要模拟的用户身份进行身份验证。相反,您必须是 authorized 才能冒充他们,并以您自己的身份进行身份验证(即输入您自己的密码,而不是他们的密码)。可以在帐户上设置密码,从而消除登录障碍:
sudo passwd username
但是,不允许用户登录可能是有充分理由的。例如,如果允许该用户登录并以图形方式登录,那么用户的环境或权限不适合运行 X11 应用程序是否会出现不好的问题?如果该用户可以登录,是否可以以该用户的身份远程登录(对于您已公开网络服务的机器)?
如果你想 re-disable 它:
sudo passwd -dl username
相关:Re-disabling 临时启用后的
root
帐户。 -
username
帐户将/bin/false
作为其登录 shell。当像
bash
这样的 shell 作为您的登录 shell 运行时,它会设置您的环境并为您提供控制机器的交互式提示。另一方面,当
/bin/false
运行时,它什么也不做,并报告失败。 (/bin/true
什么都不做并报告成功。)false
和true
命令在脚本编写和各种测试目的中很有用,但也可用于禁用帐户,以便当有人登录时,他们的登录会话立即结束。这样,可以启用密码(或其他身份验证方式),并且人们可以登录,但不能用于 shell 访问。例如,如果有 FTP 服务器,他们仍然可以通过 FTP 访问他们的帐户。如果有 SSH 服务器,他们将无法通过 SSH 获取 shell,但他们仍然可以使用sftp
和scp
传输文件。由于
username
的登录 shell 不起作用,因此su username
、su - username
、sudo -u username -s
和sudo -u username -i
等命令无法工作。但是不提供 shell 的命令,如
sudo -u username command
或su username -c 'command'
仍然可以工作。由于可以运行命令,因此您可以将用户的登录 shell 更改为功能:
sudo chsh -s /bin/bash username
但是,这也应该谨慎进行,因为可能有充分的理由禁用用户的交互式登录。
在这里,username
都禁用了密码和 “disabled” shell。没有任何工作密码会阻止所有基于 su
的解决方案工作,而没有工作的交互式登录 shell 会阻止所有 shell-spawning 解决方案工作(除了手动调用 shell,如 sudo -u username bash
)。
sudo -u username command
是剩下的。