我在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
,并尝试了与cat
之前的sudo
完全相同的操作,这次却没有任何问题。在上述步骤中我漏掉了什么?
在使用您的UID运行时,输出重定向(例如>)由bash执行,而不是cat执行。要使用root的UID运行,请使用sudo:
sudo bash -c 'cat << EOF > /etc/yum.repos.d/some-name.repo
line1
line2
line3
EOF'
cat << EOF | sudo tee -a /etc/yum.repos.d/some-name.repo
...
EOF
sudo
进行提升权限,管道输入可以保持不提升权限:sudo bash -c 'cat > /etc/yum.repos.d/some-name.repo' << EOF
line1
line2
line3
EOF
这意味着命令中需要引用并发送到sudo
的部分要小得多。
正如其他人所指出的,shell重定向是由当前shell而不是cat执行的。sudo仅更改执行的程序的权限,而不是进行重定向的shell的权限。我的解决方案是避免重定向:
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上测试的。
bash -c
。 - iamauser