以没有密码的另一个用户身份运行 shell 脚本

以没有密码的另一个用户身份运行 shell 脚本

我想以没有密码的其他用户身份从主 ubuntu shell 运行脚本。

我有完全的 sudo 权限,因此我尝试了这个:

sudo su -c "Your command right here" -s /bin/sh otheruser

然后我必须输入我的密码,但我不确定该脚本现在是否真的在该用户下运行。

我如何确认该脚本现在确实在该用户下运行?

答案1

您可以使用su或来完成此操作sudo,无需两者同时使用。

sudo -H -u otheruser bash -c 'echo "I am $USER, with uid $UID"' 

相关部分man sudo

-H   The -H (HOME) option requests that the security policy set
     the HOME environment variable to the home directory of the
     target user (root by default) as specified by the password
     database.  Depending on the policy, this may be the default
     behavior.

(从 Ubuntu 19.10 开始,-H不再需要,因为这是默认行为。请参阅:自 19.10 以来,sudo 如何以不同的方式处理 $HOME?

-u user     The -u (user) option causes sudo to run the specified
      command as a user other than root.  To specify a uid
      instead of a user name, use #uid.  When running commands as
      a uid, many shells require that the '#' be escaped with a
      backslash ('\').  Security policies may restrict uids to
      those listed in the password database.  The sudoers policy
      allows uids that are not in the password database as long
      as the targetpw option is not set.  Other security policies
      may not support this.

su如果您是 root,则只能在不提供密码的情况下切换用户。请参阅 Caleb 的回答

您可以修改/etc/pam.d/su文件以允许su无需密码。请参阅此回答

如果您将 auth 文件修改为以下内容,则属于组的任何用户somegroup都可以无需密码su进行操作。otheruser

auth       sufficient pam_rootok.so
auth       [success=ignore default=1] pam_succeed_if.so user = otheruser
auth       sufficient   pam_succeed_if.so use_uid user ingroup somegroup

然后从终端测试

rubo77@local$ su otheruser -c 'echo "hello from $USER"'
hello from otheruser

答案2

如果您想使用 su 而不是 sudo,我相信您可以使用如下命令:

su - <username> -c "<commands>"
  • - 将模拟指定用户的登录
  • -c 告诉它你想运行一个命令

ps. 不幸的是我无法用这种方法使用 rvm 安装 ruby​​,但这可能无关紧要。

答案3

上述答案对我确实很有用,但要回答实际问题......

我如何确认该脚本现在确实在该用户下运行?-

使用:

ps -ef | grep <command-name>

输出应该包括你的脚本和执行它的实际用户。使用 BSD 类系统(例如 MAC)的用户可以通过以下方式找到类似的信息:

ps aux | grep <command-name>

答案4

我也遇到了同样的问题。只需输入命令,screen -dmS testscreen这将在您的非 sudo 用户帐户上创建一个独立的屏幕,然后您可以记录它并检查该屏幕是否存在screen -ls

相关内容