На этот вопрос уже есть ответ здесь:
Я следую вместе с примеры в главе 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: перенаправить в файл, который вы можете записать в
Ваш текущий рабочий каталог - /
, который по умолчанию может быть изменен только пользователем 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
в самый конец строки.