sudo з паролем в одному командному рядку?


115

У напружені дні я б хотів бігати

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

в ніч і лягайте спати, сподіваючись, що програма автоматично буде встановлена. Але я бачу наступного дня екран, на якому Судо запитує мене про пароль. То як я можу запустити sudo з паролем в одному командному рядку, чи є якийсь інший метод для цього?


Вам потрібно haltзапустити як root.
Кіт Томпсон

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

1
Час очікування увімкнено sudo. Люди, які знають безпеку (інакше параноїк, як я), встановили її на нуль ... :-)
1313

Відповіді:


173

Так, використовуйте -Sперемикач, який читає пароль від STDIN:

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

Отже, для вашого випадку це виглядатиме так:

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

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


42
Очевидно, що не хотілося б запускати це, якщо є небезпека, щоб хтось інший побачив пароль в історії оболонки.
Бретт Даніель

шукаємо швидкі способи запускати привілейовані команди на віддаленому хості, і це працює завдяки.
nelaaro

13
Якщо ви вирішили скористатися 'echo <password> | Параметр sudo -S ', ​​щоб уникнути дії пароля в історії команд, запускайте команду символом SPACE. Звичайно, найкращий варіант - передавати пароль із захищеного файлу.
Шеннон Хаворт

Ви можете скористатися цим, якщо у вас є пароль у $ VARIABLE (який, наприклад, ви можете забезпечити
сопами

9 років по тому і досі працює як шарм :)
WinEunuuchs2Unix

10

Ви можете замінити свій командний рядок таким:

$sudo su

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

Вам буде запропоновано ввести пароль негайно, тоді решта команд буде виконуватися як суперпользователь.


8
альтернативна (і, мабуть, краща) версія цієї версії:sudo sh -c "./configure && make && make install && halt"
шарлатаний кіхот

2
Але хіба не всі згенеровані файли компіляції мають права доступу суперпользователя? Це не дозволить вам запустити ./configure && зробити пізніше звичайним користувачем.
user45909

Так, user45909, ти цілком прав. Я особисто ніколи не повторювався ./configure && make, за винятком випадків, коли завантажував оновлення основного пакету, але я, мабуть, не типовий.
CarlF

10

Декілька інших рішень мають той недолік, що вони надмірно запускаються ./configureта makeє кореневими.

Це трохи заплутано, але це має працювати:

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

Зверніть увагу на використання подвійних лапок, щоб дозволити $USERїх розширення (некореневою) оболонкою.

Я також можу додати команду 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", означає використовувати 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, оскільки за замовчуванням 5 хвилин. Так, whoami не повинен зайняти 5 хвилин, але я думаю, що він також може запустити його перед кожною командою для послідовності. Ви також можете поставити "export HISTIGNORE = ' sudo -S'"у вашому файлі ~ / .bashrc, а потім завантажте його". ~ / .bashrc "або вихід із системи, потім увійдіть. Однак, я думаю, використовую це для сценаріїв, тому буду тримати його у верхній частині всіх моїх сценаріїв для найкращих практик безпеки. Налаштування" echo "" | sudo -S -v "для змінної замість цього також може бути хорошою ідеєю, тоді просто запустіть змінну перед кожною командою, яка потребує кореневих привілеїв, дивіться коментар Джанара. Коментар Джона Т" також повинен містити параметр "-k" , якщо ви запускаєте "sudo -S" без "-k", а кеш автентифікації sudo вже має ваші облікові дані (і досі діє, кеш аутентифікації sudo за замовчуванням становить 5 хвилин), тоді bash запустить ваш пароль як команду, яка є поганий.


1
Так само, як невелика примітка про те, щоб зробити речі недоступними в історії, запустіть свою команду одним простором на передній панелі. Чомусь це змушує історію ігнорувати її.
Метт Флетчер

4

Зауважте, я виявив, що метод не працює на більш старій версії sudo, зокрема "Судо версії 1.6.7p5":

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

Де цей метод працює на старих і нових версіях sudo:

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

Це не відповідь на початкове запитання. Щоб критикувати або вимагати роз'яснення у автора, залиште коментар під їх публікацією - ви завжди можете коментувати свої власні публікації, і як тільки у вас буде достатня репутація, ви зможете коментувати будь-яку публікацію .
DavidPostill

@Darren DeHaven: Не могли б ви пояснити, як це стало відповіддю на поставлене тут питання?
Ченгат Ренджу Чандран


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 <password> все одно відображатиметься у списку процесів, і якщо комусь пощастить з ps aux у потрібний момент, він може побачити пароль у чистому тексті. Краще збережіть пароль у файлі та використовуйте <для переадресації з файлу в sudo.
bobpaul

1

Налаштування подібного судо небезпечно, якщо хтось випадково побачив факт, що для вашого судо не потрібен пароль у вашому обліковому записі. Якщо ви не знаєте, що робите, не робіть цього. У мене це траплялося в моїй місцевій програмі навчання + з моїм експериментальним комп'ютером занадто багато разів ...

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


0

Особисто я роблю так само, як відповів Джон Т 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 для відповіді Джона Т 9 листопада '09 о 2:47

0

Проблема вирішена. Наприклад, до кореня користувача:

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

Що робить -e прапор, @jerson Martinez?
користувач674669

1
Прапор -e для відлуння дозволяє йому інтерпретувати певні послідовності як такі, що мають особливі значення.
Jerson Martínez
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.