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?
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'
Une autre option est le tee.
cat << EOF | Sudo tee -a /etc/yum.repos.d/some-name.repo
...
EOF
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
.
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
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