![](/img/trans.png)
[英]How can I execute commands as another user with their .bash_profile instead of the current user's?
[英]How can I execute a series of commands in a bash subshell as another user using sudo?
我正在编写一个需要 sudo 多个命令的 bash 脚本。 我可以做这个:
( whoami ; whoami )
但我不能这样做:
sudo ( whoami ; whoami )
我该如何解决这个问题?
在sudo
运行一个 shell: sudo bash -c 'whoami; whoami'
sudo bash -c 'whoami; whoami'
您可以在单引号内使用除'
本身以外'
任何字符。 如果您真的想在该命令中使用单引号,请使用'\\''
(技术上是:结束单引号文字,文字'
字符,开始单引号文字;但实际上这是一种注入单引号的方法在单引号文字字符串中)。
您可以使用此处的文档将命令作为标准输入传递到 sudo'ed bash 中:
sudo bash <<"EOF"
whoami
id
EOF
这样就不需要摆弄正确的引用,特别是如果你有多个级别,例如:
sudo bash <<"EOF"
whoami
echo $USER ~
sudo -u apache bash <<"DOF"
whoami
echo $USER ~
DOF
EOF
产生:
root
root /root
apache
apache /usr/share/httpd
(请注意,您不能缩进内部终止符 - 它必须单独在一行中。如果您想在此处的文档中使用缩进,您可以使用<<-
而不是<<
,但您必须使用制表符缩进, 不是空格。)
例如试试这个,我测试了它:
sudo bash -c "cd /;ls;ls|grep o"
在本例中,您首先将 dir 更改为 /root,接下来列出根目录,最后为根目录过滤仅名称带有字母 'o' 的目录。
但我更好的方法是编写脚本来完成您需要的所有操作并为所有复杂操作提供退出代码。 然后你可以 sudo 脚本而不是像上面的例子那样的单个命令组。
如果您想从编辑器中突出显示语法,而不是在代码周围使用引号,并有适当的缩进,您可以在函数中编写命令并使用declare
命令将其发送到 bash:
function run_as_root() {
whoami
id
echo $USER
}
sudo bash -c "$(declare -f run_as_root); run_as_root"
括号表示在新的bash中执行命令。它以分号为间隔执行命令。只需使用下面的代码。
(sudo whoami;sudo whoami)
BYW:使用'()'时不需要空格。
仅执行sudo询问你的passwd第一time.The passwd的回答有效期为约5分钟default.You可以改变这个值作为这个在脚本的开头told.So只是在passwd提示烦恼,那么你可以使用sudo始终。 将 Defaults:user_name timestamp_timeout 的值更改为 -1 可能是您系统上的安全漏洞。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.