GUI 만 사용하여 bash 스크립트의 비밀번호를 입력 할 수있는 올바른 방법 (터미널이 숨겨져 있음)


8

kdialog를 독점적으로 사용하여 사용자와 상호 작용하는 bash 스크립트를 만들었습니다. ".desktop"파일에서 시작되므로 사용자는 터미널을 볼 수 없습니다. 그것은 단지 bash 스크립트 일지라도 GUI 응용 프로그램처럼 100 % 보입니다 . KDE에서만 실행됩니다 (Kubuntu 12.04).

내 유일한 문제는 암호 입력을 안전 하고 편리 하게 처리하는 것 입니다. 만족스러운 해결책을 찾을 수 없습니다.

이 스크립트는 일반 사용자로 실행하고 sudo 명령이 처음 필요할 때 비밀번호를 묻 도록 설계되었습니다 . 이런 식으로 sudo 권한이 필요없는 대부분의 명령은 일반 사용자로 실행됩니다. 스크립트에서 터미널을 실행할 때 발생하는 상황은 사용자에게 암호를 한 번 묻는 메시지가 표시되고 기본 sudo 시간 초과는 사용자에게 다시 묻지 않고 추가 sudo 명령을 포함하여 스크립트가 완료되도록합니다. 이것이 GUI 뒤에서도 실행될 때 작동하는 방식입니다.

주요 문제는 kdesudo표준 GUI 방식 인 내 스크립트를 시작 하는 데 사용 하면 전체 스크립트가 루트 사용자에 의해 실행된다는 것입니다. 따라서 파일 소유권은 루트 사용자에게 할당 ~/되며 경로에 의존 할 수 없으며 다른 많은 것들이 이상적이지 않습니다. 루트 사용자로 전체 스크립트를 실행하는 것은 매우 불만족스러운 솔루션이며 나쁜 습관이라고 생각합니다.

전체 스크립트를 루트로 실행하지 않고 GUI를 통해 사용자가 sudo 비밀번호를 한 번만 입력하도록하는 아이디어에 감사드립니다. 감사.

답변:


14

-Asudo는 옵션을 사용하면 암호를 요청합니다합니다 (SUDO_ASKPASS 변수에) 도우미 프로그램을 지정할 수 있습니다.

비밀번호 (myaskpass.sh)를 요청하는 스크립트를 작성하십시오.

#!/bin/bash
zenity --password --title=Authentication

그런 다음 스크립트 시작 부분에 다음 줄을 삽입하십시오.

export SUDO_ASKPASS="/path/to/myaskpass.sh"

모든 발생을 다음 sudo <command>으로 대체하십시오 .

sudo -A <command>

대신 암호 요청 프로그램을 사용할 수 있습니다 zenity. SUDO_ASKPASS가 파일을 가리켜 야하므로 스크립트에 캡슐화해야했기 때문에에 --password필요한 옵션이 작동하지 않습니다 zenity.

위의 내용은 명령 줄에서 실행되거나 파일 관리자에서 스크립트 파일을 두 번 클릭 한 후 터미널에서 실행 을 선택하면 매력처럼 작동 하지만 실행 을 선택 하거나 .desktop 파일에서 실행 하려고하면 모든 메시지 sudo가 표시됩니다. 비밀번호를 다시 입력하십시오.


터미널 창을 원하지 않으면 암호를 변수에 저장하고로 파이프하십시오 sudo -S. 어쩌면 보안 문제가있을 수도 있지만 꽤 안전하다고 생각합니다 ( 이 답변 에 대한 의견 읽기 ).

스크립트 시작 부분에 다음 줄을 삽입하십시오.

PASSWD="$(zenity --password --title=Authentication)\n"

모든 발생을 다음 sudo <command>으로 대체하십시오 .

echo -e $PASSWD | sudo -S <command>

감사합니다. 매우 흥미 롭습니다. 그러나이를 사용하면 일반적인 sudo 시간 초과 (예 : 15 분)가 손실됩니다. 50 개가 넘는 sudo 명령이있는 내 스크립트는 이제 사용자의 암호를 50 번 이상 입력하라는 메시지를 표시합니다! 나는 조금 주위를 봤는데 해결책을 찾지 못했습니다. 당신은 하나를 알고 있습니까?
MountainX

업데이트 해 주셔서 감사합니다. 당신이 제안하는 대안은 보안 문제로 인해 배제 한 것이지만 제공 한 링크의 주석을 읽으면 충분히 안전하다고 생각합니다. 이 문제를 해결하는 쉬운 방법입니다. 감사합니다.
MountainX

내 시스템에서 테스트하는 것은 sudo -s(소문자 s)가 아닌 sudo -S(대문자 ) 이어야 s합니다.
WinEunuuchs2Unix

0

이것은 Eric Carvalho의 탁월한 답변을 기반으로합니다. 내가 겪은 문제에 대해 자세히 설명하기 위해 게시하고 있습니다. 특히, 이것을 사용하면 일반적인 sudo 시간 초과 (예 : 15 분)가 손실됩니다. 50 개가 넘는 sudo 명령이있는 내 스크립트는 이제 사용자의 암호를 50 번 이상 입력하라는 메시지를 표시합니다!

다음은 솔루션의 모든 부분에 대한 전체 작업 예입니다. bash 스크립트, Eric이 제안한 "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

명령 행에서이 스크립트를 실행하면 비밀번호는 한 번만 요청됩니다. GUI에서 실행 (파일 관리자에서 .desktop 또는 .sh 클릭) 할 때마다 sudo -A비밀번호가 다시 묻습니다. 나는 이것을 알아 내려고 노력할 것이다.
Eric Carvalho

방금 답변을 업데이트했습니다.
Eric Carvalho 2016 년

에릭 ... 문제에 대한 해결책을 찾았습니까?
앤서니

0

다음 스크립트는 명령 행, 데스크탑 파일 또는 두 번 클릭을 통해 작동하고 비밀번호를 한 번만 요청 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}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.