Как запустить команду 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 Если вы можете заставить популярные поисковые системы искать специальные символы вместо этого. : 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 Я забыл, что он timestamp_timeoutнастроен на 0. И да, я полностью испортил вещь расширения псевдонима, на самом деле псевдоним не должен расширяться. Спасибо.
Кос

Не было alias sudo='sudo -v && sudo'бы так хорошо?
G-Man говорит: «Восстановите Монику»

@ G-Man Нет, это работает, потому что ;Bash разбирает sudo -vсначала и отдельно; использование &&Bash сразу проанализировало бы как одну команду, так и фон.
Кос

8

Ты не можешь &Посылает команду на задний план сразу. То есть подоболочка создается в фоновом режиме, и команда выполняется там. Когда эта команда выдает приглашение, как в случае sudo, приглашение отображается в фоновом режиме, и вы его никогда не видите.

Единственный способ обойти это - вернуть команду на передний план, предоставить пароль и отправить его обратно в фоновый режим. Например:

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

Теперь введите свой пароль, нажмите, Enterа затем нажмитеCtrlZ чтобы отправить его обратно в фоновый режим и bgсказать, чтобы он продолжал работать.

Более простой подход состоит в том, чтобы никогда не использовать &и вместо этого отправлять задания в фоновый режим вручную сCtrlZbg их запуском и после его запуска.

Наконец, вы можете захотеть установить время ожидания пароля sudo примерно на 1 или 2 секунды. Это все равно обеспечит вам достаточную безопасность (если вы не пытаетесь защититься от Flash) и позволит вам запускать такие команды, как ожидалось.


Вспышка украла мой шоколадный торт так ... ; P

2
В эту эпоху уязвимостей и вредоносных программ Adobe, которые заражают микропрограммное обеспечение, опасение по поводу Flash является оправданным.
Дамиан Йеррик


Кстати, можно ли на самом деле установить время ожидания в секундах? man sudoersговорит timestamp_timeoutзначение «s должно быть указаны минуты с возможной дробной частью (которая, кстати , делает sudoошибки, если я пытаюсь указать один, не знает , почему).
Кос

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