https://github.com/keensystemsnl/sftpserver
.Net SFTP Server implementation
https://github.com/keensystemsnl/sftpserver
cross-platform csharp dotnet dotnet-standard2-1 dotnet6 linux macos mit-license nuget-package openssh openssh-server sftp sftp-server ssh windows
Last synced: about 1 year ago
JSON representation
.Net SFTP Server implementation
- Host: GitHub
- URL: https://github.com/keensystemsnl/sftpserver
- Owner: KeenSystemsNL
- License: mit
- Created: 2022-05-20T15:38:04.000Z (about 4 years ago)
- Default Branch: master
- Last Pushed: 2022-11-15T15:56:33.000Z (over 3 years ago)
- Last Synced: 2025-03-25T23:34:46.635Z (about 1 year ago)
- Topics: cross-platform, csharp, dotnet, dotnet-standard2-1, dotnet6, linux, macos, mit-license, nuget-package, openssh, openssh-server, sftp, sftp-server, ssh, windows
- Language: C#
- Homepage:
- Size: 165 KB
- Stars: 18
- Watchers: 1
- Forks: 3
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# SFTPServer
This library (and simple host) implement an SFTP server that implements the [V3 version of the SFTP protocol](https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-02) and is available as [NuGet package](https://www.nuget.org/packages/SFTPServer/).
This library is intended to be hosted in an SSH deamon; this can be done by editting the `sshd_config` file (usually in `/etc/ssh/` or, for Windows, in `%PROGRAMDATA%\ssh`) and pointing it to your own host executable.
In `sshd_config` you'll find the `Subsystem` entry which can be pointed to any executable:
```
# override default of no subsystems
#Subsystem sftp sftp-server.exe
#Subsystem sftp internal-sftp
Subsystem sftp /path/to/your/sftphost.exe
```
The way SFTP works is that first an SSH connection is established; once that is done and a request is made for sftp, SSH will launch the configured executable under the connected user's account. All communication is done over `stdin` and `stdout`. The `SFTPServer` class takes 2 [`Streams`](https://docs.microsoft.com/en-us/dotnet/api/system.io.stream) and optionally an `ISFTPHandler` on which the SFTP commands will be invoked. This package comes with a `DefaultSFTPHandler` which provides basic I/O on the hosts's filesystem (based on a rootdirectory), but it should be pretty easy to implement your own `ISFTPHandler` so you can, for example, implement a virtual filesystem.
The `SFTPHost` project in this repository demonstrates how to simply build an executable that hosts an `SFTPServer` instance. A new `SFTPServer` is launched by the SSH service for each connection.
## Implementing an `ISFTPHandler`
Implementing an `ISFTPHandler` should be pretty straightforward, simply implement the `ISFTPHandler` interface. Exceptions you might want to throw should, ideally, be inherited from the `HandlerException`. This library comes with a few built-in exceptions in the `SFTP.Exceptions` namespace. Exceptions that are not inherited from the `HandlerException` will be returned to the client as [`Failure` (`SSH_FX_FAILURE`)](https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-02#page-20). For an example implementation you can have a look at the `DefaultSFTPHandler`.
## Known issues and limitations
* Note that this library only implements V3; higher versions are not supported. Clients connecting with a higher version will be negotiated down to V3.
* The [`SymLink`](https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-02#section-6.10) command has been implemented with the `linkpath` and `targetpath` swapped; We may or may not interpret the RFC incorrectly (Update: [We didn't](https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-09#:~:text=many%0A%20%20%20%20%20%20implementation%20implemented%20SYMLINK%20with%20the%20arguments%20reversed)) or the clients which were used to test the `SymLink` command (WinSCP, Cyberduck and the 'native' sftp commandline executable) had the arguments swapped. The `SymLink` and `ReadLink` methods are only available from .Net 6.0 upwards.
* The `DefaultSFTPHandler` **DOES NOT** take particular much care of path canonicalization or mitigations against path traversion. When used in an untrusted environment extra care should be taken to ensure safety.
* The `DefaultSFTPHandler` **DOES NOT** make a noteworthy effort to return correct POSIX file permissions, nor does it support setting permissions.
## License
Licensed under MIT license. See [LICENSE](https://github.com/KeenSystemsNL/SFTPServer/raw/master/LICENSE) for details.
### Attributions
[Logo / icon by Alexiuz AS](https://icon-icons.com/icon/sftp/117855) ([Archived](https://web.archive.org/web/20220520155358/https://icon-icons.com/icon/sftp/117855))