使用shlex将命令与空格和撇号分开

时间:2015-03-13 11:37:05

标签: python

我的python脚本有问题。我想从我的服务器下载文件到我的NAS。我的脚本正在下载每个文件,但包含单引号/ apastrophes和/或空格的文件除外。我已经知道问题所在,但我无法解决问题。问题出在shlex.split()命令上。它只删除单引号。我也调查了paramiko,但它有点大文件的bug,所以这对我不起作用。我也愿意采用完全不同的方法。

我还想知道是否有可能获得该命令的返回,以便我知道scp成功下载了我的文件或者它是否失败。

import subprocess
import shlex    
def download(download_path, remote_path):
    command = "sshpass -p %s scp -o StrictHostKeyChecking=no -r %s@%s:%s %s"  %\
              (ssh_password, ssh_user, host, remote_path, download_path)
    args = shlex.split(command)
    # call scp
    p = subprocess.Popen(args, stdout=subprocess.PIPE, bufsize=1)
    for line in iter(p.stdout.readline, b''):
        print line,
    p.stdout.close()
    p.wait()

P.S。:已经有一个类似问题的主题,我无法工作。 Passing a filename with an apostrophe into scp using python

1 个答案:

答案 0 :(得分:0)

您没有得到需要分割的任意字符串;您基本上是从各个单词开始,然后将它们自己连接起来。不要那样做只需将command列为列表即可。

command = [
    "sshpass", "-p", ssh_password,
    "scp", "-o", "StrictHostKeyChecking=no", "-r",
    "%s@%s:%s" % (ssh_user, host, remote_path),
    download_path
]

p = subprocess.Popen(command, stdout=subprocess.PIPE, bufsize=1)