如何在systemd/init.d启动时用ssh-askpass挂载ecryptfs加密目录
解决ecryptfs开机挂载时密码提示不弹出的问题
首先得搞明白为啥ssh-askpass在systemd服务里不干活:开机阶段systemd的服务默认跑在无交互环境下,既没连接到你的图形会话也没绑定终端,而ssh-askpass必须依赖X11图形环境才能弹出密码框。原来的服务绑定multi-user.target(字符界面阶段),这时候图形界面还没启动,就算到了图形阶段,服务也没权限访问你的X会话环境变量,自然弹不出框。
下面给你两种靠谱的解决方案:
方案一:在图形界面启动后弹出密码框(适合桌面环境)
1. 修改systemd服务文件
把你的directory.encryption.service改成这样:
[Unit] Description=Directory Encryption Service After=graphical.target Requires=graphical.target [Service] Type=oneshot ExecStart=/root/.ecryptfs/directory-encryption-script StandardInput=tty TTYPath=/dev/tty1 Environment=DISPLAY=:0 User=root RemainAfterExit=yes [Install] WantedBy=graphical.target Alias=directory.encryption.service
After=graphical.target和Requires=graphical.target:确保服务等图形界面完全启动后再运行Type=oneshot:挂载是一次性操作,完成后服务就可以结束StandardInput=tty+TTYPath=/dev/tty1:给服务分配一个终端,保证交互能正常进行Environment=DISPLAY=:0:告诉脚本图形界面的显示端口,让密码框能正确弹出
2. 替换脚本里的ssh-askpass为更可靠的图形工具
把脚本里的PASSWORD=$(ssh-askpass)换成:
PASSWORD=$(zenity --password --title="Enter Encryption Password for /opt/directory")
如果你用的是KDE桌面,也可以换成kdialog --password "Enter Encryption Password for /opt/directory"。
另外脚本里的sudo -s -u root完全没必要,因为服务已经以root身份运行了,直接简化成这一行就行:
printf "%s" "$PASSWORD" | ecryptfs-insert-wrapped-passphrase-into-keyring "$ECRYPTFS_WRAPPED_PASSWORD" && mount -i -t ecryptfs /opt/directory /opt/directory -o ecryptfs_sig=$SIG,ecryptfs_fnek_sig=$SIG,ecryptfs_cipher=aes,ecryptfs_key_bytes=32,ecryptfs_unlink_sigs
3. 重新加载systemd并启用服务
执行以下命令生效:
systemctl daemon-reload systemctl enable directory.encryption.service
方案二:在开机启动过程中用plymouth提示密码(适合无图形/服务器环境)
如果你的系统是服务器,或者不想依赖图形界面,可以用plymouth在开机启动画面里直接提示密码:
1. 修改脚本,用plymouth读取密码
把脚本里的PASSWORD=$(ssh-askpass)替换成:
PASSWORD=$(plymouth ask-for-password --prompt "Enter Encryption Password for /opt/directory:")
2. 修改systemd服务文件
调整服务绑定到plymouth启动后的阶段:
[Unit] Description=Directory Encryption Service After=plymouth-start.service Requires=plymouth-start.service [Service] Type=oneshot ExecStart=/root/.ecryptfs/directory-encryption-script StandardInput=tty TTYPath=/dev/tty1 User=root RemainAfterExit=yes [Install] WantedBy=multi-user.target Alias=directory.encryption.service
3. 重新加载并启用服务
同样执行:
systemctl daemon-reload systemctl enable directory.encryption.service
额外注意事项
- 确保依赖工具已安装:
- zenity:Debian/Ubuntu用
apt install zenity,RHEL/CentOS用dnf install zenity - plymouth:大部分发行版默认已安装,没装的话用对应包管理器安装即可
- zenity:Debian/Ubuntu用
- 先手动运行脚本测试是否能正常弹出密码框并挂载,再用
systemctl start directory.encryption.service测试服务运行,没问题再重启验证开机效果
内容的提问来源于stack exchange,提问作者Shahbaz Shueb
相关产品推荐
相关产品推荐

