我在 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
使用您的 UID 运行时,输出重定向(例如,>)由 bash 而非 cat 执行。要使用 root 的 UID 运行,请使用 sudo:
sudo bash -c 'cat << EOF > /etc/yum.repos.d/some-name.repo
line1
line2
line3
EOF'
另一种选择是 tee。
cat << EOF | sudo tee -a /etc/yum.repos.d/some-name.repo
...
EOF
作为@Yuriy Nazarov 答案的变体,只有管道输出需要通过 thru 提升sudo
。管道输入可以保持不提升:
sudo bash -c 'cat > /etc/yum.repos.d/some-name.repo' << EOF
line1
line2
line3
EOF
这意味着需要引用命令的一小部分并将其发送到sudo
.
正如其他人指出的那样,shell 重定向是由当前 shell 而不是 cat 完成的。sudo 仅更改执行的程序的权限,而不是执行重定向的外壳程序的权限。我对此的解决方案是避免重定向:
sudo dd of=/etc/yum.repos.d/some-name.repo << EOF
如果您在文本中使用 ' 那么您可以使用:
$ 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
"
这是在谷歌云的虚拟服务器centos 7.0上测试的