Bash sudo猫<&书信电报;EOF>;文件不存在';我不工作,苏多工作

Bash sudo猫<&书信电报;EOF>;文件不存在';我不工作,苏多工作,bash,shell,sudo,Bash,Shell,Sudo,我在bash的命令提示符下尝试了以下操作: sudo cat << EOF > /etc/yum.repos.d/some-name.repo #Content #.... #... EOF 然后我做了sudo su,除了cat之前的sudo之外,我尝试了完全相同的事情,它工作起来没有任何问题。上面我遗漏了什么?输出重定向(例如>)是由bash执行的,而不是由cat执行,同时使用UID运行。要使用root的UID运行,请使用sudo: sudo bash -c 'cat &l

我在bash的命令提示符下尝试了以下操作:

sudo cat << EOF > /etc/yum.repos.d/some-name.repo
#Content
#....
#...
EOF
然后我做了
sudo su
,除了
cat
之前的
sudo
之外,我尝试了完全相同的事情,它工作起来没有任何问题。上面我遗漏了什么?

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

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

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

sudo dd of=/etc/yum.repos.d/some-name.repo << EOF
sudo dd of=/etc/yum.repos.d/some-name.repo另一个选项是tee

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

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

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

sudo bash-c'cat>/etc/yum.repos.d/some name.repo'如果您在文本中使用了“”,则可以使用:

$ 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
"

$sudo bash-c“cat>/etc/postfix/mysql-virtual_forwardings.cf我不明白的是我已经在使用bash提示符,那么为什么我需要
bash-c
。因为在这种情况下,重定向将由以“root”开头的bash执行“具有足够权限写入/etc/yum.repos.d/的uid。您可以使用任何其他重定向输出的实用程序。例如,“cat这是cat的无用用法。更好的做法是:sudo tee-a/etc/yum.repos.d/some-name.repo@BrunoBronosky这实际上只是因为你把
这个可能的副本放在我的例子中是一个巨大的改进,因为我的管道输出充满了变量和shebang之类的东西。
$ 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
"