root / HServer / 00.Server / 00.Program / node_modules / ftp-srv / README.md
이력 | 보기 | 이력해설 | 다운로드 (8.03 KB)
1 |
<p align="center"> |
---|---|
2 |
<a href="https://github.com/trs/ftp-srv"> |
3 |
<img alt="ftp-srv" src="logo.png" width="600px" /> |
4 |
</a> |
5 |
</p> |
6 |
|
7 |
|
8 |
<p align="center"> |
9 |
Modern, extensible FTP Server |
10 |
</p> |
11 |
|
12 |
<p align="center"> |
13 |
<a href="https://www.npmjs.com/package/ftp-srv"> |
14 |
<img alt="npm" src="https://img.shields.io/npm/dm/ftp-srv.svg?style=for-the-badge" /> |
15 |
</a> |
16 |
|
17 |
<a href="https://circleci.com/gh/trs/ftp-srv"> |
18 |
<img alt="npm" src="https://img.shields.io/circleci/project/github/trs/ftp-srv.svg?style=for-the-badge" /> |
19 |
</a> |
20 |
|
21 |
<a href="https://coveralls.io/github/trs/ftp-srv?branch=master"> |
22 |
<img alt="npm" src="https://img.shields.io/coveralls/github/trs/ftp-srv.svg?style=for-the-badge" /> |
23 |
</a> |
24 |
</p> |
25 |
|
26 |
--- |
27 |
|
28 |
- [Overview](#overview) |
29 |
- [Features](#features) |
30 |
- [Install](#install) |
31 |
- [Usage](#usage) |
32 |
- [API](#api) |
33 |
- [Events](#events) |
34 |
- [Supported Commands](#supported-commands) |
35 |
- [File System](#file-system) |
36 |
- [Contributing](#contributing) |
37 |
- [License](#license) |
38 |
|
39 |
## Overview |
40 |
`ftp-srv` is a modern and extensible FTP server designed to be simple yet configurable. |
41 |
|
42 |
## Features |
43 |
- Extensible [file systems](#file-system) per connection |
44 |
- Passive and active transfers |
45 |
- [Explicit](https://en.wikipedia.org/wiki/FTPS#Explicit) & [Implicit](https://en.wikipedia.org/wiki/FTPS#Implicit) TLS connections |
46 |
- Promise based API |
47 |
|
48 |
## Install |
49 |
`npm install ftp-srv --save` |
50 |
|
51 |
## Usage |
52 |
|
53 |
```js |
54 |
// Quick start |
55 |
|
56 |
const FtpSrv = require('ftp-srv'); |
57 |
const ftpServer = new FtpSrv('ftp://0.0.0.0:9876', { options ... }); |
58 |
|
59 |
ftpServer.on('login', (data, resolve, reject) => { ... }); |
60 |
... |
61 |
|
62 |
ftpServer.listen() |
63 |
.then(() => { ... }); |
64 |
``` |
65 |
|
66 |
## API |
67 |
|
68 |
### `new FtpSrv(url, [{options}])` |
69 |
#### url |
70 |
[URL string](https://nodejs.org/api/url.html#url_url_strings_and_url_objects) indicating the protocol, hostname, and port to listen on for connections. |
71 |
Supported protocols: |
72 |
- `ftp` Plain FTP |
73 |
- `ftps` Implicit FTP over TLS |
74 |
|
75 |
_Note:_ The hostname must be the external IP address to accept external connections. Setting the hostname to `0.0.0.0` will automatically set the external IP. |
76 |
__Default:__ `"ftp://127.0.0.1:21"` |
77 |
|
78 |
#### options |
79 |
|
80 |
##### `pasv_range` |
81 |
A starting port (eg `8000`) or a range (eg `"8000-9000"`) to accept passive connections. |
82 |
This range is then queried for an available port to use when required. |
83 |
__Default:__ `22` |
84 |
|
85 |
##### `greeting` |
86 |
A human readable array of lines or string to send when a client connects. |
87 |
__Default:__ `null` |
88 |
|
89 |
##### `tls` |
90 |
Node [TLS secure context object](https://nodejs.org/api/tls.html#tls_tls_createsecurecontext_options) used for implicit (`ftps` protocol) or explicit (`AUTH TLS`) connections. |
91 |
__Default:__ `false` |
92 |
|
93 |
##### `anonymous` |
94 |
If true, will allow clients to authenticate using the username `anonymous`, not requiring a password from the user. |
95 |
Can also set as a string which allows users to authenticate using the username provided. |
96 |
The `login` event is then sent with the provided username and `@anonymous` as the password. |
97 |
__Default:__ `false` |
98 |
|
99 |
##### `blacklist` |
100 |
Array of commands that are not allowed. |
101 |
Response code `502` is sent to clients sending one of these commands. |
102 |
__Example:__ `['RMD', 'RNFR', 'RNTO']` will not allow users to delete directories or rename any files. |
103 |
__Default:__ `[]` |
104 |
|
105 |
##### `whitelist` |
106 |
Array of commands that are only allowed. |
107 |
Response code `502` is sent to clients sending any other command. |
108 |
__Default:__ `[]` |
109 |
|
110 |
##### `file_format` |
111 |
Sets the format to use for file stat queries such as `LIST`. |
112 |
__Default:__ `"ls"` |
113 |
__Allowable values:__ |
114 |
- `ls` [bin/ls format](https://cr.yp.to/ftp/list/binls.html) |
115 |
- `ep` [Easily Parsed LIST format](https://cr.yp.to/ftp/list/eplf.html) |
116 |
- `function () {}` A custom function returning a format or promise for one. |
117 |
- Only one argument is passed in: a node [file stat](https://nodejs.org/api/fs.html#fs_class_fs_stats) object with additional file `name` parameter |
118 |
|
119 |
##### `log` |
120 |
A [bunyan logger](https://github.com/trentm/node-bunyan) instance. Created by default. |
121 |
|
122 |
## Events |
123 |
|
124 |
The `FtpSrv` class extends the [node net.Server](https://nodejs.org/api/net.html#net_class_net_server). Some custom events can be resolved or rejected, such as `login`. |
125 |
|
126 |
### `login` |
127 |
```js |
128 |
on('login', ({connection, username, password}, resolve, reject) => { ... }); |
129 |
``` |
130 |
|
131 |
Occurs when a client is attempting to login. Here you can resolve the login request by username and password. |
132 |
|
133 |
`connection` [client class object](src/connection.js) |
134 |
`username` string of username from `USER` command |
135 |
`password` string of password from `PASS` command |
136 |
`resolve` takes an object of arguments: |
137 |
- `fs` |
138 |
- Set a custom file system class for this connection to use. |
139 |
- See [File System](#file-system) for implementation details. |
140 |
- `root` |
141 |
- If `fs` is not provided, this will set the root directory for the connection. |
142 |
- The user cannot traverse lower than this directory. |
143 |
- `cwd` |
144 |
- If `fs` is not provided, will set the starting directory for the connection |
145 |
- This is relative to the `root` directory. |
146 |
- `blacklist` |
147 |
- Commands that are forbidden for only this connection |
148 |
- `whitelist` |
149 |
- If set, this connection will only be able to use the provided commands |
150 |
|
151 |
`reject` takes an error object |
152 |
|
153 |
### `client-error` |
154 |
```js |
155 |
on('client-error', ({connection, context, error}) => { ... }); |
156 |
``` |
157 |
|
158 |
Occurs when an error arises in the client connection. |
159 |
|
160 |
`connection` [client class object](src/connection.js) |
161 |
`context` string of where the error occured |
162 |
`error` error object |
163 |
|
164 |
### `RETR` |
165 |
```js |
166 |
on('RETR', (error, filePath) => { ... }); |
167 |
``` |
168 |
|
169 |
Occurs when a file is downloaded. |
170 |
|
171 |
`error` if successful, will be `null` |
172 |
`filePath` location to which file was downloaded |
173 |
|
174 |
### `STOR` |
175 |
```js |
176 |
on('STOR', (error, fileName) => { ... }); |
177 |
``` |
178 |
|
179 |
Occurs when a file is uploaded. |
180 |
|
181 |
`error` if successful, will be `null` |
182 |
`fileName` name of the file that was downloaded |
183 |
|
184 |
## Supported Commands |
185 |
|
186 |
See the [command registry](src/commands/registration) for a list of all implemented FTP commands. |
187 |
|
188 |
## File System |
189 |
The default [file system](src/fs.js) can be overwritten to use your own implementation. |
190 |
This can allow for virtual file systems, and more. |
191 |
Each connection can set it's own file system based on the user. |
192 |
|
193 |
The default file system is exported and can be extended as needed: |
194 |
```js |
195 |
const {FtpSrv, FileSystem} = require('ftp-srv'); |
196 |
|
197 |
class MyFileSystem extends FileSystem { |
198 |
constructor() { |
199 |
super(...arguments); |
200 |
} |
201 |
|
202 |
get(fileName) { |
203 |
... |
204 |
} |
205 |
} |
206 |
``` |
207 |
|
208 |
Custom file systems can implement the following variables depending on the developers needs: |
209 |
|
210 |
### Methods |
211 |
#### [`currentDirectory()`](src/fs.js#L29) |
212 |
Returns a string of the current working directory |
213 |
__Used in:__ `PWD` |
214 |
|
215 |
#### [`get(fileName)`](src/fs.js#L33) |
216 |
Returns a file stat object of file or directory |
217 |
__Used in:__ `LIST`, `NLST`, `STAT`, `SIZE`, `RNFR`, `MDTM` |
218 |
|
219 |
#### [`list(path)`](src/fs.js#L39) |
220 |
Returns array of file and directory stat objects |
221 |
__Used in:__ `LIST`, `NLST`, `STAT` |
222 |
|
223 |
#### [`chdir(path)`](src/fs.js#L56) |
224 |
Returns new directory relative to current directory |
225 |
__Used in:__ `CWD`, `CDUP` |
226 |
|
227 |
#### [`mkdir(path)`](src/fs.js#L96) |
228 |
Returns a path to a newly created directory |
229 |
__Used in:__ `MKD` |
230 |
|
231 |
#### [`write(fileName, {append, start})`](src/fs.js#L68) |
232 |
Returns a writable stream |
233 |
Options: |
234 |
`append` if true, append to existing file |
235 |
`start` if set, specifies the byte offset to write to |
236 |
__Used in:__ `STOR`, `APPE` |
237 |
|
238 |
#### [`read(fileName, {start})`](src/fs.js#L75) |
239 |
Returns a readable stream |
240 |
Options: |
241 |
`start` if set, specifies the byte offset to read from |
242 |
__Used in:__ `RETR` |
243 |
|
244 |
#### [`delete(path)`](src/fs.js#L87) |
245 |
Delete a file or directory |
246 |
__Used in:__ `DELE` |
247 |
|
248 |
#### [`rename(from, to)`](src/fs.js#L102) |
249 |
Renames a file or directory |
250 |
__Used in:__ `RNFR`, `RNTO` |
251 |
|
252 |
#### [`chmod(path)`](src/fs.js#L108) |
253 |
Modifies a file or directory's permissions |
254 |
__Used in:__ `SITE CHMOD` |
255 |
|
256 |
#### [`getUniqueName()`](src/fs.js#L113) |
257 |
Returns a unique file name to write to |
258 |
__Used in:__ `STOU` |
259 |
|
260 |
<!--[RM_CONTRIBUTING]--> |
261 |
## Contributing |
262 |
|
263 |
See [CONTRIBUTING.md](CONTRIBUTING.md). |
264 |
|
265 |
|
266 |
<!--[]--> |
267 |
|
268 |
<!--[RM_LICENSE]--> |
269 |
## License |
270 |
|
271 |
This software is licensed under the MIT Licence. See [LICENSE](LICENSE). |
272 |
|
273 |
<!--[]--> |
274 |
|
275 |
## References |
276 |
|
277 |
- [https://cr.yp.to/ftp.html](https://cr.yp.to/ftp.html) |