我正在尝试使用 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]
如果有任何区别......叹息。
答案1
即使考虑到对问题的编辑,这个答案仍然应该对你有帮助。特别是,使用创建的帐户
--disabled-login
没有设置密码,也没有其他方式在登录,但仍可以使用sudo
(如下所述)以用户身份运行命令或 shell。事实上,这就是root
在 Ubuntu 中设置帐户的方式。
该命令存在多个问题su - irssi
。
此命令尝试启动 shell拥有名为irssi
。
如果发生以下情况,它将失败:
- 没有
irssi
用户。 - 该
irssi
用户的帐户已被禁用。 - 用户
irssi
的帐户被禁用,无法进行交互式登录。有时,帐户被允许使用 FTP 等服务,但通过将 shell 设置为立即退出的命令(如 )来禁止正常登录/bin/false
。然后登录立即结束,没有任何消息。 - 您输入的密码对于用户来说不正确
irssi
。
该-
标志使得 shell 模拟初始登录 shell——也就是说,它实际上非常类似于以 身份登录irssi
。如果没有该-
标志,如果su
命令成功执行,您仍然会获得 拥有的 shell irssi
,但环境变量HOME
将保持不变。
如果你想运行一个程序称为 irssi
,则必须以su
不同的方式调用:
su username - -c irssi
如果你省略,它的作用相同——它会尝试以 root 身份运行该命令。-c username
-c root
或者你可以启动 shell 然后运行命令:
- 使用 启动 shell 。
su username -
- 在 shell 中,运行命令 (
irssi
)。 - 如果你已完成,请运行 退出 shell
exit
。
运行命令root
如果你想以irssi
身份运行root
,su
这不是办法。root 登录是在 Ubuntu 上默认禁用,并且很少有理由重新启用它们。如果您已启用root
登录,那么您应该能够使用su
成为root
。无需启用该帐户的原因root
是,无论是否启用,您仍然可以像root
使用一样运行命令sudo
。
当您使用 运行命令时sudo
,您输入你的密码,不是您希望以其身份运行命令的用户的密码。只有管理员可以像 一样运行任意命令root
(当然sudo
,除非您重新配置sudo
以允许其他人这样做)。因此,未获准管理系统的用户不得使用root
自己的密码像 一样运行命令。
运行方式irssi
如下:root
sudo
sudo irssi
你会进入你的提示时输入密码,而不是root
。
除了您输入的密码外,它还执行与以下内容相同的操作:
su -c irssi
但该sudo
版本可以成功,因为它不需要root
启用帐户。
和 一样su
,你可以sudo
使用以另一个非root
用户身份运行命令irssi
.以以下身份运行username
和sudo
:
sudo -u username irssi
如果你想sudo
表现su -
得像HOME
——也就是说,您想使用目标用户的HOME
环境变量,您可以sudo
使用该-H
标志运行:
sudo -H irssi
sudo -H -u username irssi
您可以使用 启动整个 shell sudo
,就像使用 一样su
。除了您输入的密码不同之外,此命令与 具有相同的效果su
:
sudo -s
此命令与下列命令效果相同su -
:
sudo -i
(i
代表初始登录 shell。
您也可以以另一个用户的身份启动 shell:
sudo -u username -s
sudo -u username -i
进一步阅读sudo
要了解更多信息sudo
, 看一眼:
为什么没gksu
起作用呢?su
gksu
可能有效通过运行sudo
。
gksu
是一个前端两个都 su
和sudo
。在 Ubuntu 中,它默认使用sudo
(因为在 Ubuntu 中,su
通常不用于成为root
,而只是成为其他非root
用户的次要方式)。
您可以通过运行来将gksu
其用作su
前端gksu --su-mode
。
您可以通过运行 来了解 是否gksu
处于su
模式或sudo
模式,并且(如果您愿意)更改此设置gksu-properties
。这是每个用户的设置。
当gksu
处于sudo
模式时,其行为与 相同gksudo
。
进一步阅读gksu
- Ubuntu 社区 wiki 的这个子部分,关于“图形
sudo
”。 man gksu
- 上游
gksu
网站(由 的制作者制作gksu
)。 - Stefano Palazzo 的回答在这里关于解释Ubuntu 中的
gksu
vs .。gksudo
解决方案后分析
您最终发现,您可以使用以下命令运行必要的命令:
sudo -u username irssi
(这是上面列出的技术之一。)
最终,您报告了两条信息,足以解释为什么其他技术失败了,而这个技术却成功了:
这
username
帐户创建时带有--disabled-login
标志,这使得它具有没有密码(并且没有其他登录方式)。没有密码并不意味着可以使用空白密码。 它的意思是没有密码足以进行身份验证。结合消除其他身份验证手段,这意味着username
根本无法进行身份验证。因此,所有
su
基于 的解决方案都行不通。sudo
但是,由于sudo
您没有以您要冒充的用户的身份进行身份验证,因此您必须已授权冒充他们,并以您自己的身份进行身份验证(即输入您自己的密码,而不是他们的密码)。可以为帐户设置密码,从而消除登录障碍:
sudo passwd username
但是,不允许用户登录可能有充分的理由。例如,如果允许此用户登录并以图形方式登录,那么用户的环境或权限是否不适合运行 X11 应用程序,这是否会导致严重问题?如果此用户可以登录,那么是否可以以该用户身份远程登录(对于已公开网络服务的计算机)?
如果您想重新禁用它:
sudo passwd -dl username
这
username
帐户有/bin/false
其登录 shell。当像这样的 shell
bash
作为您的登录 shell 运行时,它会设置您的环境并为您提供一个交互式提示来控制机器。/bin/false
另一方面,当运行时什么也没做, 和报告失败. (/bin/true
不执行任何操作并报告成功。)false
和命令true
在编写脚本和进行各种测试时很有用,但也可用于禁用帐户,以便当有人登录时,他们的登录会话立即结束。这样,就可以启用密码(或其他身份验证方式),人们可以登录,但不能外壳访问。例如,如果有 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
均已禁用密码和“已禁用” shell。由于缺少有效的密码,所有su
基于 的解决方案都无法工作,而由于缺少有效的交互式登录 shell,所有基于 shell 的解决方案都无法工作(手动调用 shell 除外,如)。sudo -u username bash
sudo -u username command
是剩下的。