Як запустити команду sudo, яка потребує введення пароля у фоновому режимі?


29

Нещодавно я відключив sudoздатність кешування автентифікації , і тепер вона щоразу вимагає ввести пароль.

І хоча це добре для безпеки, це спричинило одну незначну проблему, яку я не зміг знайти для вирішення, я не в змозі запускати команди, які йдуть за рядками:

sudo <command> &

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

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

Я запускаю Ubuntu GNOME 15.10 з GNOME 3.18, і конкретно програма, яку я хочу запустити таким чином, це, etherapeякщо це має значення, але я б дуже хотів, щоб рішення працювало на всі програми та команди.


3
@kossince &насправді не можна шукати, я змінюю це на … sudo command in the background.
muru

@muru Якщо ви можете змусити популярні пошукові системи шукати натомість спеціальних символів. : P
kos

Відповіді:


56

Замість запуску sudoу фоновому режимі скажіть sudoвиконувати команду на задньому плані. Від man sudo:

-b, --background
     Run the given command in the background.  Note that it is not
     possible to use shell job control to manipulate background
     processes started by sudo.  Most interactive commands will
     fail to work properly in background mode.

Наприклад:

sudo -b sleep 10

Іншим способом було б просто використовувати оболонку для запуску команди:

sudo sh -c 'sleep 10 &'

Іншим варіантом було б вказати графічну програму для отримання пароля та все-таки відправити sudoна задній план:

-A, --askpass
     Normally, if sudo requires a password, it will read it from
     the user's terminal.  If the -A (askpass) option is
     specified, a (possibly graphical) helper program is executed
     to read the user's password and output the password to the
     standard output.  If the SUDO_ASKPASS environment variable is
     set, it specifies the path to the helper program.  Otherwise,
     if sudo.conf(5) contains a line specifying the askpass
     program, that value will be used.  For example:

         # Path to askpass helper program
         Path askpass /usr/X11R6/bin/ssh-askpass

     If no askpass program is available, sudo will exit with an
     error.

Програми Askpass зазвичай використовуються для SSH. Одне таке надається ssh-askpass-gnomeпакетом, який встановлений за замовчуванням, принаймні на Ubuntu 15.10.

SUDO_ASKPASS=/usr/bin/ssh-askpass sudo -A sleep 10 &

11

Якщо ви готові встановити timestamp_timeoutпринаймні щось на кшталт 0.02(1,2 секунди, я б сказав так само безпечно, як і в 0) /etc/sudoers(потрібне у вашому випадку, але з налаштуваннями за замовчуванням або з timestamp_timeoutналаштованим на що-небудь, крім 0одного, ви можете просто зробити наступне) , ви можете встановити псевдонім на зразок цього ~/.bashrc, який не вимагатиме від вас запам’ятати щось робити перед запуском команди, і це дозволить вам зберегти контроль над процесом.

alias sudo='sudo -v; [ $? ] && sudo'

Хитрість тут - крапка з комою, яка зробить Bash sudo -vпершим та окремим розбором, автентифікуючи користувача та обмежить потенційну фонову частину [ $? ] && sudoкомандою, яка перевірить, чи sudo -vбув він успішним, та запустить sudoще раз (потенційно фоном), якщо це було.

$ alias sudo='sudo -v; [ $? ] && sudo'
$ sudo -H gedit &
[sudo] password for user:
[1] 19966
$ jobs
[1]+  Running                 [ $? ] && sudo -H gedit &

Чи sudo -vрозширює кешування даних, навіть якщо кешування вимкнено? І, IIRC <для розширення псевдонімів, пробіл повинен бути в кінці команди, а не на початку.
муру

@muru RIght Я забув, що він timestamp_timeoutвстановив 0. І так, я повністю заплутався в рішенні розширення псевдонімів, насправді псевдонім не повинен розширюватися. Спасибі.
kos

Не alias sudo='sudo -v && sudo'було б так добре?
G-Man каже: "Відновіть Моніку"

@ G-Man Ні, це працює, тому що ;робить Bash sudo -vпершим і окремо розбирає; використання &&Bash би розібрало як одну команду, так і тло як негайно.
kos

8

Ви не можете. Команда &надсилає команду на задній план негайно. Тобто, нижня частина створюється на задньому плані і команда виконується там. Коли ця команда видає підказку, як це відбувається sudo, підказка відображається на задньому плані, і ви її ніколи не бачите.

Єдиний спосіб цього - повернути команду на перший план, надати пароль і відправити його на другий план. Наприклад:

$ sudo command &
$ fg
sudo command
[sudo] password for terdon: 

Тепер введіть свій пароль, натисніть, Enterа потім натисніть, CtrlZщоб повернути його на другий план і bgсказати, щоб він продовжував працювати.

Більш простим підходом було б ніколи не використовувати &, а натомість надсилати завдання на задній план вручну з CtrlZта bgпісля їх запуску.

Нарешті, ви можете розглянути можливість встановлення тайм-ауту пароля sudo на щось на зразок 1 або 2 секунди. Це все одно забезпечить вам достатню безпеку (якщо ви не намагаєтесь захистити від Flash) і дозволить виконувати такі команди, як очікувалося.


Спалах вкрав мій шоколадний торт так ... ; P

2
У цю епоху вразливості та зловмисне програмне забезпечення Adobe, яке заражає мікропрограмне забезпечення, будучи обережними щодо Flash, гарантується.
Damian Yerrick


Що стосується бічної примітки, чи реально встановити час очікування на секунди? man sudoersкаже timestamp_timeoutзначення «s має бути вказані хвилини з можливою дробової частиною (яка, до речі , робить sudoпомилки, якщо я намагаюся вказати один, не знає , чому).
kos

2
@kos звучить так, що так. 2.5тут чудово працює (Arch, sudoверсія 1.8.15).
тердон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.