Создайте скрипт в bash и сохраните его в месте, требующем sudo

В bash я могу создать скрипт с документом, как на этом сайте: http://tldp.org/LDP/abs/html/abs-guide.html#GENERATESCRIPT

(
cat <<'EOF'
#!/bin/bash
#? [ ] / \ = + < > : ; " , * | 
#/ ? < > \ : * | ”
#Filename="z:"${$winFn//\//\\}
echo "This is a generated shell script."
App='eval wine "C:\Program Files\foxit\Foxit Reader.exe" "'$winFn'"'
$App
EOF
) > $OUTFILE

Если мой $OUTFILE является каталогом, требующим привилегий sudo, куда мне поместить команду sudo или что еще я могу сделать, чтобы она работала?


person D W    schedule 10.12.2010    source источник
comment
Я полагаю, что одним из решений является создание файла во временном месте, а затем перемещение его с помощью sudo в нужное место. Это самый элегантный способ сделать это?   -  person D W    schedule 10.12.2010


Ответы (3)


Просто поставить sudo перед cat не получится, потому что >$OUTFILE пытается открыть $OUTFILE в текущем процессе оболочки, который не запущен от имени пользователя root. Вам нужно, чтобы открытие этого файла произошло в подпроцессе sudo.

Вот один из способов сделать это:

sudo bash -c "cat >$OUTFILE" <<'EOF'
#!/bin/bash
#? [ ] / \ = + < > : ; " , * | 
#/ ? < > \ : * | ”
#Filename="z:"${$winFn//\//\\}
echo "This is a generated shell script."
App='eval wine "C:\Program Files\foxit\Foxit Reader.exe" "'$winFn'"'
$App
EOF

Это запускает подоболочку под sudo и открывает $OUTFILE из этого более привилегированного подпроцесса и запускает cat (как еще один привилегированный подпроцесс). Между тем, (менее привилегированный) родительский процесс передает здесь-документ подпроцессу sudo.

person Laurence Gonsalves    schedule 10.12.2010
comment
Это работает для моего минимального рабочего примера, но не для моего реального сценария. Я достаточно усложнил свой минимальный рабочий пример, не могли бы вы помочь мне с новым скриптом? - person D W; 10.12.2010
comment
@D W: Я не цитировал ваше здесь слово, которое могло быть источником ваших проблем. Извини за это. Попробуйте перецитировать его, как показано в моем обновленном ответе. - person Laurence Gonsalves; 10.12.2010
comment
@D W: вы пробовали обновленный ответ? Он работает с более новым кодом в вашем вопросе. Я только что пошел и обновил его снова, чтобы включить код из вашего вопроса. - person Laurence Gonsalves; 10.12.2010
comment
интересно, что цитаты имеют такое большое значение. Отлично, спасибо. - person D W; 10.12.2010
comment
@D W: Да, я сам был удивлен этому. Из gnu.org/software/bash/manual/bashref.html#Redirections : если слово не заключено в кавычки, все строки здесь-документа подвергаются расширению параметров, подстановке команд и арифметическому расширению. Возможно, полезно, но какой ужасный синтаксис! Моя давняя теория состоит в том, что большая часть синтаксиса bash была разработана вокруг того, что было синтаксической ошибкой в ​​​​предыдущих версиях (где sh был наследственным корнем). - person Laurence Gonsalves; 10.12.2010
comment
@LaurenceGonsalves большая часть синтаксиса bash была разработана с учетом синтаксической ошибки в предыдущих версиях. Весело и разумно одновременно! Великолепно! - person louisgab; 21.04.2018
comment
ИДЕАЛЬНО! (кстати, вам не нужно цитировать «EOF») - person Amir Mehler; 04.05.2018
comment
@AmirMehler Спасибо. Слово здесь, EOF, в этом случае необходимо заключать в кавычки. Подробности смотрите в моем комментарии от 10 декабря 2010 года. - person Laurence Gonsalves; 05.05.2018

Вот как бы я это сделал:

sudo tee "$OUTFILE" > /dev/null <<'EOF'
foo
bar
EOF
person Dennis Williamson    schedule 11.12.2010
comment
Как вы используете этот метод для добавления к существующему файлу? - person MountainX; 21.07.2013
comment
@MountainX: tee -a добавляется к файлу. - person Dennis Williamson; 21.07.2013
comment
но это не расширяет переменные env? - person Mihai Rotaru; 21.07.2014

Ни один из ответов не расширил переменные среды. Мой обходной путь — файл tmp и sudo mv.

l_log=/var/log/server/server.log
l_logrotateconf=/etc/logrotate.d/server
tmp=/tmp/$$.eof
cat << EOF > $tmp
$l_log {
   rotate 12
   monthly
   compress
   missingok
   notifempty
}
EOF
sudo mv $tmp $logrotateconf
person Wolfgang Fahl    schedule 24.12.2019