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

На этот вопрос уже есть ответ:

Я следую вместе с примерами из главы 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
задан 15.04.2020, 14:51

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 в самый конец строки.

4
ответ дан 15.04.2020, 14:51
  • 1
    Можно также передать по каналу в мишень для перенаправления как корень. – Raynos 15.04.2020, 14:52

Теги

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