Как решить & ldquo; разрешение отклонено & rdquo; при использовании sudo с перенаправлением в Bash?

Когда я использую 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

Есть идеи?

168
задан 18 June 2018 в 17:21

6 ответов

Перенаправление вывода (с помощью оператора > ) выполняется оболочкой, а не echo . Вы должны войти в систему как root

sudo -i

Затем вы можете использовать перенаправление

echo N> /sys/module/drm_kms_helper/parameters/poll

В противном случае вы можете запустить строку bash с помощью sudo

sudo bash -c "echo N> /sys/module/drm_kms_helper/parameters/poll"
188
ответ дан 18 June 2018 в 17:21

Другой вариант - использовать временный файл. Это полезно в сценарии bash.

temp=$(mktemp)
echo "Hello, world!" > $temp
sudo cp $temp /etc/wherever
4
ответ дан 18 June 2018 в 17:21

Подход, о котором я здесь не упоминал, заключается в простом выполнении всей командной строки в ее собственной оболочке. Сама справочная страница sudo дает пример такого подхода:

Составление списка использования каталогов в разделе / ​​home. Обратите внимание, что при этом выполняются команды в суб-оболочке, чтобы заставить работать перенаправление компакт-диска и файлов.

$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"
17
ответ дан 18 June 2018 в 17:21

Вы можете использовать команду tee следующим образом:

sudo tee /sys/module/drm_kms_helper/parameters/poll <<<10

Или, если это вывод команды:

echo 10 | sudo tee /sys/module/drm_kms_helper/parameters/poll

Если у вас была ситуация, когда вы хотели добавить, а не перезапишите целевой файл - то есть, чтобы tee вел себя как >> , а не > , вы должны использовать tee -a ].

64
ответ дан 18 June 2018 в 17:21

Перенаправление вывода выполняется оболочкой из которая была вызвана командой . Итак, разбивая все на части, вот что происходит *: оболочка

  • вызывает sudo echo "options drm_kms_helper poll = N" , который выполняет команду sudo с echo » options drm_kms_helper poll = N " командная строка

  • sudo запрашивает пароль, открывает оболочку суперпользователя и вызывает 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 за указание на это).

Вот быстрый тест:

$ touch ./onlyroot.txt
$ sudo chown root:root ./onlyroot.txt
$ sudo bash -c "whoami | tee who.txt" > onlyroot.txt
bash: onlyroot.txt: Permission denied

В тесте над whoami | tee who.txt собирался создать файл с именем who.txt , содержащий слово «root». Однако при сбое перенаправления вывода в вызывающей оболочке файл who.txt также отсутствует, поскольку команда не была вызвана.

82
ответ дан 18 June 2018 в 17:21

sudo dd of =

Чтобы добавить, как вы хотите:

echo inbytes | sudo dd of=outfile oflag=append conv=notrunc

или воссоздать файл с нуля:

echo inbytes | sudo dd of=outfile

Преимущества:

  • лучше, чем tee , поскольку нет / dev / null перенаправление
  • лучше, чем sh , поскольку нет явной подоболочки (но имп icit one для перенаправления)
  • dd имеет много мощных опций, например status = progress , чтобы увидеть ход передачи

Работает, потому что sudo перенаправляет stdin команде.

3
ответ дан 18 June 2018 в 17:21

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

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