python子进程中的rsync + ssh在目录名称中出现空格错误

use*_*217 4 python ssh rsync quoting

当我运行Python应用程序(在本地同步远程目录)时,如果包含我的应用程序的目录的名称中包含一个或多个空格,则会出现问题。目录名称显示在ssh选项中,例如“ -o UserKnownHostsFile=<path>”和“ -i <path>”。我试图在生成命令字符串的函数中双引号路径,但是什么也没有。我也尝试替换这样的空格:path.replace(' ', '\\ '),但是不起作用。请注意,我的代码适用于不带空格的目录名。ssh返回的错误是“行尾有垃圾”(代码12)。生成的命令行似乎还可以。

rsync -rztv --delete --stats --progress --timeout=900 --size-only --dry-run \
    -e 'ssh -o BatchMode=yes \
    -o UserKnownHostsFile="/cygdrive/C/Users/my.user/my\ app/.ssh/known_hosts" \
    -i "/cygdrive/C/Users/my.user/my\ app/.ssh/id_rsa"'
    user@host:/home/user/folder/ "/cygdrive/C/Users/my.user/my\ app/folder/"
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?谢谢!

Hor*_*Kol 5

您是否尝试过将命令构建为参数列表-我只是在为ssh连接传递密钥文件时遇到类似的问题:

command = [
  "rsync",
  "-rztv",
  "--delete",
  "--stats",
  "--progress",
  "--timeout=900",
  "--size-only",
  "--dry-run",
  "-e",
  "ssh -o BatchMode=yes -o UserKnownHostsFile='/cygdrive/C/Users/my.user/my\ app/.ssh/known_hosts' -i '/cygdrive/C/Users/my.user/my\ app/.ssh/id_rsa'",
  "user@host:/home/user/folder/",
  "/cygdrive/C/Users/my.user/my\ app/folder/"
]

sp = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = sp.communicate()[0]
Run Code Online (Sandbox Code Playgroud)


new*_*rey 0

子命令返回的数据包含空格作为分隔符。尝试更新内部字段分隔符 (IFS) 列表,例如:

# store a copy of the current IFS
SAVEIFS=$IFS;
# set IFS to be newline-only
IFS=$(echo -en "\n\b");

# execute your command(s)
rsync -rztv --delete --stats --progress --timeout=900 --size-only --dry-run -e 'ssh -o BatchMode=yes -o UserKnownHostsFile="/cygdrive/C/Users/my.user/my\ app/.ssh/known_hosts" -i "/cygdrive/C/Users/my.user/my\ app/.ssh/id_rsa"' user@host:/home/user/folder/ "/cygdrive/C/Users/my.user/my\ app/folder/"

# put the original IFS back
IFS=$SAVEIFS;
Run Code Online (Sandbox Code Playgroud)

我还没有使用你的命令进行测试,尽管它在我过去尝试过的所有情况下都有效。