프로젝트

일반

사용자정보

통계
| 개정판:

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)