Правильный способ позволить пользователю вводить пароль для сценария bash, используя только графический интерфейс (с закрытым терминалом)

Я создал сценарий bash, который использует kdialog исключительно для взаимодействия с пользователем. Он запускается из файла «.desktop», поэтому пользователь никогда не видит терминал. Он выглядит на 100% как графическое приложение (хотя это просто скрипт bash). Он работает только в KDE (Kubuntu 12.04).

Моя единственная проблема - Он выглядит на 100% как графическое приложение и удобно. Я не могу найти удовлетворительное решение.

Сценарий был разработан как обычный пользователь и запрашивал пароль, когда сначала требуется команда sudo. Таким образом, большинство команд, не требующих прав sudo, запускаются как обычный пользователь. То, что происходит (когда сценарий запускается с терминала), заключается в том, что пользователю предлагается один раз указать пароль, а по умолчанию sudo timeout позволяет завершить скрипт, включая любые дополнительные команды sudo, без повторного запроса пользователя. Вот как я хочу, чтобы он работал, когда работали за GUI тоже.

Основная проблема заключается в том, что использование kdesudo для запуска моего скрипта, который является стандартным GUI-способом, означает, что весь скрипт выполнен пользователем root. Таким образом, владельцы файлов назначаются пользователю root, я не могу полагаться на ~/ на путях, и многие другие вещи менее идеальны.

Я ценю любые идеи, позволяющие пользователю вводить пароль sudo только один раз с помощью графического интерфейса пользователя, а не запускать его. весь скрипт как root. Спасибо.

1
задан 13 April 2017 в 15:37

2 ответа

Это основано на превосходном ответе Эрика Карвалью. Я отправляю его, чтобы подробно рассказать о проблеме, с которой я столкнулся. В частности, при использовании этого теряется обычный тайм-аут sudo (например, 15 минут). Мой скрипт, который имеет более 50 команд sudo, теперь запрашивает пароль пользователя 50 раз!

Вот полный рабочий пример всех частей решения. Он состоит из сценария bash, сценария «myaskpass», как предложил Эрик, и файла «.desktop». Все это должно быть 100% GUI (без взаимодействия с терминалом вообще), поэтому файл .desktop необходим (afaik).

$ cat myaskpass.sh 
#!/bin/bash
kdialog --password "Please enter your password: "
exit 0


$ cat askpasstest1.desktop 
#!/usr/bin/env xdg-open
[Desktop Entry]
Comment=SUDO_ASKPASS tester1
Exec=bash /home/user/test/askpasstest1.sh
GenericName=SUDO_ASKPASS tester1
Name=SUDO_ASKPASS tester1
NoDisplay=false
Path[$e]=
StartupNotify=true
Terminal=false
TerminalOptions=
Type=Application
Categories=Application;Utility;
X-KDE-SubstituteUID=false
X-KDE-Username=

И сам тестовый скрипт. При использовании этого решения дважды будет запрашиваться пароль. (Обычно он запрашивает только один раз из-за таймаута sudo по умолчанию.)

#!/bin/bash

sudo -k
SUDO_ASKPASS="/home/user/test/myaskpass.sh" sudo -A touch filemadeas_askpass1
touch filemadeas_regularuser1
SUDO_ASKPASS="/home/user/test/myaskpass.sh" sudo -A touch filemadeas_askpass2
touch filemadeas_regularuser2
ls -la filemadeas* > /home/user/test/fma.log
kdialog --title "Files Created" --textbox /home/user/test/fma.log 640 480
sudo rm filemadeas_*
rm fma.log

exit 0
0
ответ дан 24 May 2018 в 20:30
  • 1
    Запуск этого сценария из командной строки, пароль задается только один раз. Запуск из графического интерфейса (нажатие .desktop или .sh в файловом менеджере) каждый sudo -A берет пароль. Я постараюсь понять это. – Eric Carvalho 30 June 2013 в 04:52
  • 2
    Я только что обновил свой ответ. – Eric Carvalho 30 June 2013 в 07:19
  • 3
    Эрик ... Вы нашли решение проблемы? – anthony 17 May 2017 в 05:04

Следующий сценарий работает через командную строку, файл рабочего стола или дважды щелкнет, запрашивает пароль только один раз, а шаблон команды sudo -Sp '' <your command here> <<<${sudo_password} можно использовать несколько раз в любом месте файла:

    # get sudo password
    sudo_password=$( gksudo --print-pass --message="Provide permission to make system changes: Type your password or press Cancel." -- : 2>/dev/null )
    # check for null entry or cancellation
    if [[ ${?} != 0 || -z ${sudo_password} ]]
    then
        exit 4
    fi
    if ! sudo -kSp '' [ 1 ] <<<${sudo_password} 2>/dev/null
    then
        exit 4
    fi
    # command
    sudo -Sp '' gedit "/etc/hosts" <<<${sudo_password}
0
ответ дан 24 May 2018 в 20:30

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

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