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


115

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

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

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


Вам нужно haltзапускать с правами root.
Кит Томпсон,

1
Не sudoимеет 15-минутного перерыва? Не могли бы вы запустить, скажем, sudo lsили что-то подобное, ввести свой пароль, а затем выполнить приведенную выше команду, сохраняя sudoправа доступа? (Я не могу проверить это в настоящее время, иначе я бы опубликовал это как ответ.)
Мэтт

1
Время ожидания sudoнастраивается. Люди, которые заботятся о безопасности (параноик, как и я), установили его на ноль ... :-)
dda

Ответы:


173

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

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

Так что для вашего случая это будет выглядеть так:

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

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


42
Очевидно, что не стоит запускать это, если есть опасность, что кто-то еще увидит пароль в истории оболочки.
Бретт Дэниел

ищу быстрые способы запуска привилегированных команд на удаленном хосте, и это работает, спасибо.
nelaaro

13
Если вы решили использовать 'echo <пароль> | Параметр sudo -S ', ​​чтобы избежать введения пароля в историю команд, запускайте команду с символом пробела. Конечно, лучший вариант - передать пароль из защищенного файла.
Шеннон Хаворт

Возможно, вы захотите использовать его, если у вас есть пароль в переменной $ VARIABLE (например, вы можете использовать
sops

9 лет спустя и до сих пор работает как шарм :)
WinEunuuchs2Unix

10

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

$sudo su

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

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


8
альтернативная (и, вероятно, предпочтительная) версия этого:sudo sh -c "./configure && make && make install && halt"
Quackote Quixote

2
Но тогда не будут ли все сгенерированные файлы компиляции иметь права суперпользователя? Это помешает вам позже запустить ./configure && make как обычный пользователь.
user45909

Да, user45909, вы совершенно правы. Лично я никогда не перезапускал ./configure && make, за исключением того, что все равно загрузил обновление основного пакета, но я, вероятно, не типичен.
CarlF

10

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

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

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

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

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


9

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

User_Alias USERS = your_user
Cmnd_Alias CMDS = /usr/bin/make
USERS ALL = (ALL) NOPASSWD: CMDS

9

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

$ export HISTIGNORE='*sudo -S*'

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

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

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

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

«-S» означает использовать стандартный пароль для пароля,

«-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 вместо этого запустит ваш пароль как команду, которая Плохо.


1
Как небольшая заметка о том, как сделать вещи недоступными в истории, запустите команду с одним пробелом в начале. По какой-то причине это заставляет историю игнорировать это.
Мэтт Флетчер

4

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

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

Где, как этот метод работает на старых и новых версиях sudo:

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

Это не ответ на оригинальный вопрос. Чтобы критиковать или запрашивать разъяснения у автора, оставьте комментарий под его постом - вы всегда можете комментировать свои собственные посты, и, когда у вас будет достаточно репутации, вы сможете комментировать любые посты .
DavidPostill

@Darren DeHaven: Не могли бы вы объяснить, как это стать ответом на вопрос, заданный здесь?
Рэндзю Чандран Чингат

4

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

sudo -S <<< "password" command

только этот работает для меня в Mac OS.
Mehdico

2

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

Пример:
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  

Наслаждаться ;-)


echo <пароль> по-прежнему будет отображаться в списке процессов, и если кому-то повезет с ps aux в нужный момент, он сможет увидеть пароль в открытом тексте. Лучше сохранить пароль в файл и использовать <для перенаправления из файла в sudo.
Бобпаул

1

Подобная настройка sudo опасна, если кто-то случайно увидел, что sudo не требует пароля в вашей учетной записи. Если вы не знаете, что делаете, не делайте этого. У меня это случалось в моей местной программе обучения А + с моим экспериментальным компьютером слишком много раз ... -_-

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


0

Лично я делаю то же самое, что ответил Джон Т 9 ноября 2009 года в 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 для Джона Т, ответ 9 ноября '09 в 2:47

0

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

echo -e 'password\npassword\n' | sudo passwd root

Что делает флаг -e, @jerson Martinez?
user674669

1
Флаг -e для echo позволяет интерпретировать определенные последовательности как имеющие особые значения.
Джерсон Мартинес
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.