我正在尝试在Python脚本的子进程中通过ssh执行rsync,将一台服务器上的图片复制到另一台服务器。我定义了一个函数:
def rsyncBookContent(bookIds, serverEnv):
bookPaths = ""
if len(bookIds) > 1:
bookPaths = "{" + ",".join(("book_"+str(x)) for x in bookIds) + "}"
else:
bookPaths = "book_" + str(bookIds[0])
for host in serverEnv['content.hosts']:
args = ["rsync", "-avz", "--include='*/'", "--include='*.jpg'", "--exclude='*'", "-e", "ssh", options.bookDestDir + "/" + bookPaths, "jill@" + host + ":/home/jill/web/public/static/"]
print "executing " + ' '.join(args)
subprocess.call(args)
我最终想做的是让Python执行这个命令(在bash shell下有效):
rsync -avz --include='*/' --include='*.jpg' --exclude='*' -e ssh /shared/books/{book_482,book_347} jill@10.12.27.20:/home/jill/web/public/static/
实际上,我的打印语句输出:
executing rsync -avz --include='*/' --include='*.jpg' --exclude='*' -e ssh /shared/books/{book_482,book_347} jill@10.12.27.20:/home/jill/web/public/static/
但是,如果从这个 Python 脚本中执行,会遇到两个问题:
- 如果 bookIds 的长度大于 1,则 /shared/books/ 目录下的子目录列表会被 bash 或 rsync 错误地解释。错误信息为:
- rsync: link_stat "/shared/books/{book_482,book_347}" failed: No such file or directory (2))
- 如果 bookIds 的长度等于 1,则源目录下的 所有文件 都会被同步(而不仅仅是 *.jpg 文件,我本意只同步这些文件)。
看起来像是 subprocess.call 函数需要对某些字符进行转义或其他操作,是吗?
shell=True
会发生什么?例如:subprocess.call(args, shell=True)
。 - sberry