Когда я использую sudo, чтобы разрешить редактирование файлов, я регулярно получаю «разрешение запрещено».
Например, моя мышь нервная и вялая, поэтому я хочу отключить опрос:
sudo echo "options drm_kms_helper poll=N">/etc/modprobe.d/local.conf
Мне предлагается ввести пароль, а затем получить:
bash: /etc/modprobe.d/local.conf: Permission denied
Поэтому я попытался сделать временное изменение, чтобы отключить опрос, используя:
sudo echo N> /sys/module/drm_kms_helper/parameters/poll
И снова система ответила:
bash: /sys/module/drm_kms_helper/parameters/poll: Permission denied
Есть идеи?
command-line
bash
sudo
Джек
источник
источник
saji@laptop:~$ sudo echo "Hi" [sudo] password for saji: Hi
echo
как sudo, если вы не сделаете что-то подобноеsudo bash -c 'echo …'
; однако системы POSIX обычно предоставляют внешнююecho
команду, такую как/bin/echo
в OS X, которую sudo может выполнить без rigamarole. Таким образом,echo
команда, которую вы обычно запускаете, иecho
команда, которую вы запускаете с помощью sudo, вероятно, являются двумя разными, но похожими командами.Перенаправление вывода выполняется оболочкой, из которой была вызвана команда . Итак, разбивая все на кусочки, вот что происходит *:
вызывает оболочку
sudo echo "options drm_kms_helper poll=N"
, которая выполняетsudo
команду сecho "options drm_kms_helper poll=N"
командной строкойСудо запрашивает пароль, открывает суперпользователя оболочку и вызывает
echo "options drm_kms_helper poll=N"
, который запускаетecho
команду передачи его"options drm_kms_helper poll=N"
echo, работающий с
root
привилегиями, выводит строку в стандартный вывод.echo
команда завершается, суперпользовательская оболочка завершается,sudo
завершаетсяоболочка, из которой была вызвана команда, собирает выходные данные и пытается перенаправить их
/etc/modprobe.d/local.conf
, что доступно для записи только пользователю root. Получает ошибку «Отказано в доступе».Чтобы узнать, как это исправить, смотрите ответ @shantanu.
(*) - хотя приведенная выше последовательность помогает понять, почему команда терпит неудачу, в действительности все происходит несколько не по порядку: исходная оболочка замечает перенаправление и пытается открыть файл для записи перед вызовом
sudo ...
команды. При открытии файла происходит сбой, оболочка даже не вызывает команду, которая должна была записать файл (спасибо @PanosRontogiannis за это).Вот быстрый тест:
В тесте выше
whoami | tee who.txt
собирался создать файл с именем,who.txt
содержащим слово «root». Однако, когда перенаправление вывода завершается неудачно в вызывающей оболочке, файл who.txt также отсутствует, так как команда не была вызвана.источник
Добавление к ответу Шантану:
... Или вы можете использовать такую
tee
команду:или если вывод команды:
источник
sudo tee /sys/module/drm_kms_helper/parameters/poll > /dev/null
если вы не хотите, чтобы печатьstdout
тоже.Подход, о котором я не упомянул, это просто выполнить всю командную строку в своей собственной оболочке. Сама
sudo
страница руководства приводит пример такого подхода:источник
Другой вариант - использовать временный файл. Это полезно в скрипте bash.
источник
sudo dd of=
Чтобы добавить, как вы хотите:
или воссоздать файл с нуля:
Преимущества:
tee
без/dev/null
перенаправленияsh
отсутствие явной подоболочки (но неявной для перенаправления)dd
имеет много мощных опций, например,status=progress
чтобы увидеть прогресс передачиРаботает потому, что sudo пересылает stdin в команду.
источник
dd
том, как мы перезаписываем наши когда-то великолепные файловые системы, и не понимаем, что это тоже для мирских задач - и что другие команды от имени root также наносят большой вред, если используются на неправильных файлах / устройствах. Какsudo tee
и ,sudo dd
конечно , также работать с здесь строк , например,sudo dd of=outfile <<<'hello world'
. [Спасибо за редактирование. NB сsh -c 'cmd'
,sh
является подпроцессом, который является оболочкой, но на самом деле не подоболочкой, за исключением того, что все внешние команды начинаются как единое целое.]