当我运行我的Python应用程序(在本地同步远程目录)时,如果包含我的应用程序的目录在其名称中有一个或多个空格,则会出现问题。
目录名称显示在“-o UserKnownHostsFile=<path>
”和“-i <path>
”等ssh选项中。
我尝试在我的函数中引用生成命令字符串的路径,但没有。我也尝试替换这样的空格:path.replace(' ', '\\ ')
,但它不起作用。
请注意,我的代码使用没有空格的dirnames。
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/"
我做错了什么?谢谢!
答案 0 :(得分:4)
您是否尝试将命令构建为参数列表 - 我在传递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]
答案 1 :(得分: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;
我没有使用你的命令进行测试,虽然它在我过去尝试的所有情况下都有效。
答案 2 :(得分:0)
为避免转义问题,请使用原始字符串
raw_string = r'''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(raw_string, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = sp.communicate()[0]