2016-10-27 3 views
3

У меня есть сценарий, который успешно запускает эту команду. Я использую эту команду в другом скрипте, который дает мне ошибку в этой строке (.md5: Permission denied).Команда pipe с sudo

Я запускаю предыдущий скрипт с sudo.

for i in ${NAME}* 
do 
    sudo md5sum $i | sed -e "s/$i/${NAME}/" > ${NAME}.md5${i/#${NAME}/} 
done 

ответ

4

Таким образом, вы хотите перенаправить вывод с правами администратора. Не имеет значения, что вы выполнили команду с sudo, потому что перенаправление не является частью выполнения, поэтому оно не выполняется исполняющим пользователем команды, а вашим текущим пользователем.

Общий Хитрость заключается в том, чтобы использовать tee:

for i in ${NAME}* 
do 
    md5sum $i | sed -e "s/$i/${NAME}/" | sudo tee ${NAME}.md5${i/#${NAME}/} 
done 

Примечание: Я уронил sudo от md5sum, как, вероятно, вам не нужно.

Примечание: tee выходы в двух направлениях: указанный файл и стандартный вывод. Если вы хотите подавить вывод на stdout, перенаправьте его на /dev/null.

+0

Я использовал вышеприведенную команду, получив ошибку ((sed: -e выражение # 1, char 0: нет предыдущего регулярного выражения)) – Sherry

+1

@Sherry, который выглядит как совершенно не связанная проблема. Это может произойти, например, если значение '$ i' пуст. Добавьте строку 'echo 'i = $ i" 'перед строкой' md5sum ... 'и убедитесь, что значение верно – janos

0

Вы принимаете вывод sudo md5sum $i и направляют его в седло, которое не работает как корень. sudo даже не знает, что это sed существует.

Но это не проблема, потому что sed не нуждается в разрешениях root. Проблема > ${NAME}.... Это перенаправляет вывод sed в файл с этим именем. Но перенаправление фактически выполняется вашей оболочкой, которая работает как ваш пользователь. И поскольку > - это встроенный в оболочку оператор, вы не можете его префикс sudo.

Простым решением является использование tee. tee - это программа (поэтому вы можете запускать ее с помощью sudo), которая записывает ее вход в стандартный вывод, а также в файл (например, T-Pipe, отсюда и название). Таким образом, вы можете просто:

for i in ${NAME}* 
do 
    md5sum $i | sed -e "s/$i/${NAME}/" | sudo tee ${NAME}.md5${i/#${NAME}/} 
done 

Примечание это также будет сбрасывать все хэши в свой стандартный вывод.

Смежные вопросы