You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

树莓派Python服务执行SSH连接新Windows10主机时提示权限拒绝,但命令行运行正常

树莓派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\useruser@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的配置检查,应该就能解决权限拒绝的问题。如果还是不行,通过增加错误日志能帮你定位更具体的原因。

火山引擎 最新活动