Question Impossible de rediriger la sortie standard [dupliquer]


Cette question a déjà une réponse ici:

Je suis avec les exemples du chapitre 6 Redirection de La ligne de commande Linux (2012). J'essaie de rediriger la sortie standard d'un ls commande à un fichier texte. Je continue à recevoir une erreur de permission refusée. J'utilise Ubuntu 13.04. Voir ci-dessous:

ta2tyrants@Vaio:/$ ls -l /usr/bin >> ls-output.txt
bash: ls-output.txt: Permission denied

J'ai essayé d'exécuter cette commande en utilisant un accès root et d'obtenir la même erreur:

ta2tyrants@Vaio:/$ sudo ls -l /usr/bin >> ls-output.txt
bash: ls-output.txt: Permission denied

Qu'est-ce que je fais mal? Y a-t-il un moyen de contourner ceci?


1
2017-10-13 22:15


origine




Réponses:


Solution 1: rediriger vers un fichier que vous pouvez écrire

Votre répertoire de travail actuel est /, qui par défaut ne peut être modifié que par root. Type cd ~ pour changer de dossier ou cd suivi du chemin d'accès à un répertoire que vous pouvez écrivez à, puis recommencez.

Solution 2: rediriger avec sh en dessous de sudo

Les redirections de shell ne sont pas transmises aux programmes. Cela signifie que même si exécuter un programme sous sudo, redirection (comme >>) sera toujours effectué sous votre compte. C'est ce qui se passe:

  sudo         ls -l /usr/bin         >>/ls-output.txt
-------------------------------------------------------
|     execute external program      | redirect stdout |       what your shell sees
| sudo | command to execute as root |                            what sudo sees

Si tu veux sudo une redirection, vous devez exécuter un shell en tant que root. Tu peux le faire:

     sudo         sh   -c '      ls -l /usr/bin           >>/ls-output.txt   '
-------------------------------------------------------------------------------
|      execute external program (pass the single-quoted string verbatim)      | your shell
|    sudo       |                command to execute as root                   |    sudo
                | sh | -c | execute external program |    redirect stdout     | root shell

De cette façon, la redirection fait partie d'un sh invocation qui se fait sous sudo.

Solution 3: rediriger avec tee en dessous de sudo

Comme Oli  suggéré, vous pouvez également diriger votre commande en tee:

       ls -l /usr/bin          |     sudo        tee /ls-output.txt
-------------------------------------------------------------------------
| execute external program | pipe |      execute external program       | your shell
                                  |  sudo  | command to execute as root |    sudo

Notez que le tee est exécuté sous sudo, mais pas le ls. Ceci est dû au fait tee nécessite des privilèges root (pour écrire à /ls-output.txt), et ls ne fait pas. Si le programme générant une sortie fait besoin de privilèges root, vous devez sudo les deux.

   sudo        ls -l /root              |    sudo        tee /ls-output.txt
--------------------------------------------------------------------------------
|     execute external program      | pipe |     execute external program      | your shell
| sudo | command to execute as root |                                             sudo #1
                                           | sudo | command to execute as root |  sudo #2

De plus, si vous ne voulez pas que la sortie soit affichée à l’écran, vous pouvez ajouter >/dev/null à la toute fin de la ligne.


4
2017-10-13 22:30



Vous pouvez également passer en tee pour rediriger en tant que root. - Oli♦