1023 votes

Comment utiliser sudo pour rediriger la sortie vers un emplacement je n ' t ont la permission d’écrire à ?

J’ai eu accès sudo sur une de nos boîtes développement de linux RedHat, et j’arrive pas à trouver moi-même assez souvent besoin de rediriger la sortie vers un endroit que je n’ai normalement pas accès en écriture au.

Le problème, c’est cet exemple artificiel ne fonctionne pas :

Je viens de recevoir la réponse :

Comment est-ce que je peux obtenir cela fonctionne ?

1422voto

Cristian Ciupitu Points 5692

Votre commande ne fonctionne pas parce que la redirection est effectuée par votre coque qui n'ont pas la permission d'écrire à l' /root/test.out. La redirection de la sortie n'est pas effectuée par sudo.

Il y a plusieurs solutions:

  • Exécuter un shell avec sudo et donner la commande à l'aide de la -c option:

    sudo sh -c 'ls -hal /root/ > /root/test.out'
    
  • Créer un script avec vos commandes et exécutez le script avec la commande sudo:

    #!/bin/sh
    ls -hal /root/ > /root/test.out
    

    Exécutez 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:

    [nobody@so]$ sudo -s
    [root@so]# ls -hal /root/ > /root/test.out
    [root@so]# ^D
    [nobody@so]$
    
  • Utiliser sudo tee (si vous avez pour échapper à beaucoup lors de l'utilisation de l' -c option):

    sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null
    

    La redirection d' /dev/null est nécessaire pour arrêter de la sortie à l'écran. Pour ajouter au lieu de remplacer le fichier de sortie, utilisez tee -a ou tee --append.

Merci à Jd, Adam J. Forster et Johnathan pour les deuxième, troisième et quatrième solutions.

129voto

Jonathan Points 6934

Quelqu'un ici vient de proposer sudoing té :

Cela pourrait aussi être utilisé pour rediriger toute commande, dans un répertoire que vous n’avez pas accès à. Cela fonctionne parce que le tee est efficacement un programme de « echo dans un fichier », et la redirection vers/dev/null est d’arrêter elle aussi sortie à l’écran pour garder les mêmes que l’original exemple artificiel ci-dessus.

92voto

rhlee Points 1177

Un truc que j’ai réalisé moi-même a été

58voto

dsm Points 7429

Le problème est que la commande est exécuté en vertu de l' sudo, mais la 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.

[dsm@localhost:~]$ sudo command > /some/file.log
                   `-----v-----'`-------v-------'
                      command        redirect

Les habituels 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:
    sudo log_script command /log/file.txt
  • Appeler le shell et passer la ligne de commande comme un paramètre avec l'option `-c`
    Cela est particulièrement utile pour un large composé des commandes. Par exemple:
    sudo bash -c "{ command1 arg ; command2 arg ; } > /log/file.txt;"

19voto

Penfold Points 1904

Faire sudo exécuter un shell, comme ceci :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X