2

我正在开发一个 python 脚本,它监视一个目录并上传使用 scp 创建或修改的文件。没关系,除了我希望递归完成,如果用户在监视目录中创建目录,然后修改该新目录中的文件,我会遇到问题。

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

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

4

3 回答 3

2

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

更新:如果您希望减少事务数量,更好的方法可能是在本地制作一个 tar 文件,传输该文件并解压缩它。

于 2010-09-12T04:02:55.050 回答
1

虽然我认为您的特定应用程序会有自己的怪癖(就像我的一样),但这可能会让您走上正确的道路。下面是我使用基于 paramiko 构建的 Fabric 将文件放到远程 EC2 实例上的脚本的一个简短片段。还要注意我把 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)

于 2010-11-27T21:42:06.667 回答
0

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

于 2010-09-12T03:58:41.153 回答