以其他用户身份运行bash脚本的一部分


Answers:


42

在脚本中使用sudo命令。

形式:

sudo -u username command

sudo命令以用户名username运行命令

如果脚本以root身份运行,我认为它不会提示您输入密码。否则,本文讨论如何在一个命令行中使用带有密码的sudo?,本文讨论了如何在没有密码的情况下使用sudo?


5
这很好并且很容易,但是有没有办法针对一组命令而不是一次执行此操作?
安德鲁

编写bash脚本,使其可执行chmod +x script.sh,然后sudo -u username script.sh
NiCU 2014年

@Andrew我在此想知道自己和我下面的工作:命令和-u IC SH -c“CMD1 && CMD2”
Karussell

i如果您要获取用户的环境,还请包括该选项
neoDev

6

这个答案很好,但是serverfault的建议有点危险-允许任何人以root用户身份运行任何内容!所以我在这里发布,因为我无法设置评论的格式。

我建议使用visudo尽可能精确地提供所需的权限。输入visudo并添加如下一行:

username hostname = NOPASSWD: /full/path/to/command1, full/path/to/command2

如果确实需要在许多主机上运行相同的东西,则可以使用以下命令打开它:

username ALL = NOPASSWD: /full/path/to/command1, full/path/to/command2

但是我不会*使用其中之一:

username ALL=(ALL) NOPASSWD: ALL

或用户名主机名= ALL

sudoer手册页有很多血淋淋的细节


它仅适用于特定用户可用的命令吗?
Manish Mathai 2010年

您可以指定仅特定用户可以运行命令(在上面的示例中,请替换username为应该能够运行命令的用户名)。如果您要运行的可执行文件仅可由一个特定用户执行,那也可以-只需sudo -u username commandline在脚本行中传递该用户名即可。
James Polley 2010年

@Manish。是。什么sudoers文件说的是“允许这台主机来运行命令1这个用户名,而无需提供密码。
DaveParillo

6

#我=喜欢:

#test if running bash as a different user works
sudo -u nobody bash -c : && RUNAS="sudo -u nobody"

echo 1: $USER

#Runs bash with commands between '_' as nobody if possible
$RUNAS bash<<_
echo 2: \$USER
_

echo 3: $USER

# 。/跑

1: root
2: nobody
3: root

10
您可以添加一些说明性文字吗?
卡扎尔克

4

对于声纳曲贝:

sudo -u sonar /usr/bin/sonar start

其中sonar用于运行命令的用户名/usr/bin/sonar start


2

不太确定,但是如果只希望该脚本的结尾将以其他用户身份运行,则可以su someuser在脚本结尾之前添加。

我想念什么吗?

希望能有所帮助,

问候


1
我认为这是最合适的答案,所有其他答案都建议使用sudo,在某些最小的Linux安装中,默认情况下通常不会安装sudo。
蒂姆(Tim)

1

这样,脚本的结尾将由不同的用户(root)执行。请注意$[LINENO+2]exit $?。这些是使脚本结尾仅执行一次并保留sudo调用的退出代码所必需的。

#!/bin/bash                                                                                                                                                                                                                                  
echo $USER                                                                                                                                                                                                                                      

# pipe the rest of this script via a sudo call                                                                                                                                                                                                                                         
tail -n +$[LINENO+2] $0 | exec sudo bash                                                                                                                                                                                                     
exit $?                                                                                                                                                                                                                                     
echo $USER
exit 1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.