python中的openssh sftp包装器。

pysftpserver的Python项目详细描述


#pysftpserver
一个用python编写的openssh sftp包装器。

*与Python2和Python3兼容。
*完全可扩展且可定制(如下示例)。
*完全符合[sftp-rfc](https://filezilla project.org/specs/draft-ietf-secsh-filexfer-02.txt)。

$pip install pysftpserver添加--user标志,只为您安装pysftpserver[pysftproxy]
```

>否则,您始终可以克隆此存储库并手动启动"setup.py":
````bash
$git clone https://github.com/unbit/pysftpserver.git
$cd pysftpserver
$python setup.py install
```

完整工作示例:

**pysftpjail**:在虚拟chroot环境中监禁用户的sftp存储。
**pysftpproxy**:充当代理的sftp存储,将每个请求转发到另一个sftp服务器。

安装后,您将在您的"$path"中找到我们的两个存储,因此,只需使用适当的命令行可执行文件/参数即可启动它们:

````
$pysftpjail-h

用法:pysftpjail[-h][--logfile logfile][--umask umask]chroot

目录。

位置参数:
chroot chroot监狱的路径


可选参数:
-h,--帮助显示此帮助消息并退出
--日志文件日志文件,-l日志文件
日志文件路径
--umask umask,-u umask
设置sftp服务器的umask
```

`````
$pysftproxy-h

用法:pysftproxy[-h][-l日志文件][-k私钥路径][-p端口][-a]
[-c ssh配置路径][-n已知主机路径][-d]
user[:password]@hostname

openssh sftp服务器代理,将每个请求转发到远程服务器。


位置参数:
user[:password]@hostname
远程服务器的ssh url([user[:password]@]hostname)。主机名也可以指定为ssh配置的主机名。每个丢失的信息都将从那里收集


可选参数:
-h,--help显示此帮助消息并退出
-l日志文件,--logfile日志文件
logfile的路径
-k私钥路径,--密钥私钥路径
私钥标识路径(默认为~/.ssh/id_rsa)
-p端口,--port端口ssh远程端口(默认为22)
-a,--ssh代理启用ssh代理支持
-c ssh配置路径,--ssh配置ssh配置路径
ssh配置文件的路径(默认为
~/.ssh/config)
-n已知主机路径,--已知主机已知主机路径
openssh已知主机文件的路径
-d,--禁用已知主机
禁用已知主机指纹检查(安全
警告!)
```

例如:
```
command="pysftpjail path_to_your_jail"ssh rsa aaaab3[…所以On]
```

可能,您还需要添加以下选项:
````
无端口转发、无-x11-转发、无代理转发
````

没有代理转发ssh rsa aaaaab3[…等等]
```

需要。
我们一如既往欢迎您的任何贡献。:+1:

现实世界定制:MongoDB/Gridfs存储
[MongoDB](http://www.mongoDB.org/)是一个开放的NoSQL,文档数据库。
[gridfs](http://docs.mongodb.org/manual/core/gridfs/)是一个在mongodb数据库中存储和检索任意文件的规范。
下面的示例将演示如何构建一个在mongodb/gridfs数据库中处理文件的存储。

需求
我假设您已经在某个地方运行了一个mongodb数据库,并且您正在使用一个[`virtualenv`](https://virtualenv.readthedocs.org/en/latest/virtualenv.html)。
让我们安装mongodb python驱动程序'pymongo',现在使用:
``bash
$pip install pymongo
````

克隆此项目的存储库并在开发模式下安装基本包。
``bash
$git clone https://github.com/unbit/pysftpserver.git
$cd pysftpserver
$python setup.py develop
````
*包并在全局范围内使用它,而无需重新安装。

现在您可以创建存储了。


类。

`` python
` mongodb gridfs sftp storage.'


来自pysftpserver.abstractstorage import sftpabstractserverstorage
来自pysftpserver.pysftpexceptions import sftpnotfound
导入pymongo



sftpservermongostorage(sftpabstractserverstorage):mongodb gridfs sftp存储类连接到MongoDB。
"
self.home="/"
client=pymongo.mongoclient(远程,端口)
db=client[db-name]
self.gridfs=gridfs.gridfs(db)

def-open(self,filename,flags,模式:
"返回文件句柄。"
如果self.gridfs.exists(filename=filename):
返回self.gridfs.find({'filename':filename})[0]


raise sftpnotfound

def read(self,句柄,关闭,大小):
"从句柄读取大小。忽略偏移量。"return handle.read(size)

def close(self,handle):
"关闭文件句柄。""
handle.close()

"
"警告:
此实现不完整,缺少许多必需的方法。
"
```

我们检查文件是否存在并返回其处理程序;在"read"和"close"方法中,我们只需将调用转发到gridfs即可。


下面是一个示例(将其保存为"pysftpserver/test s/test_server_mongo.py`):

``python
import unittest
import os
from shutil import rmtree


import pymongo
import gridfs

from pysftpserver.server import*
from pysftpserver.mongostrage import sftpserver mongostrage
from pysftpserver.tests.utils import*

"若要运行此测试,必须具有MongoDB在某处运行的实例。""
remote="localhost"
port=1727
db-name="mydb"



class test(unittest.testcase):

@classmethod
def setupclass(cls):
client=pymongo.mongoclient(remote,port)
db=client[db-name]
cls.gridfs=gridfs.gridfs(db)

def setup(self):
os.chdir(t_path())
self.home='home'

os.mkdir(self.home)

self.server=sftpserver(
sftpservermongostorage(远程,端口,数据库名),
logfile=t_path('log'),
raise_on_error=true


os.chdir(t_path())
rmtree(self.home)

s=b"这是一个测试文件。"
f_name="test"put需要一个非字节字符串!
b戋f戋name=b"test"

f=self.gridfs.put(s,filename=f戋name)
self.server.input戋queue=sftpmd(
ssh2戋fxp戋open,
sftpstring(b戋f戋name),
sftpint(ssh2 fxf戋create),
sftpint(0)
)self.server.process()
handle=get_sftphandle(self.server.output_queue)

self.server.output_queue=b''重置输出队列
self.server.input_queue=sftpcmd(
ssh2_fxp读取,
sftpstring(handle),
sftpint64(0),
sftpint(len(s)),

self.server.process()
data=get_sftpdata(self.server.output_queue)

self.assertequal(s,数据)

self.server.output_queue=b''重置输出队列
self.server.input_queue=sftpcmd(
ssh2_fxp_close,
sftpstring(handle)

self.server.process()

清理!
self.gridfs.delete(f)

@classmethod
def teardownclass(cls):
os.unlink(t_path("log"))请注释我以查看日志!
rmtree(t_path("home"),ignore_errors=true)
````

/usr/bin/env python
"pysftpmongo可执行文件"。


import argparse
从pysftpserver.server import sftpserver
从pysftpserver.mongostrage import sftpserver mongostrage


parser=argparse.argumentparser(
description='an openssh sftp使用MongoDB/Gridfs存储的服务器包装器。'



parser.add_argument('remote',type=str,
help='the remote address of the MongoDB instance')
parser.add_argument('port',type=int,
help='MongoDB实例的远程端口')
parser.add_参数('db_name',type=str,
help='the name of the db to use')
parser.add_参数('--logfile','-l',dest='logfile',
help='path to the logfile')

args=parser.parse_args()
sftpserver(
storage=sftpservermongostorage(
args.remote,
args.port,
args.db_name
),
logfile=args.logfile
).run()


"mydb"
```

最后,您应该编辑"setup.py``scripts"字段以包含新的二进制文件。
现在,运行"python setup.py install"将把它放在`$path`中的某个位置,以便以后使用:例如[在授权密钥文件中使用它]("授权密钥"魔法)时。


偷偷查看最终结果(在"授权密钥"文件中):
``
远程端口db_name",无端口转发,无-x11-转发,无代理转发ssh rsa aaaaaab3[…等等]
```

就这样!

(例如,每次调用readdir)都是与ls-l输出格式相同的字符串(`-rw-r--r--1 aldur staff 9596 dec 29 18:36 readme.md`)。

请确保在从存储返回的统计字典中包含正确的"longname"字段,就像我们在这里所做的那样(pysftpserver/storage.py l78)。

$notests
$python setup.py test;或者
```

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Spark SQL:Sqlite不可解析日期   Java继承、匿名内部类实例成员、安卓回调方法   java交换面板和Swing中的数据传递   IntelliJ random“无法启动Java虚拟机”   带有Eclipse Luna RC3的java Weblogic 12c   java按钮java中的用户界面空指针异常错误   使用安卓 webview时,无法正确计算java Javascript方括号表示法。有什么建议吗?   java JAR文件无法识别我正在JAR中读取的文件的更新   如何解决错误:类java。木卫一。BufferedInputStream无法转换为类javax。xml。使改变后果   java如何获取数组/矩阵中的输出和列的和?   Java/Swing是否有(真实的)Office 2007外观?   在java中从URL提取实时汇率   Simon说的java闪烁按钮   java的收集方法是否足够有效?   位于::0的java错误找不到引用的切入点   java扩展父级的静态嵌套类和也扩展该父级的顶级类之间的差异   java停止向angular http发送响应并从控制器加载新的jsp页面   java JavaFX菜单不会下拉