it-swarm-ru.tech

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

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

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

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

103
Jichao

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

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

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

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

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

152
John T

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

$Sudo su

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

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

10
CarlF

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

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

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

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

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

10
Keith Thompson

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

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

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

7
user393365

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

Sudo -S <<< "password" command
2
Jahid

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

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

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

$ echo "<your_password>" | Sudo -S -v
$ Sudo whoami
2
Darren DeHaven

Если вы хотите быть более внимательным, вы можете создать скрипт, изменить права доступа к файлу, чтобы только 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  

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

2
desgua

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

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

1
TimE.

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

echo -e 'password\npassword\n' | Sudo passwd root
0
Jerson Martínez

Лично я делаю то же самое, что ответил Джон Т 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
Janar