树莓派Python服务执行SSH连接新Windows10主机时提示权限拒绝,但命令行运行正常
看起来你遇到的是systemd服务运行环境与普通命令行环境差异导致的权限问题,我之前也碰到过类似的坑,核心原因是服务默认的运行身份、环境变量和你手动在终端运行时不一样,结合你的情况,咱们一步步排查:
1. 最可能的原因:服务以root身份运行,与普通用户环境不匹配
你的systemd服务文件里没有指定User字段,默认会以root用户身份启动Python脚本,但你手动在终端运行时是用普通user用户执行的。这会带来两个关键问题:
root用户访问/home/user/sshKey时,SSH客户端会因为密钥属于其他用户(user)而拒绝使用(SSH对密钥的权限和归属有严格的安全检查)- 新Windows10的OpenSSH服务器可能对
root用户的连接做了限制(比如默认拒绝非本地用户或陌生身份的公钥)
解决方法:修改服务文件,让服务以普通用户身份运行
编辑你的服务文件/lib/systemd/system/你的服务名.service,在[Service]块中添加User=user:
[Service] User=user ExecStart=/usr/bin/python3 /home/user/scripts/bot/Bot.py
然后重新加载systemd配置并重启服务:
sudo systemctl daemon-reload sudo systemctl restart 你的服务名
2. 检查SSH密钥的权限与归属
即使服务改了用户身份,也要确保密钥文件的权限符合SSH的安全要求:
# 设置密钥文件为仅所有者可读 chmod 600 /home/user/sshKey # 确保密钥归属为user用户 chown user:user /home/user/sshKey
SSH客户端会拒绝使用权限过于宽松(比如其他用户可读)的密钥,新Windows的OpenSSH服务器对这一点的检查可能比旧Windows更严格。
3. 排查新Windows10 OpenSSH服务器的配置差异
新Windows10自带的OpenSSH服务器默认配置可能比旧版本更严格,需要检查以下几点:
3.1 确认公钥认证已启用
打开Windows上的C:\ProgramData\ssh\sshd_config文件,确保以下配置项未被注释且值为yes:
PubkeyAuthentication yes
修改后重启Windows的OpenSSH SSH Server服务。
3.2 确认Windows用户名格式正确
你的SSH命令用了user@hotmail.com@192.168.0.111,如果这是微软账户的UPN(用户主体名称),需要确保Windows的OpenSSH服务器支持该格式:
- 在Windows上打开命令提示符,执行
whoami查看当前用户名,格式应为DESKTOP-XXX\user或user@hotmail.com - 如果是微软账户,确保
sshd_config中未限制该用户,可添加AllowUsers user@hotmail.com到配置文件中
3.3 确认公钥已正确添加到Windows的授权文件
将树莓派上的公钥(/home/user/sshKey.pub内容)添加到Windows用户目录下的C:\Users\user\.ssh\authorized_keys文件中,并且确保该文件的权限设置为仅当前用户可读(在Windows右键文件→属性→安全→高级,删除所有继承权限,只保留当前用户的读取权限)。
4. 增加错误日志排查细节
当前的Python代码只捕获了标准输出,没有捕获错误输出,建议修改代码以获取更详细的SSH错误信息,方便进一步排查:
import subprocess try: # 同时捕获stdout和stderr result = subprocess.check_output( ["/home/user/scripts/bot/test.sh"], stderr=subprocess.STDOUT, text=True ) print(f"Success output: {result}") except subprocess.CalledProcessError as e: print(f"Error code: {e.returncode}") print(f"Error details: {e.output}")
修改后重启服务,通过journalctl -u 你的服务名 -f查看实时日志,能看到SSH连接时的具体错误(比如密钥文件无法读取、服务器拒绝的具体原因)。
5. 验证密钥兼容性
新Windows10的OpenSSH服务器可能对密钥类型或长度有更高要求,比如默认拒绝小于2048位的RSA密钥。可以检查你的密钥类型:
ssh-keygen -l -f /home/user/sshKey
如果密钥长度小于2048位,建议重新生成一对符合要求的密钥:
ssh-keygen -t rsa -b 2048 -f /home/user/new_sshKey
然后将新公钥添加到Windows的authorized_keys文件中,修改bash脚本中的密钥路径为/home/user/new_sshKey。
总结
你遇到的问题本质是服务运行环境与手动执行环境的不一致,优先解决服务的运行身份问题,再结合Windows OpenSSH的配置检查,应该就能解决权限拒绝的问题。如果还是不行,通过增加错误日志能帮你定位更具体的原因。




