我要做的就是以特定用户的身份运行特定脚本,该用户的确在nologin/false中指定了/etc/passwd shell。

我将以root用户身份运行脚本,并且应该以其他用户身份运行。
运行:

~# su -c "/bin/touch /tmp/test" testuser


可以工作,但是我需要测试用户的有效外壳程序。
我知道我可以使用passwd -d testuser禁用密码并保留shell到/bin/bash的这种方式可以确保一点安全,但是我需要nologin/false的外壳。

基本上我需要的是crontab在将作业设置为以特定用户身份运行时所执行的操作,无论该用户具有nologin/false shell。

ps我发现此线程以nologin用户的身份执行命令,但我不知道如何concatenate命令su -s /bin/sh $user到我需要运行的脚本。

#1 楼

您可以使用-s开关来运行特定的shell

su -s /bin/bash -c '/path/to/your/script' testuser


(如果sudo是无密码用户,则将testuser附加到上面。)

评论


如果su是root:root -rwsr-x ---怎么办?

–Patryk
2015年3月10日,0:24

如果用户没有密码怎么办?

– CMCDragonkai
15年5月18日在10:12

@Wesley发现您需要root用户才能为无密码用户运行该命令。

– CMCDragonkai
15年8月16日在10:53

@lain,如果假定用户没有外壳,则与命令相关的进程不应是bash进程的子进程。因此,您还应该使用exec将shell替换为脚本。而且,如果您希望使脚本成为init的子代,则只需使用&,例如su -s / bin / bash -c'exec / path / to / your / script&'test

–法肯多·维克多(Facundo Victor)
16-4-27在12:59



由于我花了最后20分钟的时间来研究如何使用runuser获得相同的结果,因此我想指出su -s SHELL参数使runuser命令变得非常无用了:)感谢Jan!

– Jirka
16年7月21日在18:06

#2 楼

如果已安装sudo -u,则可以执行此操作:

# whoami
root
# sudo -u apache whoami
apache
# getent passwd apache
apache:x:48:48:Apache:/var/www:/sbin/nologin


评论


如何将参数传递给sudo -u apache whoami?

– CMCDragonkai
15年5月18日在10:11

@CMCDragonkai命令后的任何参数都将被传递。您可以将其视为“ sudo [-u apache] [whoami ]”。

–Handyman5
2015年5月19日下午6:27

我认为使用sudo -u可能不是以nologin用户身份运行命令的好主意,因为它在实际调用命令的环境中公开了SUDO_USER。也许我只是想得太多。

–喵
16年4月30日在15:36

#3 楼

通过提供脚本作为要执行到/ bin / sh的参数:

su -s "/bin/sh /your/script/location" username


#4 楼

刚刚意识到:

su -s“ / bin / bash” -c“ / bin / touch / tmp / testuser” testuser

也许还有更好的方法吗? br />

#5 楼

实际上,最好的方法是通过runuser
参阅手册页以获取详细信息
该工具用于处理开发人员在其运行时所说的情况
每当服务运行作为root并想使用shell更改UID,它应该使用runuser。发现这个烦人

评论


请不要发布仅链接的答案,以防止链接腐烂。而是,将链接中最相关的信息添加到您的答案中,或者将链接发布为评论而不是答案。有关更多信息,请参阅此serverfault.com/help/how-to-answer帮助中心文章。

– Federico Galli
18年2月16日在10:01

@FedericoGalli已经添加了最相关的信息,无需复制和粘贴用法,手册页提供了足够的信息

– Y00
18年2月20日在8:27

#6 楼

使用sudo -u指定用户。还可以使用-i标志来设置目标用户的环境变量。

sudo -i -u user command


评论


这使该帐户当前不可用。

– knocte
17年4月19日在9:43

#7 楼

将su命令与shell -s和-c命令一起使用。如下所示

 su  exec -l -c '/bin/bash /etc/update_conf.sh' -s /bin/bash


评论


这正是最高评分答案的解决方案。

–杰拉德·施耐德(Gerald Schneider)
19-09-17在6:55