使用scp将单个文件传输到不存在的远程文件夹中

时间:2010-09-12 03:54:02

标签: python scp

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

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

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

3 个答案:

答案 0 :(得分:2)

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

更新:如果您希望降低事务数量,更好的方法可能是在本地创建tar文件,传输它并解压缩。

答案 1 :(得分:1)

虽然我想你的具体应用程序会有自己的怪癖(就像我的那样),这可能会让你走上正确的道路。下面是一个脚本的简短片段,用于将文件放在远程EC2实例上,使用基于paramiko构建的Fabric。还要注意我在哪里放置sudo命令,因为Fabric有自己的“sudo”类。这是我所指的那个怪癖之一。希望这有助于某人。


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)

答案 2 :(得分:0)

它不完全是scp,但是sftp可以将-b参数与批处理文件一起使用。你可以发送一个mkdir和一个put。