Modern, extensible FTP Server
npm install @alancnet/ftp-srv
Modern, extensible FTP Server
---
- Overview
- Features
- Install
- Usage
- API
- CLI
- Events
- Supported Commands
- File System
- Contributing
- License
ftp-srv is a modern and extensible FTP server designed to be simple yet configurable.npm install ftp-srv --save``js
// Quick start
const FtpSrv = require('ftp-srv');
const ftpServer = new FtpSrv('ftp://0.0.0.0:9876', { options ... });
ftpServer.on('login', (data, resolve, reject) => { ... });
...
ftpServer.listen()
.then(() => { ... });
`
Plain FTP
- ftps Implicit FTP over TLS_Note:_ The hostname must be the external IP address to accept external connections.
0.0.0.0 will listen on any available hosts for server and passive connections.
__Default:__ "ftp://127.0.0.1:21"#### options
#####
pasv_url
The hostname to provide a client when attempting a passive connection (PASV). This defaults to the provided url hostname._Note:_ If set to
0.0.0.0, this will automatically resolve to the external IP of the box.
__Default:__ "127.0.0.1"#####
pasv_range
A starting port (eg 8000) or a range (eg "8000-9000") to accept passive connections.
This range is then queried for an available port to use when required.
__Default:__ 22#####
greeting
A human readable array of lines or string to send when a client connects.
__Default:__ null#####
tls
Node TLS secure context object used for implicit (ftps protocol) or explicit (AUTH TLS) connections.
__Default:__ false#####
anonymous
If true, will allow clients to authenticate using the username anonymous, not requiring a password from the user.
Can also set as a string which allows users to authenticate using the username provided.
The login event is then sent with the provided username and @anonymous as the password.
__Default:__ false#####
blacklist
Array of commands that are not allowed.
Response code 502 is sent to clients sending one of these commands.
__Example:__ ['RMD', 'RNFR', 'RNTO'] will not allow users to delete directories or rename any files.
__Default:__ []#####
whitelist
Array of commands that are only allowed.
Response code 502 is sent to clients sending any other command.
__Default:__ []#####
file_format
Sets the format to use for file stat queries such as LIST.
__Default:__ "ls"
__Allowable values:__
- ls bin/ls format
- ep Easily Parsed LIST format
- function () {} A custom function returning a format or promise for one.
- Only one argument is passed in: a node file stat object with additional file name parameter#####
log
A bunyan logger instance. Created by default.CLI
ftp-srv also comes with a builtin CLI.`bash
$ ftp-srv [url] [options]
``bash
$ ftp-srv ftp://0.0.0.0:9876 --root ~/Documents
`####
urlSet the listening URL.
Defaults to
ftp://127.0.0.1:21####
--root / -rSet the default root directory for users.
Defaults to the current directory.
####
--credentials / -cSet the path to a json credentials file.
Format:
`js
[
{
"username": "...",
"password": "...",
"root": "..." // Root directory
},
...
]
`####
--usernameSet the username for the only user. Do not provide an argument to allow anonymous login.
####
--passwordSet the password for the given
username.Events
The
FtpSrv class extends the node net.Server. Some custom events can be resolved or rejected, such as login.$3
`js
ftpServer.on('login', ({connection, username, password}, resolve, reject) => { ... });
`Occurs when a client is attempting to login. Here you can resolve the login request by username and password.
connection client class object
username string of username from USER command
password string of password from PASS command
resolve takes an object of arguments:
- fs
- Set a custom file system class for this connection to use.
- See File System for implementation details.
- root
- If fs is not provided, this will set the root directory for the connection.
- The user cannot traverse lower than this directory.
- cwd
- If fs is not provided, will set the starting directory for the connection
- This is relative to the root directory.
- blacklist
- Commands that are forbidden for only this connection
- whitelist
- If set, this connection will only be able to use the provided commandsreject takes an error object$3
`js
ftpServer.on('client-error', ({connection, context, error}) => { ... });
`Occurs when an error arises in the client connection.
connection client class object
context string of where the error occurred
error error object$3
`js
connection.on('RETR', (error, filePath) => { ... });
`Occurs when a file is downloaded.
error if successful, will be null
filePath location to which file was downloaded$3
`js
connection.on('STOR', (error, fileName) => { ... });
`Occurs when a file is uploaded.
error if successful, will be null
fileName name of the file that was uploadedSupported Commands
See the command registry for a list of all implemented FTP commands.
File System
The default file system can be overwritten to use your own implementation.
This can allow for virtual file systems, and more.
Each connection can set it's own file system based on the user. The default file system is exported and can be extended as needed:
`js
const {FtpSrv, FileSystem} = require('ftp-srv');class MyFileSystem extends FileSystem {
constructor() {
super(...arguments);
}
get(fileName) {
...
}
}
`Custom file systems can implement the following variables depending on the developers needs:
$3
#### currentDirectory()
Returns a string of the current working directory
__Used in:__ PWDget(fileName)
Returns a file stat object of file or directory
__Used in:__ LIST, NLST, STAT, SIZE, RNFR, MDTMlist(path)
Returns array of file and directory stat objects
__Used in:__ LIST, NLST, STATchdir(path)
Returns new directory relative to current directory
__Used in:__ CWD, CDUPmkdir(path)
Returns a path to a newly created directory
__Used in:__ MKDwrite(fileName, {append, start})
Returns a writable stream
Options:
append if true, append to existing file
start if set, specifies the byte offset to write to
__Used in:__ STOR, APPEread(fileName, {start})
Returns a readable stream
Options:
start if set, specifies the byte offset to read from
__Used in:__ RETRdelete(path)
Delete a file or directory
__Used in:__ DELErename(from, to)
Renames a file or directory
__Used in:__ RNFR, RNTOchmod(path)
Modifies a file or directory's permissions
__Used in:__ SITE CHMODgetUniqueName()
Returns a unique file name to write to
__Used in:__ STOU`See CONTRIBUTING.md.
- OzairP
- qchar
- jorinvo
- voxsoftware
- pkeuter
- TimLuq
- edin-mg
- DiegoRBaquero
This software is licensed under the MIT Licence. See LICENSE.