2015-11-12 3 views
0

Я пытаюсь запустить приложение, для которого требуется много переключателей, чтобы работать, поэтому у меня есть многоуровневое их использование с помощью оператора \. Теперь мне нужно запустить это приложение, а также экспортировать некоторый экспорт в качестве другого пользователя.Как запускать многострочные команды bash как sudo

То, что я в настоящее время пытается сделать

sudo -u user bash <<EOF 
export AUDIO_DRV=alsa 
export ... 
exec application --switch1 \ 
    --switch2 \ 
    --switch3 \ 
    --switch4 \ 
    ... \ 
    "[email protected]" 
EOF 

Я бы запустить sudo myscript.sh так, что корень может настроить несколько вещей, прежде чем он падает привилегии для запуска основного приложения. Проблема заключается в том, что многострочные коммутаторы не все передаются в приложение, что приводит к неожиданным результатам.

Есть ли способ сделать эту работу такой чистой, как это было бы или я застрял, добавив все переключатели в одну строку, чтобы она работала?

ответ

0

Отдельные примеры - отличный способ узнать, что пошло не так и почему.

Вот самодостаточный пример, который показывает, что использование многострочных аргументов в порядке:

touch myfile.txt 
bash << eof 
find . \ 
    -name '*.txt' \ 
    -type f 
eof 

Вот еще самодостаточный пример, который показывает, что использование "[email protected]" неправильно:

touch foo bar 
set -- foo bar 
bash << eof 
    ls "[email protected]" 
eof 

Ожидаемый результат: bar foo (поскольку ls содержит два файла), но фактический результат ls: cannot access foo bar: No such file or directory (потому что ls пытается перечислить один).

Это происходит потому, что [email protected] расширяется до передачи колотить, так что вместо волшебного цитировали поведение "[email protected]" вы просто получить [email protected] заменены конкатенациями переменных между буквальными двойными кавычками.

Вы должны вместо этого передать параметры, чтобы колотить и имеют Баш расширить их:

touch foo bar 
set -- foo bar 
bash -s -- "[email protected]" << eof 
    ls "\[email protected]" 
eof 
+0

«$ @» была именно этой проблемой. Благодаря! Единственная причина, по которой я думал, что это аргументы с несколькими строками, состояла в том, что приложение печатало сообщения о том, что не принимал один из необходимых переключателей для работы или, как я думал. Благодаря! –

+0

@randynewfield Я пропустил '-', который говорит bash, чтобы не интерпретировать их как свои собственные варианты. –

+0

Спасибо. Сейчас все отлично работает. –

0

Я думаю, что здесь есть ответ на этот вопрос: how to run two commands in sudo?

вообще его:

Судо -s - «Whoami; whoami '

sudo -u user -s -- ' \ 
    whoami; \ 
    whoami; \ 
    "[email protected]" 
' 
+0

Итак, вы говорите, что нет возможности чистить несколько коммутаторов для одного приложения в sudo? –

+0

Вам не нужна обратная косая черта внутри указанной строки. – chepner

+0

@chepner прав не нуждается в черных чертах, нужно положить точку с запятой после каждой команды –

0

Вы можете написать команду в файл и выполнить их в виде сценария, используя Sudo. Сценарий не должен содержать многострочный выход «\» - вы можете написать всю команду только в одной строке, если хотите.

Кроме того, вы можете построить функцию и выполнить функцию, используя sudo.

MyFuncion(){ 
    application --switch1 --switch2 --switch3 --switch4 "[email protected]" 
    cmd 2 
    # etc 
} 
sudo MyFunction