任何人都可以将此 rsync 命令解析为与 asyncio.subprocess 一起使用的列表吗?

Posted

技术标签:

【中文标题】任何人都可以将此 rsync 命令解析为与 asyncio.subprocess 一起使用的列表吗?【英文标题】:Can anyone parse this rsync command into a list for use with asyncio.subprocess? 【发布时间】:2017-07-14 22:36:04 【问题描述】:

rsync 命令:

sshpass -p 'test' rsync -v -e 'ssh -p 2200' --stats --timeout=60 anonymous@localhost:/DSK1/SSN/LOG[0-9]_F/17191/l134191l.17.bnx L134201707101100f.amalthea

此命令适用于asyncio.subprocess.create_subprocess_shell,但我想将它作为列表传递给create_subprocess_exec

asyncio.subprocess.create_subprocess_exec(*cmdList, stdin=..., ...)

我尝试过简单地将其与cmdString.split() 分开以获得

['sshpass', '-p', "'test'", 'rsync', '-v', '-e', "'ssh", '-p', "2200'", '--stats', '--timeout=60', 'anonymous@localhost:/DSK1/SSN/LOG[0-9]_F/17191/l134191l.17.bnx', 'L134201707101100f.amalthea']

但是rsync 被引号绊倒了。具体来说:

Unexpected remote arg: anonymous@localhost:/DSK1/SSN/LOG[0-9]_F/17191/l134191i.17.bnx
rsync error: syntax or usage error (code 1) at main.c(1361) [sender=3.1.2] 

【问题讨论】:

asyncio.subprocess.create_subprocess_shell 调用一个子shell,这就是你可以传递整个字符串的原因。 asyncio.subprocess.create_subprocess_exec 不调用子 shell。当您的所有命令和参数都分隔成列表时,您不需要引号。你应该以["sshpass", "-p", "test", "rsync", "-v", "-e", "ssh -p 2200", "--stats", "--timeout=60", "anonymous@localhost:/DSK1/SSN/LOG[0-9]_F/17191/l134191l.17.bnx L134201707101100f.amalthea"]结束。 这行得通。如果您将评论格式化为答案(最好包括一个简短的解释,说明为什么在 shell 中不执行命令时不需要引号),我会很乐意接受它。鉴于有多少关于将 rsync 命令解析为子进程列表的问题,我认为它可能很有用。 【参考方案1】:

Shell 使用空格作为输入字段分隔符。为了保护任何空格,请使用引号,或者对空格进行转义。

在运行 asyncio.subprocess.create_subprocess_exec 时,字段已被分隔,并且空格被视为输入字段分隔符。

ssh -p 2200 应该放在一个字段中。 rsync 将按原样查看。在 shell 中,它被引用以保护空格。

["sshpass", "-p", "test", "rsync", "-v", "-e", "ssh -p 2200", "--stats",
"--timeout=60", "anonymous@localhost:/DSK1/SSN/LOG[0-9]_F/17191/l134191l.17.‌​bnx",
"L134201707101100f.amalthea"]

【讨论】:

以上是关于任何人都可以将此 rsync 命令解析为与 asyncio.subprocess 一起使用的列表吗?的主要内容,如果未能解决你的问题,请参考以下文章

rsync 不同步 .htaccess 文件

Linux rsync命令

rsync基本用法与配置,split分离解析

远程同步命令-rsync

Linux系统备份还原工具4(rsync/数据同步工具)

使用python解析pdf