从CMD调用WSL命令时如何使用已运行的SSH代理
从CMD调用WSL命令时如何使用已运行的SSH代理
我之前也碰到过这个问题,每次在CMD里敲wsl rsync都要输SSH密钥密码,烦得不行!后来折腾出几个靠谱的方法,能让你直接复用WSL里已经跑起来的SSH代理,不用反复输密码。
第一步:先确保WSL里的SSH代理正常运行并加载了密钥
打开你的WSL终端,先检查ssh-agent是否在后台运行:ps aux | grep ssh-agent | grep -v grep如果有输出,说明代理已经在跑;要是没输出,就手动启动它:
eval $(ssh-agent -s)接下来把你的SSH密钥添加到代理里(只需要输一次密码,之后代理会记住):
ssh-add ~/.ssh/id_rsa可以用
ssh-add -l命令确认密钥已经成功添加。方法一:临时在CMD里传递代理路径
先在WSL终端里执行echo $SSH_AUTH_SOCK,会得到类似/run/user/1000/keyring/ssh这样的路径。
回到CMD窗口,调用rsync的时候把这个路径传进去就行:wsl -e bash -c "SSH_AUTH_SOCK=/run/user/1000/keyring/ssh rsync [你的rsync命令参数]"这样rsync就能直接用上已有的代理,不用再输密码了。
方法二:自动获取代理路径,更省心
要是不想每次都手动复制路径,可以在CMD里先执行这条命令,自动抓取WSL里的代理路径:for /f %i in ('wsl echo $SSH_AUTH_SOCK') do set WSL_SSH_AUTH_SOCK=%i之后每次调用rsync的时候,直接用这个变量就行:
wsl -e bash -c "SSH_AUTH_SOCK=%WSL_SSH_AUTH_SOCK% rsync [你的rsync命令参数]"方法三:让WSL自动启动代理,一劳永逸
为了不用每次手动启动代理,可以在WSL的shell配置文件里加一段自动脚本。比如用bash的话,编辑~/.bashrc文件:# 自动启动并复用SSH代理 if [ -z "$SSH_AUTH_SOCK" ]; then # 查找已运行的ssh-agent进程 AGENT_PID=$(ps aux | grep ssh-agent | grep -v grep | awk '{print $2}') if [ -n "$AGENT_PID" ]; then # 找到对应的socket文件 SSH_AUTH_SOCK=$(find /run/user/$(id -u) -name 'ssh-agent.*' 2>/dev/null | head -n1) else # 启动新的ssh-agent eval $(ssh-agent -s) fi # 如果密钥还没添加,自动加载 ssh-add -l > /dev/null || ssh-add ~/.ssh/id_rsa fi保存文件后,下次启动WSL终端时,代理会自动启动并加载密钥。之后用方法二的方式在CMD里调用rsync就可以顺畅使用了。
备注:内容来源于stack exchange,提问作者craftycamper
相关产品推荐
相关产品推荐

