使用 KDE 钱包验证挂载调用

使用 KDE 钱包验证挂载调用

我正在使用类似于以下命令在我的 Kubuntu 18.04 系统中挂载一些 NAS samba 共享:

sudo mount -t cifs -o "username=MyUser" //MyServer/MyFolder ~/SharedFolders/MyFolder

这很好用。但是每次都会要求输入密码。我想使用 KDE 密码钱包(或一些类似的代理)进行身份验证。

我希望在 GUI 上询问一次密码,然后它应该被永久存储并在将来的mount调用中重复使用。

类似的事情可能吗mount

如果没有,KDE 中是否有可自动化的替代方案?

答案1

无法知道mount使用哪个程序来存储/读取密码,但您可以组合使用一些 KDE 工具来自动化该过程。

对于存储/读取密码:kwalletcli
对于 GUI 密码提示:kdialog
您应该能够使用您的包管理器安装它们。

我写了一个脚本执行此操作(带有一些额外选项)。它应该执行您要求的所有操作:如果密码不存在,则显示 GUI 提示(如果可用),并将密码存储在钱包中以供日后使用。

您可以再次从命令行更新密码kwalletcli,但我发现删除它们的唯一方法是 KWalletManager GUI 应用程序。

以下是截至 2020-08-22 的脚本:

#!/bin/sh

usage() {
    echo "Usage: $0 [-u username] [-o options] share mount"
    echo
    echo "Defaults for optional parameters:"
    echo
    echo "  username:  the output of 'id -un', i.e. the current user"
    echo "  options:   defaults,uid=1000,gid=1000,iocharset=utf8"
    echo "             Pass an empty string to clear default options"
    exit 2
}

while getopts "u:o:" opt; do
    case "$opt" in
        u) USERNAME="$OPTARG" ;;
        o) OPTIONS="$OPTARG" ;;
        *) usage ;;
    esac
done
shift $((OPTIND-1))

[ "$#" -ne 2 ] && usage

# Mount settings
USERNAME="${USERNAME:-$(id -un)}"
OPTIONS="${OPTIONS-defaults,uid=1000,gid=1000,iocharset=utf8}"
SHARE="$1"
MOUNT="$2"

# Wallet settings
FOLDER="CIFS credentials"
ENTRY="$USERNAME@${SHARE#//}"

read_password() {
    PASS_PROMPT="Password for $USERNAME@${SHARE#//}: "

    if command -v kdialog >/dev/null 2>&1; then
        PASSWORD="$(kdialog --password "$PASS_PROMPT")"
    else
        # from https://stackoverflow.com/a/28393320/6702490
        trap 'stty echo' EXIT
        stty -echo
        printf "%s" "$PASS_PROMPT"
        read -r PASSWORD
        printf "\n"
        stty echo
        trap - EXIT
    fi
}

if ! PASSWORD="$(kwalletcli -f "$FOLDER" -e "$ENTRY" 2>/dev/null)"; then
    if read_password && [ -n "$PASSWORD" ]; then
        kwalletcli -f "$FOLDER" -e "$ENTRY" -p "$PASSWORD"
    else
        echo "Empty/no password entered, skipping writing password to wallet and mount."
        exit 1
    fi
fi

sudo mount -t cifs -o "${OPTIONS}${OPTIONS:+,}username=$USERNAME,password=$PASSWORD" "$SHARE" "$MOUNT"

注意:使用kwallet-query是更好的选择,因为它与 KDE/kwallet 捆绑在一起并支持非默认钱包,但我无法让它存储密码。没有显示任何错误,也没有非零退出代码,但密码不会写入钱包。

相关内容