Когда я использую 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
Есть идеи?
Перенаправление вывода (с помощью оператора >
) выполняется оболочкой, а не 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"
Другой вариант - использовать временный файл. Это полезно в сценарии bash.
temp=$(mktemp)
echo "Hello, world!" > $temp
sudo cp $temp /etc/wherever
Подход, о котором я здесь не упоминал, заключается в простом выполнении всей командной строки в ее собственной оболочке. Сама справочная страница sudo
дает пример такого подхода:
Составление списка использования каталогов в разделе / home. Обратите внимание, что при этом выполняются команды в суб-оболочке, чтобы заставить работать перенаправление компакт-диска и файлов.
$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"
Вы можете использовать команду 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
].
Перенаправление вывода выполняется оболочкой из которая была вызвана командой . Итак, разбивая все на части, вот что происходит *: оболочка
вызывает 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 также отсутствует, поскольку команда не была вызвана.
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 команде.