вывод хвостовой программы в файл в Linux

9

Я знаю, что мы можем использовать следующий формат для перенаправления вывода экрана в файл:

$ your_program > /tmp/output.txt

Однако, когда я использовал приведенную ниже команду, она говорит : «-bash: /home/user/errors.txt: В доступе отказано»

sudo tail /var/log/apache2/error.log > ~/errors.txt

Могу ли я узнать, как заставить работать этот вывод? Файл ~ / errors.txt не существует. Нужно ли создавать этот текстовый файл перед использованием команды redirect?

Xianlin
источник
1
Что произойдет, если вы печатаете echo hi > ~/errors.txt? Является ли /home/userваш правильный каталог дома (или же каким - то образом Баш запутаться о том, где ваш домашний каталог)?
CJM
Является ли userпользователь, запускающий команду?
пользователь неизвестен
да, пользователь является пользователем, который запускает команду
Xianlin
Это нормальное поведение для sudo. sudoне разрешает перенаправление. слишком много способов, которыми люди могли бы использовать это, чтобы делать непослушные вещи, не включенные в sudoers.confфайл. В качестве альтернативы, вы можете запустить sudo bash -c "tail /var/log/apache2/error.log > ~/errors.txt"очистку конца error.log к файлу в вашей домашней директории.
Тим Кеннеди

Ответы:

17

За трубой судо не работает. Я не знаю, почему вы не можете написать у себя дома - возможно, файл принадлежит root?

 sudo tail /var/log/apache2/error.log | sudo tee ~/errors.txt

Может быть, вам нужен другой пользователь позади трубы. Конечно, вам не нужен существующий файл.

Пользователь неизвестен
источник
Да, это сработало ...
Xianlin
Что касается проблемы с разрешениями, может быть, $ HOME монтируется по NFS с rootquash?
Ансгар Эстерманн
$ HOME не смонтирован по NFS.
Xianlin
6

Когда вы пишете sudo somecommand > ~/errors.txt, оболочка, которая вызывает sudo(и работает как вы), выполняет перенаправление и открытие ~/errors.txt. См. Перенаправление stdout в файл, для которого у вас нет разрешения на запись . Обычно проблема в этом случае заключается в том, что вы хотите, чтобы root записывал в файл; см. связанный вопрос для способов сделать это.

Здесь странно, что вы не можете записать файл в свой домашний каталог. Скорее всего, вы ранее сохранили какой-то вывод как root /home/user/errors.txt, и этот файл теперь существует и принадлежит root. Удалите файл (вы можете сделать это, если у вас есть разрешение на запись /home/user, и тогда вы сможете создать его как своего пользователя.

rm ~/errors.txt
sudo tail /var/log/apache2/error.log > ~/errors.txt

Если файл действительно не существует, то у вас нет разрешения на запись в домашний каталог. Хотя это технически возможно и иногда полезно для некоторых пользователей с ограниченными правами, это очень необычно.

Жиль "ТАК - перестань быть злым"
источник
Я попытался удалить '/home/user/errors.txt' и использовать указанную выше команду. Это не сработало, все еще запрещают мне писать в домашний каталог. В любом случае, я думаю, что предоставленная вами ссылка может быть использована в качестве моего решения. Это так же, как первый ответ в этом посте. Однако вы дали некоторые подробные объяснения о перенаправлении stdout в файл, и я благодарю вас за это.
Xianlin