Введите пароль для команды sudo в цепочке команд

Как в Linux ввести пароль для одной из команд в цепочке команд, для которой требуется sudo. Один пример, который я могу придумать, это когда после выполнения длинной задачи компиляции я хочу выключить машину.

make ; sudo init 0 

Я хочу, чтобы команда выключения запускалась только после завершения make, но хотел бы сразу ввести пароль, потому что меня не будет, когда будет выполнена первая команда. Кроме того, я не хочу запускать make с правами суперпользователя. Таким образом, о переходе на root и выполнении команд также не может быть и речи.

Спасибо!


person Rohit    schedule 20.05.2011    source источник


Ответы (6)


sudo sh -c "su -c 'make' $USER && init 0"

Меняйте свой uid рано и часто. Это путь Чикаго!

person Seth Robertson    schedule 20.05.2011
comment
Это то, что делает приведенная выше команда? Вы запускаете оболочку как суперпользователь, но в ней команда su запускается make как текущий пользователь, после чего init 0 запускается как суперпользователь. - person Rohit; 20.05.2011
comment
@Rohit: Да, это именно то, что он делает. Обратите внимание на использование двойных кавычек, чтобы $USER интерпретировался в контексте внешней оболочки до изменения uid. Кроме того, суперпользователь может запускать su без ввода пароля. - person Seth Robertson; 20.05.2011

Вы можете запустить sudo -v, чтобы обновить временную метку sudo. Это означает, что вам не нужно будет вводить пароль в течение x минут (по умолчанию 5). Вы можете изменить время ожидания, отредактировав timestamp_timeout в файле sudoers.

Вы также можете изменить свою команду на

make && sudo init 0

который выключится только в случае успешного завершения make.

person OpenSauce    schedule 20.05.2011

Одна из возможностей — использовать Expect для автоматизации ввода пароля.

Вот простой HOW-TO для ожидания и паролей: http://www.linux.com/archive/feed/56066

Другая возможность — отредактировать файл /etc/sudoers и настроить пользователя так, чтобы он мог использовать sudo без пароля. если вы проверите файл, это будет объяснено в комментариях.

person DallaRosa    schedule 20.05.2011

Почему бы не передать пароль в sudo?

make; echo 'password' | sudo -S init 0

person Jay Sidri    schedule 20.05.2011
comment
+1, вот что мне нужно сделать: System.exec("make; echo 'password' | sudo -S init 6"); - person ; 12.10.2012

Измените тайм-аут для sudo на что-то достаточно продолжительное, чтобы покрыть ваше использование, затем запустите что-то вроде sudo echo для аутентификации, а затем запустите другие команды. Пока время ожидания пароля не истекло, он должен выполняться без повторного запроса.

person Caleb    schedule 20.05.2011

Вы можете добавить это в свой файл sudoers

username ALL = NOPASSWD: /sbin/init

где имя пользователя — это имя пользователя, которое вы хотите разрешить.

person freethinker    schedule 20.05.2011
comment
Работает, но имеет побочный эффект, заключающийся в том, что пользователь может выполнить sudo init 0 в любое время без пароля (в то время как вопрос действительно хотел, чтобы разрешение исчезло впоследствии)... после этого не оставляйте свой терминал без присмотра. - person Konerak; 20.05.2011
comment
да, небезопасное решение, но большинство дистрибутивов все равно позволяют пользователю завершить работу/перезагрузиться через графический интерфейс. - person freethinker; 20.05.2011