How can I execute a series of commands in a bash subshell as another user using sudo?

落花浮王杯 提交于 2019-12-20 08:24:28

问题


I'm writing a bash script that needs to sudo multiple commands. I can do this:

( whoami ; whoami )

but I can't do this:

sudo ( whoami ; whoami )

How do I solve this?


回答1:


Run a shell inside sudo: sudo bash -c 'whoami; whoami'

You can use any character except ' itself inside the single quotes. If you really want to have a single quote in that command, use '\'' (which technically is: end single-quote literal, literal ' character, start single-quoted literal; but effectively this is a way to inject a single quote in a single-quoted literal string).




回答2:


You can pass the commands as standard input into sudo'ed bash with a here document:

sudo bash <<"EOF"
whoami
id
EOF

This way there is no need to fiddle with correct quoting, especially if you have multiple levels, e.g.:

sudo bash <<"EOF"
whoami
echo $USER ~
sudo -u apache bash <<"DOF"
whoami
echo $USER ~
DOF
EOF

Produces:

root
root /root
apache
apache /usr/share/httpd

(Note that you can't indent the inner terminator — it has to be alone on its line. If you want to use indentation in a here document, you can use <<- instead of <<, but then you must indent with tabs, not spaces.)




回答3:


for example try this, I tested it:

sudo bash -c "cd /;ls;ls|grep o"

In this example you first change dir to /root, next list root directory and finally for root directory filter only directories having name with letter 'o'.

But i thing better way is writting script that do all you need and give exitcode for all complex action. Then you can sudo script instead group of single commands like example above.




回答4:


The Brackets means that execute the command in a new bash.It execute the command with the interval of semicolon.Just use the code below instead.

(sudo whoami;sudo whoami)

BYW:the space is not necessary when using '()'.




回答5:


sudo only asks for your passwd the first time.The passwd answered is valid for about 5 minutes by default.You can change this value as this told.So just worry about the passwd prompt at the beginning of your script,then you can use sudo through out. changing Defaults:user_name timestamp_timeout's value to -1 may be a security hole on your system.



来源:https://stackoverflow.com/questions/3435312/how-can-i-execute-a-series-of-commands-in-a-bash-subshell-as-another-user-using

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!