文件不工作,sudo su 工作

我在 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,它工作没有任何问题。我在上面漏掉了什么?

54545 次浏览

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

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

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

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

另一个选择是 T 恤。

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

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

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

这意味着命令中需要引用的部分要少得多,并且需要通过 sudo发送给 sudo

如果你在文本中使用’,那么你可以使用:

$ 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 云的虚拟服务器 centos 7.0上测试的