我在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
之外的完全相同的事情,并且它没有任何问题。我在上面遗漏了什么?
答案 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上进行了测试