77

我在 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完全相同的东西,它没有任何问题。我在上面缺少什么?sudocat

4

5 回答 5

115

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

sudo bash -c 'cat << EOF > /etc/yum.repos.d/some-name.repo
line1
line2
line3
EOF'
于 2013-09-16T20:40:27.587 回答
55

另一种选择是 tee。

cat << EOF | sudo tee -a /etc/yum.repos.d/some-name.repo
...
EOF
于 2013-12-23T22:56:47.127 回答
31

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

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

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

于 2015-02-06T04:06:44.623 回答
12

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

sudo dd of=/etc/yum.repos.d/some-name.repo << EOF
于 2013-11-20T16:46:05.870 回答
3

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

$ 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上测试的

于 2019-03-11T06:12:51.920 回答