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;或者
```
一个用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'
self.server=sftpserver(
sftpservermongostorage(远程,端口,数据库名),
logfile=t_path('log'),
raise_on_error=true
rmtree(self.home)
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
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;或者
```