我正在使用类似于以下命令在我的 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 捆绑在一起并支持非默认钱包,但我无法让它存储密码。没有显示任何错误,也没有非零退出代码,但密码不会写入钱包。