This FTP server is a gateway between old-school FTP devices and modern cloud based file systems, using the afero's Fs interface and acting as a reference implementation of the ftpserverlib.
At the current stage, supported backend are:
And with those are supported common parameters to switch them to read-only, enable logging access, or use a temporary directory file (see doc).
These features are brought by ftpserverlib itself:
git clone https://gitee.com/cander/ftpserver.git
cd ftpserver
go build -o ftpserver main.go
If you don't create a ftpserver.json
file, one will be created for you.
Here is a sample config file:
{
"version": 1,
"passive_transfer_port_range": {
"start": 2122,
"end": 2130
},
"tls": {
"server_cert": {
"cert": "cert.pem",
"key": "key.pem"
}
},
"accesses": [
{
"user": "test",
"pass": "test",
"fs": "os",
"params": {
"basePath": "/tmp"
}
},
{
"user": "test",
"pass": "test",
"fs": "os",
"params": {
"basePath": "/tmp"
}
},
{
"user": "dropbox",
"pass": "dropbox",
"fs": "dropbox",
"params": {
"token": "..."
}
},
{
"user": "gdrive",
"pass": "gdrive",
"fs": "gdrive",
"params": {
"google_client_id": "***.apps.googleusercontent.com",
"google_client_secret": "****"
}
},
{
"user": "s3",
"pass": "s3",
"fs": "s3",
"params": {
"endpoint": "https://s3.amazonaws.com",
"region": "eu-west-1",
"bucket": "my-bucket",
"access_key_id": "AKIA....",
"secret_access_key": "IDxd....",
"disable_ssl": "false",
"path_style": "false"
}
},
{
"user": "sftp",
"pass": "sftp",
"fs": "sftp",
"params": {
"username": "user",
"password": "password",
"hostname": "192.168.168.11:22"
}
}
]
}
{
"version": 1,
// 被动模式随机的端口
"passive_transfer_port_range": {
"start": 2122,
"end": 2130
},
"listen_address": ":2121", // 监听端口,默认21
"max_clients": 100, // 最大客户端限制
// 证书设置
"tls": {
"server_cert": {
"cert": "cert.pem",
"key": "key.pem"
}
},
"accesses": [
{
"user": "test", // ftp 用户名
"pass": "test", // ftp 密码
"fs": "os", // 标明本地磁盘
"params": {
"basePath": "/tmp" // 本地磁盘根目录, 不存在自动创建
},
"read_only": false, // 只读
"shared": false, // 共享
},
{
"user": "test",
"pass": "test",
"fs": "os",
"params": {
"basePath": "/tmp"
}
},
{
"user": "dropbox",
"pass": "dropbox",
"fs": "dropbox",
"params": {
"token": "..."
}
},
{
"user": "gdrive",
"pass": "gdrive",
"fs": "gdrive",
"params": {
"google_client_id": "***.apps.googleusercontent.com",
"google_client_secret": "****"
}
},
{
"user": "s3",
"pass": "s3",
"fs": "s3",
"params": {
"endpoint": "https://s3.amazonaws.com",
"region": "eu-west-1",
"bucket": "my-bucket",
"access_key_id": "AKIA....",
"secret_access_key": "IDxd....",
"disable_ssl": "false",
"path_style": "false"
}
},
{
"user": "sftp",
"pass": "sftp",
"fs": "sftp",
"params": {
"username": "user",
"password": "password",
"hostname": "192.168.168.11:22"
}
}
]
}
You can generate the TLS key pair files with the following command:
openssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -out cert.pem -keyout key.pem
You can build the binary and use it directly:
# Get and install the server
go get github.com/fclairamb/ftpserver
ftpserver &
# Download some file
[ -f kitty.jpg ] || (curl -o kitty.jpg.tmp https://placekitten.com/2048/2048 && mv kitty.jpg.tmp kitty.jpg)
# Upload it to the server
curl -v -T kitty.jpg ftp://test:test@localhost:2121/
# Download it back
curl ftp://test:test@localhost:2121/kitty.jpg -o kitty2.jpg
# Compare it
diff kitty.jpg kitty2.jpg
There's also a containerized version of the server (31MB, based on alpine).
# Starting the sample FTP server
docker run --rm -d -p 2121-2130:2121-2130 -v ./ftpserver/files:/tmp -v ./ftpserver:/app fclairamb/ftpserver
# Download some file
[ -f kitty.jpg ] || (curl -o kitty.jpg.tmp https://placekitten.com/2048/2048 && mv kitty.jpg.tmp kitty.jpg)
# Upload it
curl -v -T kitty.jpg ftp://test:test@localhost:2121/
# Download it back
curl ftp://test:test@localhost:2121/kitty.jpg -o kitty2.jpg
# Compare it
diff kitty.jpg kitty2.jpg
# docker-compose.yml
version: '3.3'
services:
ftpserver:
ports:
- '2121-2130:2121-2130'
volumes:
- ./ftpserver/files:/tmp
- ./ftpserver:/app
image: fclairamb/ftpserver
docker-compose up -d
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。