Когда вы используете sudo с перенаправлением, я получаю «разрешение отказано»,

Если ваше ядро ​​поддерживает «inotify», и вы загружаете язык сценариев Python, интересной альтернативой для резервного копирования в основном в реальном времени является inosync, сценарий Python, предоставленный автором, Бенедикт Бём из Германии (http: //bb.xnull.de/). Вы изменяете свой примерный файл конфигурации, чтобы указать на исходные и целевые папки и inosync в фоновом режиме, используя rsync, чтобы обновить цель с изменениями в источнике.

1
задан 30 May 2014 в 04:40

5 ответов

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

shell вызывает sudo echo "options drm_kms_helper poll=N", который выполняет команду sudo с командной строкой echo "options drm_kms_helper poll=N" sudo запрашивает пароль, открывает оболочку суперпользователя и вызывает [ f5], который запускает команду echo, передавая ей "options drm_kms_helper poll=N" эхо, работая с привилегиями 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» также отсутствует, потому что команда не была вызвана.

69
ответ дан 25 May 2018 в 03:14
  • 1
    Скорее всего, оболочка «вилки» сама и пытается открыть /etc/modprobe.d/local.conf перед попыткой «exec» sudo, что означает, что первые 4 шага, которые вы описываете, никогда не происходят, потому что файл не может быть открыт. – Panos Rontogiannis 30 May 2016 в 12:32
  • 2
    @PanosRontogiannis: спасибо, я обновил ответ – Sergey 6 June 2016 в 23:35

Добавление к ответу Shantanu:

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

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

или если ее вывод команды: [!d3 ]

echo 10 | sudo tee /sys/module/drm_kms_helper/parameters/poll
55
ответ дан 25 May 2018 в 03:14
  • 1
    +1 вход в систему как root - плохая идея для ручной работы, а действительно плохая идея для сценариев. – l0b0 19 December 2012 в 22:41
  • 2
    Кроме того, sudo tee /sys/module/drm_kms_helper/parameters/poll > /dev/null, если вы не хотите, чтобы он печатался на stdout. – Fabian Tamp 27 October 2015 в 11:46

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

Сделать список использования каталогов в разделе / ​​home. Обратите внимание, что это выполняет команды в под-оболочке, чтобы сделать работу cd и перенаправление файлов.
$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"
13
ответ дан 25 May 2018 в 03:14

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

temp=$(mktemp)
echo "Hello, world!" > $temp
sudo cp $temp /etc/wherever
1
ответ дан 25 May 2018 в 03:14

sudo dd of=

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

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

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

echo inbytes | sudo dd of=outfile

Преимущества: [ ! d4] лучше, чем tee, поскольку перенаправление /dev/null более красивое, чем sh, поскольку явная подоболочка (но неявная для перенаправления) dd имеет множество мощных параметров, например status=progress, чтобы увидеть ход передачи

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

1
ответ дан 25 May 2018 в 03:14
  • 1
    Это хорошо. Мы думаем о dd как о том, как мы перезаписываем наши некогда большие файловые системы, и не понимаем, что это для мирских задач тоже, и что другие команды как root также наносят большой вред при использовании на неправильных файлах / устройствах. Как sudo tee , sudo dd, конечно, также будет работать с здесь целыми , например, sudo dd of=outfile <<<'hello world'. [Спасибо за редактирование. NB с sh -c 'cmd', sh является подпроцессом, который является оболочкой, но не является подоболочкой, кроме как в смысле все внешние команды начинаются как единое целое.] – Eliah Kagan 24 October 2017 в 19:00

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

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