Python 使用scp将单个文件传输到不带';不存在

Python 使用scp将单个文件传输到不带';不存在,python,scp,Python,Scp,我正在编写一个python脚本,它监视一个目录,并上传使用scp创建或修改的文件。这很好,只是我希望递归地完成,如果用户在watch目录中创建一个目录,然后在新目录中修改一个文件,我会遇到一个问题 我可以很好地检测目录创建和文件嵌套文件创建/修改。但是,如果我尝试将该文件上载到远程服务器,它将无法工作,因为远程站点上的目录将不存在。有没有一种简单的方法可以在不递归复制创建的目录的情况下执行此操作?我想避免这种情况,因为如果远程文件夹存在,我不想删除它 另外,请不要建议rsync。它只能使用ssh

我正在编写一个python脚本,它监视一个目录,并上传使用scp创建或修改的文件。这很好,只是我希望递归地完成,如果用户在watch目录中创建一个目录,然后在新目录中修改一个文件,我会遇到一个问题

我可以很好地检测目录创建和文件嵌套文件创建/修改。但是,如果我尝试将该文件上载到远程服务器,它将无法工作,因为远程站点上的目录将不存在。有没有一种简单的方法可以在不递归复制创建的目录的情况下执行此操作?我想避免这种情况,因为如果远程文件夹存在,我不想删除它


另外,请不要建议
rsync
。它只能使用ssh和scp

不完全是scp,但sftp可以使用批处理文件获取
-b
参数。您可以发送一个mkdir和一个put。

既然您有ssh,您就不能先创建目录吗?例如,给定一个绝对路径为/some/path/file.txt的文件,在上传
file.txt
之前,发出
mkdir-p/home/path


更新:如果您希望减少事务数量,一个更好的方法可能是在本地创建tar文件,传输该文件,然后将其解压。

虽然我认为您的特定应用程序会有自己的怪癖(我的也是),但这可能会让您走上正确的道路。下面是一个脚本的简短片段,我使用构建在paramiko上的Fabric将文件放到远程EC2实例上。还要注意,我将sudo命令放在其中,因为Fabric有自己的“sudo”类。这是我所指的怪癖之一。希望这对别人有帮助


从fabric.api导入环境,运行,放置,设置,cd
从fabric.contrib.files导入存在

''' sudo-apt-get-install结构 最初设置为与AWS EC2实例交互 在终端提示下运行: fab ec2生成远程目录更改脚本 '''

TARGETPATH='/your/path/here'

def ec2(): env.hosts=['您的EC2实例或远程地址'] env.user='user\u name' env.key_filename='/path/to/your/private_key.pem'

def makeRemoteDirectory(): 如果不存在(“%s”%TARGETPATH): 运行('sudo mkdir%s'%TARGETPATH)

def changePermissions(): 运行('sudo chown-R%(用户)s:%(用户)s%(路径)s“{'user':env.user,'path':TARGETPATH})

def putScript(): fileName='/path/to/local/file' dirName=TARGETPATH put(文件名、目录名)

您是否尝试过
-r
修改器?(
-r
表示“递归复制”并根据需要构造文件夹)为什么不能使用rsync?只是你不喜欢吗?你有没有真正的理由不使用它?如果是,原因是什么?当你问“我如何做A?请不要建议使用工具B”时,“我如何做A?”通常的回答是“使用工具B”,而你没有说你为什么不能使用工具B,这往往会让人产生误解。另外,如果你告诉我们为什么你不能使用它,这将帮助我们找到更好的答案。首先,我不喜欢rsync,但这不是我说我不想使用它的原因。我发现rsync非常慢,就我正在进行的传输类型而言,它比scp慢得多。而且,rsync甚至不能解决我的问题。我尝试手动执行此操作,这样就不会有rsync差异计算的开销。我不希望每次更新一个文件时都要计算一个完整的差异树。这是我能想到的唯一解决方案。我只是希望有一种方法可以通过scp在1个事务中实现这一点,而不依赖于mkdirfail@Falmarri,请参阅我的更新。我不确定还有没有更好的方法。是的,我可能会通过ssh创建目录

from fabric.api import env, run, put, settings, cd
from fabric.contrib.files import exists

''' sudo apt-get install fabric Initially setup for interaction with an AWS EC2 instance At the terminal prompt run: fab ec2 makeRemoteDirectory changePermissions putScript '''

TARGETPATH = '/your/path/here'

def ec2(): env.hosts = ['your EC2 Instance or remote address'] env.user = 'user_name' env.key_filename = '/path/to/your/private_key.pem'

def makeRemoteDirectory(): if not exists('%s'%TARGETPATH): run('sudo mkdir %s'%TARGETPATH)

def changePermissions(): run('sudo chown -R %(user)s:%(user)s %(path)s'%{'user': env.user, 'path': TARGETPATH})

def putScript(): fileName = '/path/to/local/file' dirName = TARGETPATH put(fileName, dirName)