Не удается перенаправить стандартный вывод [дубликат]

Я следую вместе с примеры в главе 6 Перенаправление из Командная строка Linux (2012). Я пытаюсь перенаправить стандартный вывод команды ls в текстовый файл. Я все время получаю сообщение об ошибке "Отказано в разрешении". Я использую Ubuntu 13.04. См. Ниже:

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

Я попытался запустить эту команду, используя root-доступ, и получил ту же ошибку:

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

Что я делаю не так? Есть ли способ обойти это?

1
задан 14 October 2013 в 02:40

1 ответ

Решение 1: перенаправить в файл, который вы можете записать в

Ваш текущий рабочий каталог - /, который по умолчанию может быть изменен только пользователем root. Введите cd ~, чтобы перейти в свою домашнюю папку, или cd, а затем укажите путь к каталогу, в который можно записать, а затем повторите его.

Решение 2: перенаправление с sh в sudo

Перенаправления оболочки не передаются программам. Это означает, что даже если выполнить программу в соответствии с sudo, перенаправление (например, >>) все равно будет выполняться под вашей учетной записью. Вот что происходит:

  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

Если вы хотите sudo перенаправить, вам нужно запустить оболочку от имени пользователя root. Вы можете сделать это:

     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

Таким образом, перенаправление является частью вызова sh, который выполняется в соответствии с sudo.

Решение 3: перенаправить с tee в sudo

Как Оли ♦ предложил , вы также можете передать свою команду в 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

Обратите внимание, что tee выполняется в соответствии с sudo, но не ls. Это потому, что tee нужны корневые привилегии (для записи в /ls-output.txt), а ls - нет. Если программа, генерирующая вывод , действительно нуждалась в привилегиях суперпользователя, вам нужно sudo оба из них.

   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

Также, если вы не хотите, чтобы вывод отображался на экране, вы можете добавить >/dev/null в самый конец строки.

0
ответ дан 14 October 2013 в 02:40

Другие вопросы по тегам:

Похожие вопросы: