我不想永久映射生产系统中的远程磁盘,我想单击快捷方式来映射磁盘,然后单击另一个快捷方式来取消映射。从 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 密钥
安装
keychain
(sudo 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
上述内容。
当断开连接运行时,它只是卸载连接,这会导致sshfs
该tmux
窗口中的运行退出,从而导致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 挂载,