Cách thích hợp để cho phép người dùng nhập mật khẩu cho tập lệnh bash chỉ bằng GUI (với thiết bị đầu cuối bị ẩn)


8

Tôi đã tạo một tập lệnh bash sử dụng kdialog dành riêng cho việc tương tác với người dùng. Nó được khởi chạy từ tệp ".desktop" để người dùng không bao giờ nhìn thấy thiết bị đầu cuối. Nó trông giống như một ứng dụng GUI 100% (mặc dù nó chỉ là một tập lệnh bash). Nó chỉ chạy trong KDE (Kubfox 12.04).

Vấn đề duy nhất của tôi là xử lý mật khẩu đầu vào an toàn và thuận tiện. Tôi không thể tìm thấy một giải pháp thỏa đáng.

Tập lệnh được thiết kế để chạy như một người dùng bình thường và để nhắc mật khẩu khi cần một lệnh sudo. Theo cách này, hầu hết các lệnh, những lệnh không yêu cầu quyền sudo, được chạy như người dùng bình thường. Điều gì xảy ra (khi tập lệnh được chạy từ thiết bị đầu cuối) là người dùng được nhắc nhập mật khẩu của họ một lần và thời gian chờ sudo mặc định cho phép tập lệnh kết thúc, bao gồm mọi lệnh sudo bổ sung mà không cần nhắc lại người dùng. Đây là cách tôi muốn nó hoạt động khi chạy đằng sau GUI.

Vấn đề chính là việc sử dụng kdesudođể khởi chạy tập lệnh của tôi, đó là cách GUI chuẩn, có nghĩa là toàn bộ tập lệnh được thực thi bởi người dùng root. Vì vậy, quyền sở hữu tệp được gán cho người dùng root, tôi không thể dựa vào ~/đường dẫn và nhiều thứ khác không lý tưởng. Chạy toàn bộ tập lệnh với tư cách là người dùng root chỉ là một giải pháp rất không thỏa đáng và tôi nghĩ đó là một thực tế tồi.

Tôi đánh giá cao bất kỳ ý tưởng nào cho phép người dùng nhập mật khẩu sudo chỉ một lần qua GUI trong khi không chạy toàn bộ tập lệnh dưới dạng root. Cảm ơn.

Câu trả lời:


14

Các -Atùy chọn sudo cho phép bạn chỉ định một chương trình trợ giúp (trong biến SUDO_ASKPASS) mà sẽ yêu cầu mật khẩu.

Tạo một tập lệnh để hỏi mật khẩu (myaskpass.sh):

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

Sau đó chèn dòng này vào đầu tập lệnh của bạn:

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

và thay thế tất cả các lần xuất hiện của sudo <command>:

sudo -A <command>

Bạn có thể sử dụng bất cứ chương trình hỏi mật khẩu nào bạn muốn thay vì zenity. Tôi đã phải gói nó trong một tập lệnh vì SUDO_ASKPASS phải trỏ đến một tệp, vì vậy nó sẽ không hoạt động với --passwordtùy chọn theo yêu cầu zenity.

Ở trên hoạt động như một bùa mê nếu nó chạy từ dòng lệnh hoặc nếu bạn chọn Chạy trong thiết bị đầu cuối sau khi nhấp đúp vào tệp tập lệnh trong trình quản lý tệp, nhưng nếu bạn chọn Chạy hoặc cố gắng khởi chạy nó từ tệp .desktop, mọi người sudosẽ yêu cầu cho mật khẩu một lần nữa.


Nếu bạn hoàn toàn không muốn có một cửa sổ đầu cuối, bạn có thể lưu mật khẩu vào một biến và chuyển nó sang sudo -S. Có thể có một số lo ngại về bảo mật, nhưng tôi nghĩ nó khá an toàn (đọc các bình luận về câu trả lời này ).

Chèn dòng này vào đầu tập lệnh của bạn:

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

và thay thế tất cả các lần xuất hiện của sudo <command>:

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

Cảm ơn bạn. Thật là thú vị. Tuy nhiên, khi sử dụng, thời gian chờ sudo thông thường (ví dụ: 15 phút) sẽ bị mất. Tập lệnh của tôi, có hơn 50 lệnh sudo hiện nhắc nhở mật khẩu của người dùng hơn 50 lần! Tôi loay hoay một chút và tôi không thấy một giải pháp. Bạn có biết một?
MountainX

Cảm ơn các cập nhật. Lựa chọn thay thế mà bạn đề xuất là thứ tôi đã loại trừ do lo ngại về bảo mật, nhưng từ việc đọc các bình luận tại liên kết bạn cung cấp, tôi nghĩ rằng nó có thể đủ an toàn. Và nó là một cách dễ dàng để giải quyết vấn đề. Cảm ơn bạn.
MountainX

Thử nghiệm trên hệ thống của tôi nó phải là sudo -s(chữ thường s) và không sudo -S(chữ hoa s).
WinEunuuchs2Unix

0

Điều này dựa trên câu trả lời tuyệt vời của Eric Carvalho. Tôi đang đăng nó để giải thích về vấn đề tôi gặp phải. Cụ thể, khi sử dụng, thời gian chờ sudo thông thường (ví dụ: 15 phút) bị mất. Tập lệnh của tôi, có hơn 50 lệnh sudo hiện nhắc nhở mật khẩu của người dùng hơn 50 lần!

Dưới đây là ví dụ làm việc đầy đủ của tất cả các phần của giải pháp. Nó bao gồm một tập lệnh bash, tập lệnh "myaskpass" như Eric đề xuất và tập tin ".desktop". Toàn bộ mọi thứ phải là GUI 100% (hoàn toàn không có tương tác đầu cuối), vì vậy tệp .desktop là điều cần thiết (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=

Và một kịch bản thử nghiệm chính nó. Điều này sẽ yêu cầu mật khẩu của bạn hai lần khi sử dụng giải pháp này. (Thông thường, nó sẽ chỉ yêu cầu một lần do thời gian chờ sudo mặc định.)

#!/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

Chạy tập lệnh này từ dòng lệnh, mật khẩu chỉ được yêu cầu một lần. Chạy từ GUI (nhấp vào .desktop hoặc .sh trong trình quản lý tệp) mỗi lần sudo -Alấy lại mật khẩu. Tôi sẽ cố gắng để tìm ra điều này.
Eric Carvalho

Tôi chỉ cập nhật câu trả lời của tôi.
Eric Carvalho

Eric ... bạn đã tìm ra một giải pháp cho vấn đề này chưa?
anthony

0

Tập lệnh sau hoạt động thông qua dòng lệnh, tệp trên màn hình hoặc nhấp đúp, chỉ yêu cầu mật khẩu một lần và mẫu lệnh sudo -Sp '' <your command here> <<<${sudo_password}có thể được sử dụng nhiều lần ở bất kỳ đâu trong tệp:

    # 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}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.