使用scp将单个文件传输到不存在的远程文件夹中
我正在写一个Python脚本,用来监控一个文件夹,并上传那些被创建或修改的文件,使用的是scp命令。这一切都挺好的,但我希望这个过程能递归进行,也就是说,如果用户在监控的文件夹里创建了一个新文件夹,然后在这个新文件夹里修改了一个文件,我也能处理。
我可以检测到文件夹的创建和里面文件的创建或修改,这些都没问题。但是,当我尝试把那个文件上传到远程服务器时,就出问题了,因为远程服务器上并没有那个文件夹。有没有简单的方法可以做到这一点,而不需要递归地复制创建的文件夹?我想避免这样做,因为如果远程文件夹已经存在,我不想把它删除。
另外,请不要建议使用rsync
。我只想用ssh和scp。
3 个回答
这不是完全的scp,但sftp可以使用-b
这个参数来配合一个批处理文件。你可以在里面发送一个创建文件夹的命令和一个上传文件的命令。
虽然我想你的具体应用可能会有自己的特点(就像我的一样),但这可能会让你走上正确的道路。下面是我用来将文件上传到远程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 最初设置与AWS EC2实例的交互 在终端提示符下运行: fab ec2 makeRemoteDirectory changePermissions putScript '''
TARGETPATH = '/your/path/here'
def ec2(): env.hosts = ['你的EC2实例或远程地址'] env.user = '用户名' 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)
既然你有ssh权限,难道不能先创建目录吗?比如说,如果你有一个文件的绝对路径是 /some/path/file.txt,你可以在上传 file.txt
之前先执行 mkdir -p /home/path
来创建目录。
更新:如果你想减少操作次数,可能更好的方法是先在本地把文件打包成一个tar文件,然后传输这个tar文件,最后再解压。