如何以禁用登录的用户身份运行命令?

use*_*361 22 sudo su

我正在尝试使用 su 命令以另一个用户身份运行应用程序

在这种情况下,我正在尝试运行 irssi

blah@ubuntu: su - [username] irssi
(enter password)

blah@ubuntu:
(nothing happens)

blah@ubuntu: su - [username] -c irssi
(nothing)
Run Code Online (Sandbox Code Playgroud)

我运行 gksu 并设置相同的参数,它可以工作,并且不会询问我的用户密码。问题是什么?我该如何解决?

我应该注意到用户是这样创建的

adduser --system --disabled-login [username]
Run Code Online (Sandbox Code Playgroud)

如果它有任何区别....叹息。

Eli*_*gan 30

这个答案应该仍然对你有帮助,即使考虑到对问题的编辑。特别是,创建的帐户 --disabled-login没有设置密码,也没有其他登录方式,但仍然可以使用sudo(如下所述)以用户身份运行命令或 shell。实际上,这就是 root在 Ubuntu 中设置帐户的方式。

命令存在多个问题 su - irssi

此命令尝试启动一个名为的用户拥有的 shellirssi

如果出现以下情况,它将失败:

  • 没有 irssi用户。
  • irssi用户的帐户将被禁用。
  • irssi用户的帐户进行交互式登录禁用。有时,允许帐户使用 FTP 等服务,但通过将其 shell 设置为立即退出的内容(例如/bin/false. 然后登录立即结束,没有消息。
  • 您输入的密码对irssi用户不正确。

-标志使外壳程序模拟初始登录外壳程序——也就是说,它真的很像以irssi. 如果没有-标志,如果su命令成功,您仍然会得到一个由 拥有的外壳irssi,但环境变量 likeHOME将保持不变。

如果您想运行名为 的程序irssi,则必须以su不同方式调用:

su username - -c irssi
Run Code Online (Sandbox Code Playgroud)

如果您省略,则与--it 尝试以 root 身份运行命令相同。-c username-c root

或者,您可以启动一个 shell,然后运行以下命令

  1. 以.su username -
  2. 在 shell 中,运行命令 ( irssi)。
  3. 如果完成,请运行exit.

运行命令为 root

如果你想运行irssirootsu是不是这样做的方式。在 Ubuntu 上默认禁用root 登录,并且很少有任何理由重新启用它们。如果您启用了root登录,那么您应该可以使用su成为root. 这是不必要的,使的原因root帐户是,你是否这样做,你仍然可以运行命令,rootsudo.

当您使用 运行命令时sudo,您输入的是您的密码,而不是您希望运行命令的用户的密码。只有管​​理员可以像rootwith一样运行任意命令sudo(当然,除非您重新配置sudo以允许其他人这样做)。因此,不允许管理系统的用户不能像root使用自己的密码一样运行命令。

要运行irssirootsudo

sudo irssi
Run Code Online (Sandbox Code Playgroud)

并且您将在提示时输入您的密码,而不是root's。

除了您输入的密码外,这与以下内容相同:

su -c irssi
Run Code Online (Sandbox Code Playgroud)

除非sudo版本可以成功,因为它不需要root启用帐户。

与 一样su,您可以使用sudo另一个非root用户身份运行命令。要运行irssiusernamesudo

sudo -u username irssi
Run Code Online (Sandbox Code Playgroud)

如果你想sudo 表现得像个su -相对于HOME凹口-是,你要使用的目标用户的HOME环境变量,你可以运行sudo-H标志:

sudo -H irssi
Run Code Online (Sandbox Code Playgroud)
sudo -H -u username irssi
Run Code Online (Sandbox Code Playgroud)

您可以使用 启动整个外壳sudo,就像使用su. 除了您输入的密码外,此命令与以下效果相同su

sudo -s
Run Code Online (Sandbox Code Playgroud)

此命令具有与以下相同的效果su -

sudo -i
Run Code Online (Sandbox Code Playgroud)

i代表初始登录外壳。)

您也可以以其他用户身份启动 shell:

sudo -u username -s
Run Code Online (Sandbox Code Playgroud)
sudo -u username -i
Run Code Online (Sandbox Code Playgroud)

进一步阅读 sudo

要了解有关 的更多信息sudo,请查看:

为什么gksu有效su而无效?

gksu可能通过运行工作sudo

gksu是一个前端 susudo。在 Ubuntu 中,它默认为 using sudo(因为在 Ubuntu 中,su通常不用于成为root,并且只是成为其他非root用户的次要方式)。

您可以通过运行gksu将其su用作前端gksu --su-mode

你可以找出是否gksusu模式或sudo模式,并且(如果你愿意的话)更改此设置,通过运行gksu-properties。这是每个用户的设置。

gksu处于sudo模式时,它的行为与 相同gksudo

进一步阅读 gksu


解决方案后分析

您最终发现您可以使用以下命令运行必要的命令:

sudo -u username irssi
Run Code Online (Sandbox Code Playgroud)

(这是上面列出的技术。)

最终,你报告了两条信息,足以解释为什么其他技术失败了,但成功了:

  1. username帐户是使用--disabled-login标志创建的,这使得它没有密码(也没有其他登录方式)。没有密码并不意味着可以使用空白密码登录。这意味着没有密码就足以进行身份​​验证。结合消除其他身份验证方式,这种方式username根本无法进行身份验证。

    所以su基于所有的解决方案已经过时了。sudo可以工作,因为sudo您不会以您将要冒充的用户身份进行身份验证。相反,您必须获得授权才能模拟他们,并且您以自己的身份进行身份验证(即,输入您自己的密码,而不是他们的密码)。

    可以在帐户上设置密码,从而消除登录障碍:

    sudo passwd username
    Run Code Online (Sandbox Code Playgroud)

    然而,可能有一个很好的理由不允许用户登录。例如,如果允许此用户登录,并以图形方式登录,那么用户的环境或权限是否不适合运行 X11 应用程序会导致不良问题? 如果此用户可以登录,是否可以以该用户身份远程登录(对于您已公开网络服务的计算机)?

    如果您想重新禁用它:

    sudo passwd -dl username
    Run Code Online (Sandbox Code Playgroud)

    相关:暂时启用后重新禁用该root帐户。

  2. username帐户具有/bin/false作为其登录外壳。

    当 shell 像bash您的登录shell 一样运行时,它会设置您的环境并为您提供一个交互式提示来控制机器。

    /bin/false另一方面,当运行时,它什么都不做,并报告失败。(/bin/true什么都不做并报告成功。)

    falsetrue命令在脚本非常有用和各种测试的目的,同时也为禁用一个帐户,以便在时,他们的登录会话立即结束别人的日志。这样,可以启用密码(或其他身份验证方式),并且人们可以登录,而不是shell 访问。例如,如果有 FTP 服务器,他们仍然可以通过 FTP 访问他们的帐户。如果有 SSH 服务器,他们将无法通过 SSH 获得 shell,但他们仍然可以使用sftpscp传输文件。

    由于username的登录shell是不起作用的命令一样,,,和无法工作。su usernamesu - usernamesudo -u username -ssudo -u username -i

    但是不提供外壳的命令,例如或仍然可以工作。sudo -u username commandsu username -c 'command'

    由于可以运行命令,您可以将用户的登录 shell 更改为某些功能:

    sudo chsh -s /bin/bash username
    Run Code Online (Sandbox Code Playgroud)

    但是,这也应该谨慎进行,因为可能有充分的理由禁用用户的交互式登录。

在这里,username两者都禁用了密码“禁用”shell。没有任何有效密码会阻止su基于all的解决方案工作,而没有有效的交互式登录 shell 会阻止所有生成 shell 的解决方案工作(手动调用 shell 除外,例如)。sudo -u username bash

sudo -u username command 剩下的是什么。