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

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

问题描述:

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

sshpass -p 'test' rsync -v -e 'ssh -p 2200' --stats --timeout=60 [email protected]:/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', '[email protected]:/DSK1/SSN/LOG[0-9]_F/17191/l134191l.17.bnx', 'L134201707101100f.amalthea'] 

rsync正在引用引号。具体来说:

Unexpected remote arg: [email protected]:/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] 
+1

'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/l1341911.17.bnx L134201707101100f.amalthea“]'。 – alvits

+0

这工作。如果你想将你的评论格式化为一个答案(最好包括一个简短的解释,说明为什么你不需要在shell中执行命令时需要引号),我会很乐意接受它。鉴于有多少关于将rsync命令解析为子进程列表的问题,我认为它可能很有用。 – medley56

壳使用空格作为输入字段分隔符。为了保护任何空格,使用引号,或者空格被转义。

运行asyncio.subprocess.create_subprocess_exec时,字段已分隔,空格为而不是被视为输入字段分隔符。

ssh -p 2200应该放在一个字段中。 rsync将会看到它。引用它来保护空白。

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