Я часто использую следующую конструкцию для сборки и установки тарбола:
sudo -v && make && sudo make install
, который позволит мне сразу же ввести свой пароль и сделать все без присмотра. Это работает хорошо, за исключением редкого случая, когда сборка занимает больше времени, чем тайм-аут sudo
, что может произойти на моей довольно медленной машине с большими проектами (даже при использовании make -j4
).
Но когда сборка занимает много времени, это именно то, когда выполнение дел без присмотра имеет большое преимущество. Может кто-нибудь придумать конструкцию оболочки, которая позволяет мне сразу же вводить мой пароль и которая make
выполняется с обычными разрешениями и make install
с повышенными разрешениями?
По соображениям безопасности я не хочу настроить моего пользователя на использование sudo
без пароля.
Жизнеспособный вариант - установить очень большой тайм-аут, но я надеюсь на что-то более элегантное.
После того как Вы - полученные полномочия пользователя root, можно использовать sudo
снова выполнить команду как некорневого пользователя:
sudo bash -c "sudo -u $USER non-root-user-command ; root-command"
Обратите внимание, что необходимо использовать двойные кавычки, не одинарные кавычки. Если Вы используете одинарные кавычки, $USER
будет заменен root
, который не достигнет желаемого результата. Хотелось бы надеяться, эти команды проиллюстрируют мой тезис:
$ sudo bash -c "echo $USER"
david
$ sudo bash -c 'echo $USER'
root
Так, давайте возьмем пример, упомянутый в вопросе:
make && sudo make install
Это стало бы:
sudo bash -c "sudo -u $USER make && make install"
Самый простой метод, который не требует от вас изменения системных файлов:
echo {password} | sudo -S -v && make && echo {password} | sudo -S make install
Это позволит сценарию работать без запроса пароля.
Однако этот метод представляет угрозу безопасности, поскольку вы храните свой пароль в виде простого текста.
Некоторые другие методы можно найти здесь , но большинство из них касаются редактирования системных файлов.
edit: если вы добавите пробел перед первым эхом, команда не будет отображаться в истории bash.
Я думаю, что это лучший способ сделать это:
make | sudo bash -c 'cat - && make install'
Это запустит одновременно make
и sudo
, с запросом sudo
для вашего пароля. Между тем, make
отправляет весь свой вывод в канал, который читается командой cat
. После этого запускается make install
. Он вызывается из процесса bash
, который по-прежнему имеет повышенные разрешения, поэтому проблема с тайм-аутом отсутствует.