如何在WSL中使用SSHPass自动启动并登录SSH会话
解决WSL启动自动SSH登录的问题
一、修复当前Windows Terminal配置的报错
错误0x80070002本质是WSL无法正确解析你直接写入的命令串——Windows Terminal会把整个/usr/bin/sshpass ...当作一个单一命令去查找,而非拆解执行。你需要用shell来包裹这个命令:
修改settings.json中的commandline字段为:
"commandline": "bash -c \"/usr/bin/sshpass -p 'your_actual_password' ssh -o StrictHostKeyChecking=no user@host\""
如果密码包含特殊字符,用转义双引号包裹密码更安全:
"commandline": "bash -c '/usr/bin/sshpass -p \"your_actual_password\" ssh -o StrictHostKeyChecking=no user@host'"
先在WSL终端里手动执行bash -c "/usr/bin/sshpass -p 'password' ssh user@host"确认能正常登录,再更新配置。
二、更可靠的自动登录方案(推荐)
虽然你提到要明文存储密码,但还是建议优先选择更安全的方案;如果坚持要用密码,也可以用兼容性更好的方式替代sshpass:
方案1:SSH密钥对免密登录(最安全)
- 在WSL里生成密钥对:
连续按回车跳过密钥密码设置,实现完全免密。ssh-keygen -t ed25519 - 把公钥复制到目标服务器:
第一次输入服务器密码完成配置,之后就能直接免密登录。ssh-copy-id user@host - 修改Windows Terminal的
commandline为:"commandline": "ssh user@host"
方案2:Expect脚本实现密码自动输入
如果必须用密码登录,expect比sshpass的兼容性更好:
- 在WSL里创建登录脚本
~/.ssh/autologin.sh:#!/usr/bin/expect set timeout 10 spawn ssh user@host expect "Password:" send "your_actual_password\r" interact - 给脚本添加执行权限:
chmod +x ~/.ssh/autologin.sh - 修改Windows Terminal的
commandline为:"commandline": "bash -c \"~/.ssh/autologin.sh\""
三、关于命令执行时机的问题
没错,Windows Terminal中WSL配置的commandline是在Linux内核初始化的早期执行的,此时系统环境(比如部分环境变量、后台服务)可能还没完全加载。如果要等Linux初始化完成后再执行命令,最稳妥的方法是把命令添加到shell的启动脚本中:
- 打开WSL的
~/.bashrc(如果用zsh则是~/.zshrc):nano ~/.bashrc - 在文件末尾添加你的登录命令:
/usr/bin/sshpass -p 'your_actual_password' ssh -o StrictHostKeyChecking=no user@host - 保存退出后,下次启动WSL会话时,shell初始化完成就会自动执行这个命令。
额外排查点
- 确认sshpass的实际路径:在WSL里执行
which sshpass,如果输出不是/usr/bin/sshpass,要把配置里的路径改成实际路径(比如/usr/local/bin/sshpass)。 - 先手动测试命令:在WSL终端里完整执行登录命令,确认能正常登录后再放到配置或启动脚本中。
内容的提问来源于stack exchange,提问作者Kenneth Rhodes
相关产品推荐
相关产品推荐

