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

时间:2013-09-16 20:37:37

标签: bash shell sudo

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

sudo cat << EOF > /etc/yum.repos.d/some-name.repo
#Content
#....
#...
EOF

它抱怨道:

-bash: /etc/yum.repos.d/some-name.repo: Permission denied

然后我做了sudo su并尝试了除sudo之前cat之外的完全相同的事情,并且它没有任何问题。我在上面遗漏了什么?

5 个答案:

答案 0 :(得分:63)

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

sudo bash -c 'cat << EOF > /etc/yum.repos.d/some-name.repo
line1
line2
line3
EOF'

答案 1 :(得分:26)

另一种选择是发球。

cat << EOF | sudo tee -a /etc/yum.repos.d/some-name.repo
...
EOF

答案 2 :(得分:17)

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

sudo bash -c 'cat > /etc/yum.repos.d/some-name.repo' << EOF
line1
line2
line3
EOF

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

答案 3 :(得分:10)

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

sudo dd of=/etc/yum.repos.d/some-name.repo << EOF

答案 4 :(得分:2)

如果您在文本中使用',则可以使用:

$ 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
"

这已在Google Cloud的虚拟服务器centos 7.0上进行了测试