sudo cat << EOF>文件不起作用,sudo su呢

iam*_*ser 44 bash shell sudo

我在bash的命令提示符下尝试了以下内容:

sudo cat << EOF > /etc/yum.repos.d/some-name.repo
#Content
#....
#...
EOF
Run Code Online (Sandbox Code Playgroud)

它抱怨说:

-bash: /etc/yum.repos.d/some-name.repo: Permission denied
Run Code Online (Sandbox Code Playgroud)

然后我做了sudo su并尝试了除了sudo之前的完全相同的东西cat,它没有任何问题.上面我错过了什么?

Yur*_*rov 71

输出重定向(例如,>)由bash执行,而不是由cat执行,同时使用您的UID运行.要使用root的UID运行,请使用sudo:

sudo bash -c 'cat << EOF > /etc/yum.repos.d/some-name.repo
line1
line2
line3
EOF'
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用任何其他用于重定向输出的实用程序。例如“cat &lt;&lt; EOF | sudo tee /etc/yum.repos.d/some-name.repo” (2认同)

小智 29

另一个选择是发球台.

cat << EOF | sudo tee -a /etc/yum.repos.d/some-name.repo
...
EOF
Run Code Online (Sandbox Code Playgroud)

  • 这是猫的无用.更好:sudo tee -a /etc/yum.repos.d/some-name.repo << EOF (33认同)

Ste*_*uan 18

作为@Yuriy Nazarov答案的变体,只有管道输出需要通过提升sudo.管道输入可以保持不升高:

sudo bash -c 'cat > /etc/yum.repos.d/some-name.repo' << EOF
line1
line2
line3
EOF
Run Code Online (Sandbox Code Playgroud)

这意味着命令的一小部分需要引用并发送到sudo.

  • 在我的例子中,这比公认的答案有了巨大的进步,因为我的管道输出充满了变量和变量之类的东西。 (3认同)

小智 11

正如其他人所指出的那样,shell重定向是由当前的shell而不是cat完成的.sudo只更改执行重定向的shell执行的程序的权限.我的解决方案是避免重定向:

sudo dd of=/etc/yum.repos.d/some-name.repo << EOF
Run Code Online (Sandbox Code Playgroud)


Alp*_*nel 5

如果您在文本中使用 ' 那么您可以使用:

$ sudo bash -c "cat > /etc/postfix/mysql-virtual_forwardings.cf << EOF
user = mail_admin
password = password
dbname = mail
query = SELECT destination FROM forwardings WHERE source='%s'
hosts = 127.0.0.1
EOF
"
Run Code Online (Sandbox Code Playgroud)

这是在谷歌云的虚拟服务器centos 7.0上测试的