Поиск md5sum каталога возвращает разрешение denied [duplicate]

С двойными кавычками $v заменяется интерактивная оболочка. Используйте одинарные кавычки:

$ bash -c 'v=value;echo $v'
value
117
задан 18 June 2018 в 17:21

12 ответов

Перенаправление вывода (через оператор >) выполняется оболочкой, а не эхом. Вы должны войти в систему как 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"
121
ответ дан 18 July 2018 в 10:09

Перенаправление вывода (через оператор >) выполняется оболочкой, а не эхом. Вы должны войти в систему как 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"
121
ответ дан 24 July 2018 в 19:31

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

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

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

или если ее вывод команды:

echo 10 | sudo tee /sys/module/drm_kms_helper/parameters/poll
55
ответ дан 18 July 2018 в 10:09

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 в команду.

2
ответ дан 18 July 2018 в 10:09

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

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

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

shell вызывает 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" эхо, работая с привилегиями 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
ответ дан 18 July 2018 в 10:09

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

temp=$(mktemp) echo "Hello, world!" > $temp sudo cp $temp /etc/wherever
2
ответ дан 18 July 2018 в 10:09

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

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

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

или если ее вывод команды:

echo 10 | sudo tee /sys/module/drm_kms_helper/parameters/poll
55
ответ дан 24 July 2018 в 19:31
  • 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

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 в команду.

2
ответ дан 24 July 2018 в 19:31
  • 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

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

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

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

shell вызывает 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" эхо, работая с привилегиями 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
ответ дан 24 July 2018 в 19:31
  • 1
    Скорее всего, оболочка «вилки» сама и пытается открыть /etc/modprobe.d/local.conf перед попыткой «exec» sudo, что означает, что первые 4 шага, которые вы описываете, никогда не происходят, потому что файл не может быть открыт. – Panos Rontogiannis 30 May 2016 в 12:32
  • 2
    @PanosRontogiannis: спасибо, я обновил ответ – Sergey 6 June 2016 в 23:35

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

temp=$(mktemp) echo "Hello, world!" > $temp sudo cp $temp /etc/wherever
2
ответ дан 24 July 2018 в 19:31

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

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