2009-11-09 02:37:00 +0000 2009-11-09 02:37:00 +0000
123
123

sudo с паролем в одной командной строке?

В напряженные дни я бы хотел запустить

$ ./configure && make && sudo make install && halt

ночью и лечь спать, надеясь, что приложение будет установлено автоматически. Но на следующий день я вижу экран, на котором sudo запрашивает у меня пароль. Так как же я могу запустить sudo с паролем в одной командной строке, или есть какой-нибудь другой способ сделать это?

Ответы (11)

185
185
185
2009-11-09 02:47:20 +0000

Да, используйте переключатель -S, который считывает пароль от STDIN:

$echo <password> | sudo -S <command>

Так что в вашем случае все будет выглядеть следующим образом:

$./configure && make && echo <password> | sudo -S make install && halt

, конечно, замените <password> на ваш пароль.

11
11
11
2009-11-09 03:03:22 +0000

Вы также можете настроить sudo с visudo, чтобы пользователь мог использовать make как sudo без пароля.

User_Alias USERS = your_user
Cmnd_Alias CMDS = /usr/bin/make
USERS ALL = (ALL) NOPASSWD: CMDS
10
10
10
2012-08-08 06:52:50 +0000

Недостатком некоторых других решений является то, что они без необходимости запускают ./configure и make от корня.

Это немного запутанно, но это должно работать:

sudo sh -c "su $USER -c ./configure && su $USER -c make && make install && halt"

Обратите внимание на использование двойных кавычек, чтобы позволить $USER быть расширенной (не корневой) оболочкой.

Я также могу добавить sleep 60 перед командой halt. Иногда я делал такие вещи, ожидая, что команда будет запущена в течение долгого времени, но что-то идет не так, и она заканчивается немедленно; sleep позволяет мне убить команду до того, как система выключится. Или вы можете использовать shutdown с аргументом времени.

10
10
10
2009-11-09 03:14:31 +0000

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

$sudo su

$./configure && make && make install && halt

Вам сразу же будет предложено ввести пароль, после чего остальные команды будут выполняться как суперпользователь.

9
9
9
2014-11-25 19:43:17 +0000

Установите HISTIGNORE на “sudo -S

$ export HISTIGNORE='*sudo -S*'

Затем надежно передайте свой пароль в sudo:

$ echo "your_password" | sudo -S -k <command>

“HISTIGNORE” означает не сохранять эту команду в истории. Это история в памяти или файл “~/.bash_history”.

Например, ниже будет безопасно передавать ваш пароль на команду sudo, без сохранения истории вашего пароля.

“-S”, означает использовать stdin для пароля,

“-k” означает игнорировать кэшированные учетные данные, чтобы заставить sudo всегда спрашивать. Это для последовательного поведения.

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -k whoami
$ echo "<your_password>" | sudo -S -k cat /etc/shadow
$ echo "<your_password>" | sudo -S -k bash /tmp/myscript.sh

Недостатком вышеуказанного метода является то, что если вы хотите увидеть команды, которые вы выполняли в истории позже, то их там не будет. Другим методом является обновление кэша учетных записей sudo аутентификации (по умолчанию включен тайм-аут на 5 минут), а затем запуск sudo отдельно. Но недостатком этого является то, что вам нужно знать о 5-минутном кэше.

Например:

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -v
$ sudo whoami
$ echo "<your_password>" | sudo -S -v
$ sudo cat /etc/shadow
$ echo "<your_password>" | sudo -S -v
$ sudo /tmp/myscript.sh

Обратите внимание, что я выполнил sudo перед каждой командой, чтобы убедиться, что кэш sudo обновлен, так как по умолчанию 5 минут. Да, whoami не должны занимать 5 минут, но я подумал, что для последовательности я могу запустить его перед каждой командой. Вы также можете поместить “export HISTIGNORE=‘sudo -S’” в ваш файл ~/.bashrc, а затем загрузить его “. ~/.bashrc” или логотипом, затем войдите в систему. Тем не менее, я думаю использовать это для целей скриптов, так что я буду держать это в верхней части всех моих скриптов для лучших методов безопасности. Установка вместо этого “echo ”“ | sudo -S -v” в переменную также может быть хорошей идеей, затем просто запустите переменную перед каждой командой, которая нуждается в привилегиях root, смотрите комментарий Janar. Комментарий “John T” также должен включать параметр “-k”, как если бы вы запустили “sudo -S” без “-k” и в кэше аутентификации sudo уже есть ваши учетные данные (и он все еще действителен, кэш аутентификации sudo по умолчанию составляет 5 минут), то bash вместо этого запустит ваш пароль как команду, что плохо.

5
5
5
2015-06-09 14:15:37 +0000

Ты тоже можешь это сделать:

sudo -S <<< "password" command
4
4
4
2014-12-08 15:18:13 +0000

Обратите внимание, я обнаружил, что этот метод не работает на старой версии sudo, а именно “Sudo version 1.6.7p5”:

$ echo "<your_password>" | sudo -S -k whoami

Где этот метод работает на старой и новой версии sudo:

$ echo "<your_password>" | sudo -S -v
$ sudo whoami
2
2
2
2011-04-19 23:56:23 +0000

Если вы хотите быть более внимательными, вы можете сделать сценарий, изменить права доступа к файлу так, чтобы только корень мог читать и редактировать, а затем просто запустить его.

Пример: 1) Создайте файл:

gedit ~/.easy.install

2) Вставьте и сохраните:

./configure && make && echo <password> | sudo -S make install && halt

3) Сделайте его исполняемым:

sudo chmod +x ~/.easy.install

4) Измените права доступа к файлу, чтобы только root мог его читать и редактировать:

sudo chmod 700 ~/.easy.install

5) Запустите:

~/.easy.install

Наслаждайтесь ;-)

1
1
1
2010-11-10 03:37:15 +0000

Настройка такого sudo опасна, если кто-то случайно увидит, что sudo не требует пароля на вашу учетную запись. Если вы не знаете, что делаете, не делайте этого. Слишком много раз это происходило в моей локальной программе A+ Training с моим экспериментальным компьютером… -_-

То, что сказал Джон Т., звучит неплохо, за исключением того, что все еще есть риск найти пароль в истории оболочки. То, что сказал CarlF, звучит лучше, но если одна из команд провалится, компьютер все равно будет работать с привилегиями суперпользователя.

0
0
0
2018-11-08 16:51:03 +0000

Проблема решена. Например, для корня пользователя:

echo -e 'password\npassword\n' | sudo passwd root
0
0
0
2014-06-29 20:57:36 +0000

Лично я делаю то же самое, что и Джон Т ответил 9 ноября ‘09 в 2:47, я также улучшил свои в соответствии с руководством своего ответа, спасибо.

Разница в том, что я, как правило, используют переменные, что-то вроде:

AutoSuDo=$" $echo pass | sudo -S";
# Change AutoSuDo to something else.
# Note that string starts with space,
# useful only if used as first command in line

Таким образом, я могу легко использовать мою переменную вместо sudo,

$AutoSuDo apt-get update;

Это довольно удобно с некоторыми более длинными скриптами. В основном я использую их для персональных компьютеров других пользователей, которые мне приходится поддерживать.

Я также рекомендую обратить внимание на:

  • ответ desgua 19 апреля '11 в 23:56
  • комментарий user224306 14 мая '13 в 17:38 для ответа John T 9 ноября '09 в 2:47.

Похожие вопросы

6
10
11
37
10