使用python将带撇号的文件名传递给scp

2024-04-28 18:17:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图编写一个python脚本,通过scp将文件从远程服务器复制到本地目录。在

除了在pc机上运行ssh-opener命令外,我只能通过ssh-opener命令在pc机上安装这个文件系统操作系统. 在

SCPCopy = "scp -c blowfish -C user@host:\"" + pipes.quote(file) + "\" /storage/downloads/incoming/"
SCPCopy = SCPCopy.replace('\n','')
os.system(SCPCopy)

除了包含撇号的文件名之外,这是有效的。在

下面是传递给操作系统在带有撇号的文件中:

^{pr2}$

错误是:

sh: -c: line 0: unexpected EOF while looking for matching `''
sh: -c: line 1: syntax error: unexpected end of file

它看起来管道.报价(x) 正在转义撇号(应该如此),但显然语法仍然不正确。我试过放弃管道.报价(x) 把撇号换成/'但那也没什么用。在


Tags: 文件命令脚本远程管道shlineopener
1条回答
网友
1楼 · 发布于 2024-04-28 18:17:21

由于scp基于SSH,所以您给它的文件名也要在远程端进行shell转义。所以你需要逃跑两次。在

shell的转义命令行正确:

scp -c blowfish -C user@host:"\"/media/sdi1/home/data/bob's file\"" /storage/.../

要生成python字符串,我们必须再添加一个转义级别。为了保持理智,我们可以使用三重引号:

^{pr2}$

如果您是以编程方式(例如,使用不推荐使用的pipes.quote),那么根本不要碰文件名(在上面的例子中,您在文件名周围添加了撇号)。在

fp = "/media/sdi1/home/data/bob's file.avi"
fp = "user@host:" + pipes.quote(pipes.quote(fp))

cmdline = "scp -c blowfish -C " + fp + " /storage/downloads/incoming/"
os.system(cmdline)

这显然令人困惑。对于一个简单的模型,pipes.quote的全部意义是转义输入,这样shell将把输入解析为一个单词,它等于输入。在

以下是一种更普遍正确的方法(并产生相同的结果):

fp = "/media/sdi1/home/data/bob's file.avi"
# the filepath argument escaped for ssh/scp on the remote side
fp = pipes.quote(fp)
commandargs = ["scp", "-c", "blowfish", "-C", "user@host:"+fp, "/storage/downloads/incoming/"]
# escape all words for the local shell, and then concatenate space-separated
cmdline = " ".join(map(pipes.quote, commandargs))
os.system(cmdline)

它更清楚地表达了它的意图:控制shell将准确地解析哪些单词。在

但为什么首先从一个贝壳开始呢?我们不需要一个,可以拯救当地的逃犯。要使用我们的参数直接生成一个进程,请使用os.exec*家族中的命令。在

fp = pipes.quote("/media/sdi1/home/data/bob's file.avi")
commandargs = ["scp", "-c", "blowfish", "-C", "user@host:"+fp, "/storage/downloads/incoming/"]
if os.fork() == 0:
    os.execvp("scp", commandargs)

相关问题 更多 >