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

D W*_*D W 27 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
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*ce. 58

我就是这样做的:

sudo tee "$OUTFILE" > /dev/null <<'EOF'
foo
bar
EOF
Run Code Online (Sandbox Code Playgroud)

  • @MountainX:`tee -a`附加到文件. (5认同)
  • 哦,没关系; 删除单引号arond`EOF`修复了这个问题 (3认同)
  • 但这不会扩展环境变量? (2认同)

Lau*_*ves 22

只是放在sudo之前cat不起作用,因为>$OUTFILE尝试$OUTFILE在当前shell进程中打开,而不是以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
Run Code Online (Sandbox Code Playgroud)

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

  • @DW:是的,我对此感到惊讶。来自http://www.gnu.org/software/bash/manual/bashref.html#Redirections:“如果未引用word,则此文档的所有行都将进行参数扩展,命令替换和算术扩展。” 可能有用,但是语法太可怕了!我的长期理论是,大多数bash语法都是围绕以前版本中的语法错误(sh为祖先根)设计的。 (2认同)