Pourquoi sudo cat donne une Autorisation refusée mais sudo vim fonctionne bien?
Je suis en train d'automatiser l'ajout d'un référentiel source dans mon arche de pacman.fichier conf, mais à l'aide de la echo
commande dans mon script shell. Cependant, il échoue comme ceci:-
sudo echo "[archlinuxfr]" >> /etc/pacman.conf
sudo echo "Server = http://repo.archlinux.fr/$arch" >> /etc/pacman.conf
sudo echo " " >> /etc/pacman.conf
-bash: /etc/pacman.conf: Permission denied
Si je fais des modifications dans /etc/pacman.conf manuellement à l'aide de vim, en faisant
sudo vim /etc/pacman.conf
et quitter vim avec :wq
, tout fonctionne bien et mon pacman.conf a été mis à jour manuellement, sans "Autorisation refusée" plaintes.
Pourquoi est-ce donc? Et comment puis-je obtenir sudo echo
de travail? (btw, j'ai essayé d'utiliser sudo cat
trop mais qui a échoué avec la Permission refusé)
Vous devez vous connecter pour publier un commentaire.
Le problème est que la redirection est en cours de traitement par l'original de votre shell, pas par
sudo
. Les coquilles ne sont pas capables de lire dans les pensées et ne savent pas que ce>>
est conçu pour lessudo
et pas pour elle.Vous avez besoin de:
sudo)
sudo -s
(de sorte quesudo
utilise un shell pour le processus de la cité de la redirection.)sudo -s
(2) echo "# test" >> /etc/pacman.conf fonctionne. Mais est-il possible de l'exécuter en une seule ligne?sudo -s 'echo "# test" >>/etc/pacman.conf'
est ce que je tente de vous transmettre.sudo -s 'echo "# test" >> /etc/pacman.conf' /bin/bash: echo "# test" >> /etc/pacman.conf: No such file or directory
c'est pourquoi j'ai par la suite essayé les 2-l'étape de processus manuel.echo 'echo "# test" >> /etc/pacman.conf' | sudo -s
sudo
configuration de désactiver-s
? (Bien qu'il doit rapporter une erreur en disant: bien, dans ce cas, au lieu d'essayer de s'exécuter sans coquille).sudo
configuration désactivation-s
? visudo?man sudoers
; etman sudo
poursudo -s
lui-même.-s
peut être désactivé car il est plus difficile de contrôler de manière fiable le/secure ce que leroot
-exécuter la commande si une coquille est en cause (pour des raisons similaires sur de nombreux systèmes-s
les forces de l'root
de l'environnement de shell à la place des utilisateurs, comme ce serait le cas par défaut).Comme @geekosaur expliqué, le shell ne la redirection avant l'exécution de la commande. Lorsque vous tapez ceci:
Votre shell courant crée une copie de lui-même qui essaie d'abord d'ouvrir
/some/file
pour l'écriture, puis fait ce descripteur de fichier standard de sortie, et alors seulement s'exécutesudo
.Si vous êtes autorisé (sudoer configs souvent obstacle à l'exécution de coquillages), vous pouvez faire quelque chose comme ceci:
Mais j'ai trouver une bonne solution, en général, est d'utiliser
| sudo tee
au lieu de>
et| sudo tee -a
au lieu de>>
. C'est particulièrement utile si la redirection est la seule raison pour laquelle j'ai besoin desudo
en premier lieu; après tout, inutilement processus en cours d'exécution en tant que root est précisément ce quesudo
a été créé pour éviter. Et en cours d'exécutionecho
en tant que root est tout simplement ridicule.J'ai ajouté
> /dev/null
sur la fin parce quetee
envoie sa sortie de les deux le fichier nommé et son propre standard de sortie, et je n'ai pas besoin de voir ça sur mon terminal. (Letee
commande agit comme un "T" connecteur dans un pipeline, qui est d'où il tire son nom.) Et je suis passé à des guillemets simples ('
...'
) au lieu de doubles ("
..."
), de sorte que tout est littéral et je n'ai pas eu à mettre une barre oblique inverse devant le$
dans$arch
.Alors qui prend soin de l'écriture de fichiers en tant que root à l'aide de
sudo
. Maintenant, pour une longue digression sur les moyens de sortie de retour à la ligne contenant le texte dans un script shell. 🙂Tout d'abord, vous pouvez simplement de regrouper tous les
echo
's ensemble dans un shell interne est exécuté, de sorte que vous n'avez qu'à faire la redirection une fois:Ou de l'utilisation
printf
au lieu deecho
, de sorte que vous pouvez incorporer des retours à la ligne directement dans la chaîne à l'aide de\n
:Dans
bash
, vous pouvez obtenir le même résultat avececho -e
:Mais la plupart des shells va juste à la sortie de la
-e
lorsque vous essayez de faire cela, il n'est donc pas recommandé.Avec les deux
printf
etecho -e
, ce que la commande soit comme argument une chaîne de caractères contient un backslash suivi par un littéral N où que vous tapez\n
, et c'est le programme de commande lui-même (le code à l'intérieurprintf
ouecho
) pour traduire cela en un retour à la ligne. Dans de nombreux moderne coquilles, vous avez la possibilité d'utiliser ANSI citations$'
...'
, qui va traduire les séquences comme\n
en littérale retours à la ligne avant le programme de commande ne voit jamais la chaîne, ce qui signifie que ces chaînes de travailler avec n'importe quelle commande que ce soit:Mais, bien plus portable que
echo -e
, ANSI citations sont toujours un non-POSIX extension.Mon préféré façon de le faire serait d'utiliser un ici-document et d'éviter la nécessité pour
echo
ouprintf
entièrement:http://www.innovationsts.com/blog/?p=2758
Que les instructions ne sont pas claires ci-dessus, je suis en utilisant les instructions de ce billet de blog. Avec des exemples de sorte qu'il est plus facile de voir ce que vous devez faire.
Avis que c'est la deuxième commande (la commande gzip) dans le pipeline qui provoque l'erreur. C'est là que notre technique de l'utilisation de bash avec l'option-c est en.
Nous pouvons voir le formulaire de la commande ls de sortie que la création de fichiers compressés réussi.
La deuxième méthode est similaire à la première, c'est que nous sommes de passage d'une chaîne de commande de bash, mais nous le faisons dans un pipeline via sudo.
ÉTAPE 1 créer une fonction dans un fichier bash (
write_pacman.sh
)'EOF'
ne va pas interpréter$arch
variable.STE2 source fichier bash
ÉTAPE 3 fonction execute
EOF
.