在bash中生成脚本并将其保存到需要sudo的位置

时间:2010-12-10 18:27:32

标签: bash sudo heredoc

在bash中,我可以根据此站点创建一个带有here-doc的脚本: http://tldp.org/LDP/abs/html/abs-guide.html#GENERATESCRIPT

(
cat <<'EOF'
#!/bin/bash
#? [ ] / \ = + < > : ; " , * | 
#/ ? < > \ : * | ”
#Filename="z:"${$winFn//\//\\}
echo "This is a generated shell script."
App='eval wine "C:\Program Files\foxit\Foxit Reader.exe" "'$winFn'"'
$App
EOF
) > $OUTFILE

如果我的$OUTFILE是一个需要sudo权限的目录,我在哪里放置sudo命令或我还能做些什么来使其工作?

3 个答案:

答案 0 :(得分:50)

我就是这样做的:

sudo tee "$OUTFILE" > /dev/null <<'EOF'
foo
bar
EOF

答案 1 :(得分:21)

sudo放在cat之前不起作用,因为>$OUTFILE尝试在当前shell进程中打开$OUTFILE,而该进程未以root身份运行。您需要在sudo - ed子流程中打开该文件。

以下是实现此目的的一种方法:

sudo bash -c "cat >$OUTFILE" <<'EOF'
#!/bin/bash
#? [ ] / \ = + < > : ; " , * | 
#/ ? < > \ : * | ”
#Filename="z:"${$winFn//\//\\}
echo "This is a generated shell script."
App='eval wine "C:\Program Files\foxit\Foxit Reader.exe" "'$winFn'"'
$App
EOF

这将在sudo下启动一个子shell,并从该更具特权的子进程中打开$OUTFILE,并运行cat(作为另一个特权子进程)。同时,(较少特权的)父进程将here-document传递给sudo子进程。

答案 2 :(得分:0)

没有答案扩展了环境变量。我的解决方法是tmp文件和sudo mv。

l_log=/var/log/server/server.log
l_logrotateconf=/etc/logrotate.d/server
tmp=/tmp/$$.eof
cat << EOF > $tmp
$l_log {
   rotate 12
   monthly
   compress
   missingok
   notifempty
}
EOF
sudo mv $tmp $logrotateconf