webssh/README.md

197 lines
4.6 KiB
Markdown
Raw Normal View History

2017-11-08 14:33:05 +00:00
## WebSSH
2018-08-20 15:09:09 +00:00
2018-04-22 12:10:11 +00:00
[![Build Status](https://travis-ci.org/huashengdun/webssh.svg?branch=master)](https://travis-ci.org/huashengdun/webssh)
2018-04-26 14:24:17 +00:00
[![codecov](https://codecov.io/gh/huashengdun/webssh/branch/master/graph/badge.svg)](https://codecov.io/gh/huashengdun/webssh)
2018-04-27 00:44:22 +00:00
![PyPI - Python Version](https://img.shields.io/pypi/pyversions/webssh.svg)
![PyPI](https://img.shields.io/pypi/v/webssh.svg)
2018-04-22 12:10:11 +00:00
2018-08-20 15:09:09 +00:00
2019-05-19 12:19:51 +00:00
### Introduction
2018-08-20 15:09:09 +00:00
2018-08-29 15:12:21 +00:00
A simple web application to be used as an ssh client to connect to your ssh servers. It is written in Python, base on tornado, paramiko and xterm.js.
2017-11-08 14:33:05 +00:00
2019-05-19 12:19:51 +00:00
### Features
2017-11-08 14:33:05 +00:00
2018-02-06 14:52:08 +00:00
* SSH password authentication supported, including empty password.
* SSH public-key authentication supported, including DSA RSA ECDSA Ed25519 keys.
* Encrypted keys supported.
2018-02-06 23:20:16 +00:00
* Fullscreen terminal supported.
2018-02-06 14:52:08 +00:00
* Terminal window resizable.
2018-08-20 15:09:09 +00:00
* Auto detect the ssh server's default encoding.
2018-09-15 01:46:40 +00:00
* Modern browsers including Chrome, Firefox, Safari, Edge, Opera supported.
2018-08-20 15:09:09 +00:00
2019-05-19 12:19:51 +00:00
### Preview
2018-08-20 15:09:09 +00:00
![Login](https://github.com/huashengdun/webssh/raw/master/preview/login.png)
![Terminal](https://github.com/huashengdun/webssh/raw/master/preview/terminal.png)
2018-09-01 03:20:31 +00:00
### How it works
```
+---------+ http +--------+ ssh +-----------+
| browser | <==========> | webssh | <=======> | ssh server|
+---------+ websocket +--------+ ssh +-----------+
```
2018-08-29 15:12:21 +00:00
### Requirements
2018-08-20 15:09:09 +00:00
* Python 2.7/3.4+
2018-02-06 14:52:08 +00:00
2018-08-29 15:12:21 +00:00
### Quickstart
2018-08-20 15:09:09 +00:00
2018-08-29 23:18:34 +00:00
1. Install this app, run command `pip install webssh`
2. Start a webserver, run command `wssh`
2018-08-29 15:12:21 +00:00
3. Open your browser, navigate to `127.0.0.1:8888`
4. Input your data, submit the form.
### Server options
```bash
2018-10-19 10:55:20 +00:00
# start a http server with specified listen address and listen port
2018-10-22 13:51:51 +00:00
wssh --address='2.2.2.2' --port=8000
2017-12-08 14:04:16 +00:00
2018-10-22 13:51:51 +00:00
# start a https server, certfile and keyfile must be passed
wssh --certfile='/path/to/cert.crt' --keyfile='/path/to/cert.key'
2018-10-19 10:55:20 +00:00
2018-08-10 05:45:01 +00:00
# missing host key policy
2018-04-26 16:04:48 +00:00
wssh --policy=reject
2018-03-14 17:13:35 +00:00
2018-08-10 05:45:01 +00:00
# logging level
2018-04-26 16:04:48 +00:00
wssh --logging=debug
2018-03-16 07:07:28 +00:00
2018-02-26 00:08:15 +00:00
# log to file
2018-04-26 16:04:48 +00:00
wssh --log-file-prefix=main.log
2017-11-08 14:33:05 +00:00
2018-02-26 00:08:15 +00:00
# more options
2018-04-26 16:04:48 +00:00
wssh --help
2018-08-20 15:09:09 +00:00
```
2018-12-15 13:40:16 +00:00
### Browser console
2018-08-29 15:12:21 +00:00
```javascript
// connect to your ssh server
wssh.connect(hostname, port, username, password, privatekey);
2018-09-09 07:41:28 +00:00
// pass an object to wssh.connect
2018-08-29 15:12:21 +00:00
var opts = {
hostname: 'hostname',
port: 'port',
username: 'username',
password: 'password',
privatekey: 'the private key text'
};
wssh.connect(opts);
2018-09-01 03:20:31 +00:00
// without an argument, wssh will use the form data to connect
wssh.connect();
// set a new encoding for client to use
wssh.set_encoding(encoding);
// reset encoding to use the default one
wssh.reset_encoding();
2018-08-29 15:12:21 +00:00
// send a command to the server
wssh.send('ls -l');
```
2019-06-22 06:09:04 +00:00
### Custom Font
Custom font family usage example:
```html
<style>
@font-face {
font-family: 'font-name';
src: url('static/css/fonts/your-favorite-font');
}
body {
font-family: 'font-name';
}
</style>
```
2019-05-18 06:27:14 +00:00
### URL Arguments
2019-05-22 13:37:05 +00:00
Support passing arguments by url (query or fragment) like following examples:
2019-05-18 06:27:14 +00:00
Passing form data
```bash
http://localhost:8888/?hostname=xx&username=yy
```
Passing a terminal background color
```bash
http://localhost:8888/#bgcolor=green
```
Passing a user defined title
```bash
2019-05-19 12:19:51 +00:00
http://localhost:8888/?title=my-ssh-server
```
Passing an encoding
```bash
http://localhost:8888/#encoding=gbk
2019-05-18 06:27:14 +00:00
```
2019-04-18 11:54:20 +00:00
### Use Docker
Start up the app
```
docker-compose up
```
Tear down the app
```
docker-compose down
```
2018-08-20 15:09:09 +00:00
### Tests
2018-08-20 15:33:17 +00:00
Use unittest to run all tests
2018-08-20 15:09:09 +00:00
```
python -m unittest discover tests
```
2018-08-20 15:33:17 +00:00
Use pytest to run all tests
2018-08-20 15:09:09 +00:00
```
python -m pytest tests
```
2018-10-22 13:51:51 +00:00
### Deployment
2017-11-08 14:59:53 +00:00
2018-10-22 13:51:51 +00:00
Running behind an Nginx server
```bash
wssh --address='127.0.0.1' --port=8888 --policy=reject
```
2018-08-29 15:12:21 +00:00
```nginx
2018-10-22 13:51:51 +00:00
# Nginx config example
2018-04-22 12:10:11 +00:00
location / {
2017-11-09 03:51:15 +00:00
proxy_pass http://127.0.0.1:8888;
proxy_http_version 1.1;
proxy_read_timeout 300;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
2018-03-06 05:47:47 +00:00
proxy_set_header Host $http_host;
2017-11-20 10:05:36 +00:00
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
2018-04-22 12:10:11 +00:00
}
2017-11-09 08:41:05 +00:00
```
2018-10-22 13:51:51 +00:00
Running as a standalone server
```bash
2018-10-23 06:10:10 +00:00
wssh --port=8080 --sslport=4433 --certfile='cert.crt' --keyfile='cert.key' --xheaders=False --policy=reject
2018-10-22 13:51:51 +00:00
```
2019-05-19 12:19:51 +00:00
### Tips
2018-08-20 15:09:09 +00:00
2018-10-22 13:51:51 +00:00
* For whatever deployment choice you choose, don't forget to enable SSL.
2018-12-15 13:40:16 +00:00
* By default plain http requests from a public network will be either redirected or blocked and being redirected takes precedence over being blocked.
2018-10-23 06:10:10 +00:00
* Try to use reject policy as the missing host key policy along with your verified known_hosts, this will prevent man-in-the-middle attacks. The idea is that it checks the system host keys file("~/.ssh/known_hosts") and the application host keys file("./known_hosts") in order, if the ssh server's hostname is not found or the key is not matched, the connection will be aborted.