web-dev-qa-db-fra.com

sudo cat << EOF> Le fichier ne fonctionne pas, Sudo su le fait

J'ai essayé ce qui suit sur l'invite de commande dans bash:

Sudo cat << EOF > /etc/yum.repos.d/some-name.repo
#Content
#....
#...
EOF

Il se plaignait:

-bash: /etc/yum.repos.d/some-name.repo: Permission denied

Ensuite, j'ai fait Sudo su et essayé exactement la même chose sauf le Sudo avant cat, et cela a fonctionné sans aucun problème. Qu'est-ce qui me manque dans ce qui précède?

42
iamauser

La redirection de sortie (par exemple,>) est effectuée par bash, pas par cat, lors de l'exécution avec votre UID. Pour exécuter avec l'UID de root, utilisez Sudo:

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

Une autre option est le tee.

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

En variante à la réponse de @Yuriy Nazarov, seule la sortie canalisée doit être élevée par Sudo. L'entrée canalisée peut rester non élevée:

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

Cela signifie qu'une partie beaucoup plus petite de la commande doit être citée et envoyée via Sudo.

17
Stephen Quan

Comme d'autres l'ont souligné, la redirection du shell est effectuée par le shell actuel et non par cat. Sudo ne modifie que l'autorisation du programme qui est exécuté et non du Shell qui fait la redirection. Ma solution est d'éviter la redirection:

Sudo dd of=/etc/yum.repos.d/some-name.repo << EOF
11
user2359330

si vous utilisez "à l'intérieur du texte, vous pouvez utiliser:

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

ceci est testé sur le serveur virtuel centos 7.0 de google cloud

2
Alp Altunel