Сгенерируйте скрипт в bash и сохраните его в месте, требующем sudo - PullRequest
26 голосов
/ 10 декабря 2010

В 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 или что еще можно сделать, чтобы она работала?

Ответы [ 2 ]

54 голосов
/ 11 декабря 2010

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

sudo tee "$OUTFILE" > /dev/null <<'EOF'
foo
bar
EOF
22 голосов
/ 10 декабря 2010

Простое размещение 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.

...