Как запустить команду sudo, требующую ввода пароля в фоновом режиме?

Я недавно отключил sudo Возможность кэширования аутентификации, так что теперь он каждый раз запрашивает у меня пароль.

И хотя это хорошо для безопасности, оно вызвало одну небольшую проблему, для которой я не смог найти решение, я не могу запускать команды, которые выглядят следующим образом:

sudo <command> &

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

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

Я использую Ubuntu GNOME 15.10 с GNOME 3.18, и, в частности, программа, которую я хочу запустить таким образом, etherape если это что-то меняет, но мне бы очень хотелось, чтобы решение работало для всех программ и команд.

3 ответа

Решение

Вместо бега 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 &

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

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

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

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

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

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

Другие вопросы по тегам