3

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

1 ответ1

1

Я сделал несколько тестов. Мне (пока) не совсем ясно, как 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 -- "$@" .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .