似乎有一个技巧可以创建只读 sshfs 登录,其只读属性由远程文件强制执行~/.ssh/authorized_keys
。
首先创建一个~/.ssh/ro-sftp-server
运行的程序sftp-server -R
,无论传递了什么其他选项。接下来,像往常一样在远程文件中设置受限的 ssh 密钥,~/.ssh/authorized_keys
但要添加命令限制:
no-X11-forwarding,no-agent-forwarding,no-pty,command= “~/.ssh/ro-sftp-server” ssh-rsa ...
最后,通过调用来挂载目录sshfs
。
sshfs -o ssh_command="ssh -i ~/.ssh/ro_key" \
-o sftp_server="~/.ssh/ro-sftp-server" \
-o idmap=mrmeow -o ro \
[email protected]:. ~/www/
太棒了!现在我如何才能允许写入但只在要求输入密码后才允许写入?
我当然可以使用受密码保护但不受限制的密钥根据需要autofs
安装第二个读写卷。sshfs
我最终需要 unionfs、mhddfs 或类似程序来使第二个目录出现在第一个目录上,但显然我真的需要把它们都安装好。:(
关于如何实现“写入时提示输入密码”功能,您有什么想法吗?
答案1
Fuse 无法在终端上向您提供密码提示,因为它无法访问它。您可能能够让 Fuse 猜测您的 X 显示器并在弹出 GUI 密码提示时阻止 I/O。某些桌面环境 (Gnome/KDE) 提供用于解锁密钥的钱包功能;它们可能是一个值得连接的东西。
但为了简单起见,我可以建议一种替代方案。也许您可以在工作流程中的某个地方检查是否需要写入功能,然后使用脚本调出提示。
例如,如果你使用 Vim,你可以在写入文件之前进行检查:
autocmd BufWritePre *.c \
let targetfile = expand('%') | \
if !filewritable(targetfile) | \
exec "!~/bin/prompt_remount_foo_rw" | \
end
或者在幻想中的 Coffeescript 构建过程中,你可以在写入错误后采取相应的措施:
buildProcess.on "error", (e) ->
if e.writeError
prompt_remount_foo_rw().then(retryBuild)
要在没有 X 的单个终端中获得提示,需要您用来进行写入的任何软件的支持。