поведение сессии sudo в графической среде

993
isamert

Я написал эти два сценария, и они в моем $PATH:

гсудо :

#! /bin/bash sudo -n true &> /dev/null if [ $? -eq 0 ] then sudo "$@" else upass=$(zenity --password --title "Enter your password" 2> /dev/null) [[ ! -z "$upass" ]] && echo $upass | sudo -S -p "" "$@" fi 

Этот скрипт по сути делает то же самое, что и gksuсам. Он смотрит, sudoнужен ли ему пароль или нет, и в соответствии с этим он будет спрашивать пароль или нет.

вводного что - то :

gsudo command1 gsudo command2 

Если я запускаю второй скрипт из окна терминала, я получаю ожидаемое поведение. Он просто запрашивает мой пароль только один раз. Но если я вызываю его из графического окружения, например, из-за выполнения задач (я пробовал i3wm dmenu и rofi launcher), он запрашивает мой пароль два раза. Так почему же это происходит, как я могу это исправить? Я считаю, что sudo -n trueдолжен возвращать одну и ту же вещь оба раза, потому что она вызывается в одном и том же скрипте, поэтому sudoсессия должна сохраняться. Я не пытаюсь сохранить sudoсессию между разными вызовами скрипта, достаточно, чтобы она сохранялась только в одном вызове.

3
Рассматривали ли вы использовать $ SUDO_ASKPASS для этого? grawity 6 лет назад 0
@ grawity Да, но все же происходит то же самое. Я думал, что это, возможно, более близко к решению. isamert 6 лет назад 0
@KamilMaciorowski О, спасибо. Я упустил это из виду. Пост обновлен. isamert 6 лет назад 0

1 ответ на вопрос

1
Kamil Maciorowski

Я сделал несколько тестов. Мне (пока) не совсем понятно, как sudoкешируется способность человека повышаться. Возможно, это как-то связано с выделением псевдотерминала или нет.

На вашем месте я бы реализовал то, что вы можете прочитать в этом вопросе: Как мне запустить sudoкоманду внутри скрипта? Особенно из одного из ответов :

Редко хорошая идея иметь sudoвнутри скрипты. Вместо этого удалите sudoиз скрипта и запустите сам скрипт сsudo

за исключением вашего случая, о котором gsudoмы говорим. Дополнительно я бы использовал $SUDO_USERпри необходимости (из этого другого ответа ).

Пример run-something:

#!/path/to/my/gsudo /bin/bash  # The shebang ensures the below code is for sure run with gsudo bash; # gsudo runs sudo, which sets $SUDO_USER (see `man sudo').  command1 # This is run with gsudo because the entire script is.  # Get back to the invoking (possibly regular) user for just one command sudo -u "$SUDO_USER" command_whatever  # Again as root command2 command3  # Get back to the invoking user for many commands sudo -u "$SUDO_USER" bash << EOF  foo bar baz  EOF 

Мой gsudoбыл бы очень прост:

#!/bin/bash SUDO_ASKPASS='/path/to/my/gsudo_helper' sudo "$@" 

И gsudo_helper:

#!/bin/bash zenity --password --title "Enter your password" 2> /dev/null 

Заметки:

  • Я сознательно не использую sudo -Aв gsudoкоде. Этот способ gsudoиспользует терминал, если он доступен, в zenityпротивном случае.
  • Синтаксис sudo "$@"позволяет gsudoпередавать параметры командной строки (например, упомянутые выше -A) в sudo. Это довольно хорошая идея, но если вы не хотите этого, то подумайте sudo -- "$@".
Этот шебанг в значительной степени решает мою проблему. Я не мог придумать что-то подобное. Поскольку я пытался вызвать `run-some` из графического интерфейса, мне потребовался еще один уровень косвенности, например, другой скрипт, вызывающий` gsudo run -thing`, для вызова самого скрипта с помощью `gsudo`. isamert 6 лет назад 0

Похожие вопросы