在以 sudo 身份运行的 Python 脚本中使用 ssh 时出现 rsync 错误

在以 sudo 身份运行的 Python 脚本中使用 ssh 时出现 rsync 错误

在 Raspberry Pi 上的 Debian Linux 下,我尝试使用 ssh 密钥从 Python 脚本中运行 rsync,这样我就不必提供密码。我计划将 Python 脚本作为服务运行。在脚本 myScript.py 中,我使用

def syncImageFiles(remoteUser, src, dest):
   runssh = f"'ssh -i /home/{remoteUser}/.ssh/id_rsa'"
   syncCmd = ['rsync', '-zr', '--bwlimit=400', '--delete', '-e', runssh, src, dest]
   subprocess.run(syncCmd)
   ...

syncImageFiles('pi', '[email protected]:/home/pi/images/', '/home/user1/images')

当我在本地 Raspberry Pi 上以 user1 身份登录运行脚本时,如下所示

sudo python3 myScript.py

我收到以下错误

rsync: Failed to exec ssh -i /home/user1/.ssh/id_rsa: No such file or directory (2)

但是,如果我在命令行上以 sudo 身份运行 rsync 命令,如下所示

sudo rsync -zr --bwlimit=400 --delete -e 'ssh -i /home/user1/.ssh/id_rsa' [email protected]:/home/pi/images/ '/home/user1/images'

它工作得很好。我尝试提供完整路径 /usr/bin/ssh 但没有效果。添加

fullCmd = ' '.join(syncCmd)
logging.info(fullCmd)

我已经验证结果看起来与我在命令行中输入的内容完全相同,减去“sudo”。那么我错过了什么?

更新:我从其他网络搜索中收集到了一些线索。似乎我收到文件未找到错误的原因是 rsync 将传递给 -e 选项的整个字符串视为文件。我认为我需要一种方法来强制 -e 选项查看各个参数,类似于我使用syncCmd 向 subprocess.run() 提供各个参数的方式。如果我的猜测是正确的,也许最好将其发布在 Python 论坛中寻求答案。

相关内容