Отменить запрос sudo askpass

Я пытаюсь использовать kdialog с sudo в сценарии bash, экспортируя SUDO_ASKPASS в сценарий со строкой

kdialog --password "enter password: " 

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

Есть ли способ убедить sudo отказаться, как можно с помощью текстового интерфейса, набрав control-C?

Редактировать - в конце концов я выяснил, что происходит. Если вы нажмете "Отмена", kdialog выведет новую строку. Sudo --askpass интерпретирует это как пустой пароль и начинает обработку неправильного пароля. Скрипт askpass не должен выдавать эту новую строку, если отменить нажатие. Способ сделать это

pe=$(kdialog --password 'enter password: ') && echo "$pe"

1 ответ

Для этого после нескольких попыток я теперь использую следующий обходной путь для SUDO_ASKPASS сценарий:

      #!/bin/bash

kdialog --password 'Enter password: ' || kill -9 "${PPID}"

Если пользователь выбирает отмену, вызывающий процесс (команда sudo) завершается.

Чтобы снизить риск убийства собственного процесса из-за ошибки, если вы вызываете скрипт непосредственно из командной строки, вы можете усилить его:

      #!/bin/bash

kdialog --password 'Enter password: ' || [ ! -z ${DIE_ON_CANCEL+x} ] && kill -9 "${PPID}"

Затем, если вы хотите убить процесс при отмене, DIE_ON_CANCEL переменная должна быть определена явно следующим образом:

      SUDO_ASKPASS='<your script>' DIE_ON_CANCEL=true sudo --askpass <your command here>

Я не люблю использовать kill, но другого решения я не вижу. У кого-нибудь есть идея получше?

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