Comment puis-je utiliser sudo pour rediriger la sortie vers un emplacement je n'ai pas la permission d'écrire?
Que j'ai été donné sudo accès sur l'un de nos développement linux RedHat, boîtes, et j'ai l'impression de me retrouver assez souvent besoin de rediriger la sortie vers un emplacement I n'ont normalement pas accès en écriture.
Le problème est que cet exemple artificiel ne fonctionne pas:
sudo ls -hal /root/> /root/test.out
Je viens de recevoir la réponse:
-bash: /root/test.out: Permission denied
Comment puis-je obtenir que cela fonctionne?
- chmod u+w fichier
- Vous suggérez que j'ai créer le fichier sudo abord, puis de me donner l'autorisation? Bonne idée.
- Dans de nombreuses situations, vous vous retrouvez ici parce que vous avez demandé "pourquoi dois-je obtenir la Permission refusée?" Parfois, la réponse est que vous avez besoin de créer un fichier en tant que
root
(dans ce cas, commencer à lire les réponses), mais très souvent, il vous suffit de créer le fichier quelque part d'autre, que de vous-même.
InformationsquelleAutor Jonathan | 2008-09-17
Vous devez vous connecter pour publier un commentaire.
Votre commande ne fonctionne pas parce que la redirection est effectuée par votre coque qui n'ont pas la permission d'écrire à
/root/test.out
. La redirection de la sortie n'est pas effectuées par sudo.Il y a plusieurs solutions:
Exécuter un shell avec sudo et donner la commande à l'aide de la
-c
option:Créer un script avec vos commandes et exécutez le script avec la commande sudo:
Exécuter
sudo ls.sh
. Voir Steve Bennett réponse si vous ne voulez pas créer un fichier temporaire.Lancer un shell avec
sudo -s
puis exécuter vos commandes:Utilisation
sudo tee
(si vous en avez pour échapper à beaucoup lors de l'utilisation de la-c
option):Le rediriger vers
/dev/null
est nécessaire pour arrêter té à partir de la sortie à l'écran. Pour ajouter au lieu d'écraser le fichier de sortie(
>>
), l'utilisationtee -a
outee --append
(le dernier est spécifique à GNU coreutils).Merci à Jd, Adam J. Forster et Johnathan pour les deuxième, troisième et quatrième solutions.
perl -e 'print "STDIN\n"; print STDERR "STDERR\n"; ' > >( tee stdout.log ) 2> >( tee stderr.log >&2 )
Quelqu'un ici a juste suggéré sudoing té:
Cela pourrait également être utilisé pour rediriger toute commande, pour un répertoire que vous n'avez pas accès. Cela fonctionne parce que le tee programme est effectivement un "écho d'un fichier de programme", et le rediriger vers /dev/null est de l'empêcher aussi de la sortie à l'écran pour garder le même que l'original artificiel exemple ci-dessus.
sudo
(c'est à dire, pour la commande en elle-même) peut être omisUn truc que j'ai trouvé moi-même été
sudo dd
est mieux que lesudo tee /root/file > /dev/null
exemples ci-dessus!dd
est le nom de la commande,of=/root/test.out
est l'argument qui ditdd
ce que les Fichiers de Sortie est.of
signifie du fichier de sortie etdd
est un outil très populaire utilisé dans Linux et OSX (surtout pour écrire des images de disques). C'est une astuce pour vous.dd
est probablement tout aussi utile quetee
ici. Dans les deux cas, vous êtes à l'aide d'une commune, bien connu de commande pour un but qui, bien que légèrement différent de son usage initial, est encore bien connus et bien documentés. Alors quedd
est bon lors de la copie d'énormes quantités de données, il ne suce pas avec de petites quantités. Il a l'avantage, ici, de ne pas en écho à la sortie standard ainsi.sudo dd
à côté l'un de l'autre, vous voulez faire de très, très assurez-vous que les arguments qui suivent sont corrects (surtout compte tenu de sa non-standard de la syntaxe). Ils ne l'appelez pas "disque destroyer" pour rien...sudo tee
etsudo cat
sont tout aussi capables de remplacer des disques. Il faut vraiment êtresudo
c'est le drapeau rouge, mais il est utilisé trop souvent... j'ai vraiment regarder dehors pour/dev/sd...
ou quoi que ce soit dans/dev/
ce n'est pasnull
ouzero
dd
eu plus de fonctionnalités quetee
, par exemplestatus=progress
est génial pour les images qui clignotent.... | sudo dd of=out oflag=append conv=notrunc
tee
essayé d'envoyer des données aussi vite que possible./dev/null
chose) entre l'utilisation detee
etdd
est quetee
peut être utilisé à la sortie de plusieurs fichiers.Le problème est que le commande est exécuté sous
sudo
, mais le redirection est exécuté sous votre nom d'utilisateur. Cela se fait par la coque et il ya très peu que vous pouvez faire à ce sujet.L'habitude moyens de contourner ce sont:
Envelopper les commandes dans un script d'appel en vertu de sudo.
Si les commandes et/ou le fichier journal des modifications, vous pouvez le faire
script de prendre ces arguments. Par exemple:
Appeler le shell et passer la ligne de commande en tant que paramètre avec
-c
Cela est particulièrement utile pour un large composé des commandes.
Par exemple:
Encore une autre variation sur le thème:
Ou de cours:
Ils ont le (petit) avantage que vous n'avez pas besoin de vous souvenir de tous les arguments pour
sudo
oush
/bash
Clarifier un peu sur les raisons de la té option est préférable
En supposant que vous avez l'autorisation appropriée pour exécuter la commande qui génère la sortie, si vous redirigez la sortie de votre commande de tee, vous avez seulement besoin d'élever té privilèges augmentés par rapport avec sudo et directe tee-shirt à écrire (ou ajouter) dans le fichier en question.
dans l'exemple donné dans la question qui signifierait:
pour un couple plus d'exemples concrets:
Dans chacun de ces exemples, vous prenez la sortie d'un non-privilégiés de la commande et de l'écriture à un fichier qui n'est généralement accessible en écriture par l'utilisateur root, qui est à l'origine de votre question.
C'est une bonne idée de faire de cette façon parce que la commande qui génère la sortie n'est pas exécuté avec des privilèges élevés. Il ne semble pas question ici avec
echo
mais lorsque la source de commande est un script que vous n'avez pas entièrement confiance, c'est essentiel.Remarque vous pouvez utiliser l'option-a pour tee-shirt à ajouter append (comme
>>
) pour le fichier cible plutôt que de l'écraser (comme>
).Faire sudo exécuter un shell, comme ceci:
La façon dont je voudrais aller sur ce problème:
Si vous avez besoin d'écrire/de remplacer le fichier:
Si vous devez ajouter au fichier:
Comment de l'écriture d'un script?
Nom de fichier: myscript
Puis utilisez sudo pour exécuter le script:
Je voudrais faire de cette façon:
su
):$ sudo su -c 'pstree -sp $$ >/dev/fd/1'
init(1)───gnome-terminal(6880)───bash(6945)───sudo(401)───su(402)───bash(410)───pstree(411)
Chaque fois que je dois faire quelque chose comme ce que je viens juste de devenir root:
Ce n'est probablement pas le meilleur moyen, mais il fonctionne.
Ne veux pas battre un cheval mort, mais il y a trop de réponses ici que l'utilisation
tee
, ce qui signifie que vous devez redirigerstdout
à/dev/null
sauf si vous voulez voir une copie sur l'écran. Une solution plus simple est d'utilisercat
comme ceci:Remarquez comment la redirection est mis à l'intérieur de citations, de sorte qu'il est évalué par un obus lancé par
sudo
au lieu de celui de l'exécution.sudo bash -c "ls -hal /root > /root/test.out"
. À l'aide de tee évite d'avoir besoin d'un shell, tandis que le chat n'a pas.Ceci est basé sur la réponse impliquant
tee
. Pour faciliter les choses, j'ai écrit un petit script (je l'appellesuwrite
) et le mettre dans/usr/local/bin/
avec+x
autorisation:Comme indiqué dans le UTILISATION dans le code, tout ce que vous avez à faire est de rediriger la sortie de ce script suivie souhaité par le super-utilisateur accessible par le nom de fichier et il sera automatiquement vous invite à saisir votre mot de passe si nécessaire (car il comprend
sudo
).De noter que, puisque c'est un simple wrapper pour
tee
, il accepte également la té-a
option à ajouter, et prend également en charge l'écriture de plusieurs fichiers en même temps.Il a aussi quelques simpliste de protection contre l'écriture de
/dev/
appareils qui a été une préoccupation mentionné dans un des commentaires sur cette page.Peut-être que vous avez été donné sudo accès qu'à certains programmes/les chemins? Ensuite, il n'y a aucun moyen de faire ce que vous voulez. (sauf si on vous le hack c'est en quelque sorte)
Si ce n'est pas le cas, alors peut-être que vous pouvez écrire des scripts bash:
Appuyez sur ctrl + d :
Espère que ça aide.
sudo
de toute façon,at
n'est pas utile ou nécessaire.sudo sh -c 'echo test >/tmp/test.out'
fait de même beaucoup plus efficacement et de manière élégante (mais souffre encore de la faille que vous êtes probablement au courant des choses commeroot
qui n'ont pas besoin de ce privilège; il est généralement préférable d'éviter privilégié des commandes quand vous le pouvez).