使用 sshfs 映射磁盘的 Windows 快捷方式

使用 sshfs 映射磁盘的 Windows 快捷方式

我不想永久映射生产系统中的远程磁盘,我想单击快捷方式来映射磁盘,然后单击另一个快捷方式来取消映射。从 Bash 使用时,sshfs 工作正常。但是,当我使用 wsl.exe 从快捷方式运行命令时,它会映射磁盘,但命令结束后,映射就会被删除。这可以通过从 PS 运行 wsl.exe 来复制:

PS C:\Users\user> wsl.exe --user root -- sshfs -o allow_other,default_permissions,ro user@machine:/path /mnt/path `&`& read -p "Press enter to continue"

执行 sshfs 后,我可以看到磁盘已映射,但当我按 Enter 键时,磁盘未映射。似乎存在某种“控制台会话”,并且映射仅与会话相关,一旦会话结束,映射就结束。

我不知道发生了什么,我忽略了一些简单但基本的东西。感谢您的任何指点。不,使用 bash.exe 并不能解决问题。

答案1

因此,我想出了两种可能的解决方案。一种是“困难方法”,效果更像你期望的那样,另一种是“简单方法”,效果更好几乎就像你想要的那样。

这是“困难的方法”,但实际上并不是太糟糕。我只是啰嗦而已 ;-) ...

我假设你至少可以使用受密码保护的密钥对进行连接,而不仅仅是简单的密码。只要我们能得到密码/密码启动后sshfs一切都变得简单多了。

我也假设您正在使用 Ubuntu,但这里的基本步骤应该适用于任何发行版。

  • 在客户端 (WSL) 和服务器上设置 ssh 密钥

  • 安装keychainsudo apt-get install keychain

  • 如果需要,请安装tmux(应该已经安装在默认的 WSL Ubuntu 发行版中)

  • 确保您可以使用keychain/ssh-agent作为用户(本例中为 root)进行连接。从 WSL 实例(bash)内部:

    eval $(keychain --eval ~/.ssh/id_rsa) # Should ask for key passphrase
    sshfs -o allow_other,default_permissions,ro user@machine:/path /mnt/path # Should connect without requiring a password or passphrase
    
  • 假设有效,对于 PowerShell 中的“连接脚本/命令”:

    wsl -u root -e bash -c 'eval $(keychain --eval ~/.ssh/id_rsa) tmux new-session -s sshfs -d sshfs -f -o allow_other,default_permissions,ro user@machine:/path /mnt/path'
    
  • 您的“断开连接脚本”是:

    wsl -u root umount /mnt/path
    wsl -u root keychain --stop all
    

分解一下,第一个命令:

  • 通过请求您的密码,keychain以便sshfs命令本身不需要任何用户输入。
  • 使用设置断开连接的 tmux 会话-d(以便 WSL 继续在后台运行)
  • 开始sshfs前景在该 tmux 会话中打开一个窗口(使用-f)。但是,由于tmux会话已断开连接,您将无法直接在那里输入密码;因此需要keychain上述内容。

当断开连接运行时,它只是卸载连接,这会导致sshfstmux窗口中的运行退出,从而导致tmux会话和服务器结束。此时剩下要清理的就是ssh-agent留下的keychain。一旦它消失,WSL 实例本身将自行终止,假设您没有在其中运行任何其他东西。

答案2

因此,我想出了两种可能的解决方案。一种是“困难方法”,效果更像你期望的那样,另一种是“简单方法”,效果更好几乎就像你想要的那样。

这是“简单的方法”:

只需sshfs使用-f标志运行即可防止其退出:

wsl -u root sshfs -o allow_other,default_permissions,ro user@machine:/path /mnt/path

当然,这将使窗口或 PowerShell 窗口保持打开状态。但如果您将其设置为快捷方式,则可以始终将其设置为以最小化方式运行。

要终止连接,请运行:

wsl -u root umount /mnt/path

一旦通过卸载终止连接,sshfs命令将退出,并且前一个窗口将关闭。

由于您已经用命令找到了类似的解决方案read,我猜这不是您想要的。因此,我还是提供了“困难”解决方案。

答案3

我最终决定使用分离屏幕的两个快捷方式,我需要输入密码。上述两种解决方案可能对其他人更有效,但帮助我找到了解决方案。

挂载服务器:

C:\Windows\System32\wsl.exe --user root -- screen -S "server" bash -c "mkdir -p /mnt/server; sshfs -o allow_other,default_permissions,ro user@server:/folder /mnt/server; echo 'Press Ctrl-a, Ctrl-d'; exec sh;"

解释 - screen 将创建名为“server”的新会话并运行引号中的 bash 命令。Bash 将创建挂载文件夹(可选),sshfs 将提示输入密码,echo 将要求用户分离会话,exec sh 将无限期运行。Ctrl-a、Ctrl-d 将分离 screen 并在后台运行。

卸载服务器:

C:\Windows\System32\wsl.exe --user root -- screen -X -S "server" quit

解释 - 这将退出分离的会话以及 sshfs 挂载,

相关内容