gpt4 book ai didi

python - 从 python 中的 Popen 中执行 rsync 时找不到文件

转载 作者:行者123 更新时间:2023-12-01 02:48:27 26 4
gpt4 key购买 nike

我正在尝试编写一个函数,该函数将采用两个参数 - sourceoutput 并调用 rsync 以将源文件复制到输出文件夹。这是该函数的核心内容:

# Run rsync
try:
command = ['/usr/bin/rsync', "-avz", "-e", '"ssh -i rsync-key"', source, dest]
p = Popen(command, stdout=PIPE, stderr=PIPE)
stdo, stde = p.communicate()
if p.returncode != 0:
raise Exception("Failed to run rsync command {} with return code of {}. {}".format(' '.join(command), p.returncode, stde))
else:
logging.info("Done running rsync command {} with return code of {}. {}".format(' '.join(command), p.returncode, stdo))
except Exception as ex:
raise Exception("Failed to run rsync command {}. {}".format(' '.join(command), ex))

rsync-key 是一个私有(private) ssh key (权限为 700),与 python 脚本位于同一目录中,我的公钥位于我的 authorized_keys 文件中服务器(为了测试我的脚本,我尝试从同一服务器复制文件)。

我正在使用源文件 USERNAME@localhost:/home/USERNAME/.vimrc 和输出文件夹 tmp/ 测试脚本。这两个位置都存在。

如果我使用本地路径(而不是USERNAME@localhost:...)运行它,它也运行得很好。

当我运行这个 python 程序时,我得到以下输出

CRITICAL $(asctime)-15s Error with rsync: Failed to run rsync command /usr/bin/rsync -avz -e "ssh -i rsync-key" USERNAME@localhost:/home/USERNAME/.vimrc tmp/. 
Failed to run rsync command /usr/bin/rsync -avz -e "ssh -i rsync-key" USERNAME@localhost:/home/USERNAME/.vimrc tmp/ with return code of 14. rsync:
Failed to exec ssh -i rsync-key: No such file or directory (2)
rsync error: error in IPC code (code 14) at pipe.c(84) [receiver=3.0.4]
rsync: connection unexpectedly closed (0 bytes received so far) [receiver]
rsync error: error in IPC code (code 14) at io.c(641) [receiver=3.0.4]
Traceback (most recent call last):
File "fetch.py", line 95, in main
rsync(args.source_file, args.output_dir)
File "fetch.py", line 57, in rsync
raise Exception("Failed to run rsync command {}. {}".format(' '.join(command), ex))

但是,如果我运行相同的命令 /usr/bin/rsync -avz -e "ssh -i rsync-key"USERNAME@localhost:/home/USERNAME/.vimrc tmp/正常的 shell 运行顺利。知道为什么 python 似乎无法找到我的 rsync-key 文件吗?

我期待任何回复!

最佳答案

里面有一些额外的引号。删除此行中 ssh 命令周围的一组引号,如下所示:

command = ['/usr/bin/rsync', "-avz", "-e", "ssh -i rsync-key", source, dest]

原因是,通过使用作为列表的命令,您不会通过 shell 运行,因此通常的 shell 解析规则不适用。您的列表直接包含传递给子进程的每个参数,并且参数可以包含空格。

关于python - 从 python 中的 Popen 中执行 rsync 时找不到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45067883/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com