## WeTTy = Web + TTy [ ![Codeship Status for butlerx/wetty](https://app.codeship.com/projects/caf50220-f884-0135-63bd-5231a73eac2d/status?branch=master)](https://app.codeship.com/projects/278281) Terminal over HTTP and https. WeTTy is an alternative to ajaxterm and anyterm but much better than them because WeTTy uses xterm.js which is a full fledged implementation of terminal emulation written entirely in JavaScript. WeTTy uses websockets rather then Ajax and hence better response time. ![WeTTy](/terminal.png?raw=true) This fork was originally bug fixes and updates, but has since evolved in to a full rewrite to use xterm.js to have better support and make it more maintainable. ## Install WeTTy can be installed from source or from npm. To install from source run: ```bash $ git clone https://github.com/butlerx/wetty $ cd wetty $ yarn $ yarn build ``` or install it globally with yarn, `yarn -g add wetty.js`, or npm, `npm i -g wetty.js` ## Running WeTTy Wettu can either be run as a standalone service or from another node script. To see how to use WeTTy from node see the [API Doc](./docs) ```bash $ node index.js ``` Open your browser on `http://yourserver:3000/` and you will prompted to login. Or go too `http://yourserver:3000/ssh/` to specify the user before hand. ### Flags WeTTy can be run with the `--help` flag to get a full list of flags. WeTTy runs on port `3000` by default. You can change the default port by tunning with the `--port` or `-p` flag. If WeTTy is run as root while the host is set as the local machine it will use the `login` binary rather than ssh. If no host is specified it will use `localhost` as the ssh host. If instead you wish to connect to a remote host you can specify the host with the `--sshhost` flag and pass the IP or DNS address of the host you want to connect to. You can specify the default user used to ssh to a host using the `--sshuser`. This user can overwritten by going to `http://yourserver:3000/ssh/`. If this is left blank a user will be prompted to enter their username when they connect. By default WeTTy will try to ssh to port `22`, if your host uses an alternative ssh port this can be specified with the flag `--sshport`. ### https Always use https especially with a terminal to your server. You can add https by either using WeTTy behind a proxy or directly. If you don't have SSL certificates from a CA you can create a self signed certificate using this command: ```bash $ openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 30000 -nodes ``` To run WeTTy directly with ssl use both the `--sslkey` and `--sslcert` flags and pass them the path too your cert and key as follows: ```bash node index.js --sslkey key.pem --sslcert cert.pem -p 3000 ``` ### Behind a Proxy As said earlier you can use a proxy to add https to WeTTy. **Note** that if your proxy is configured for https you should run WeTTy without SSL #### Nginx Put the following configuration in nginx's conf: ```nginx location ^~ /wetty { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 43200000; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; } ``` For a more detailed look see the [nginx.conf](./bin/nginx.template) used for testing #### Apache Put the following configuration in apache's conf: ```apache RewriteCond %{REQUEST_URI} ^/wetty/socket.io [NC] RewriteCond %{QUERY_STRING} transport=websocket [NC] RewriteRule /wetty/socket.io/(.*) ws://localhost:3000/wetty/socket.io/$1 [P,L] DirectorySlash On Require all granted ProxyPassMatch http://127.0.0.1:3000 ProxyPassReverse /wetty/ ``` ### Dockerized Version WeTTy can be run from a container to ssh to a remote host or the host system. This is handy for quick deployments. Just modify `docker-compose.yml` for your host and run: ```sh $ docker-compose up -d ``` Visit the appropriate URL in your browser (`[localhost|$(boot2docker ip)]:PORT`). The default username is `term` and the password is `term`, if you did not modify `SSHHOST` In the docker version all flags can be accessed as environment variables such as `SSHHOST` or `SSHPORT`. ## Run WeTTy as a service daemon Install WeTTy globally with global option: ### init.d ```bash $ sudo yarn global add wetty.js $ sudo cp ~/.config/yarn/global/node_modules/wetty.js/bin/wetty.conf /etc/init $ sudo start wetty ``` ### systemd ```bash $ yarn global add wetty.js $ cp ~/.config/yarn/global/node_modules/wetty.js/bin/wetty.service ~/.config/systemd/user/ $ systemctl --user enable wetty $ systemctl --user start wetty ``` This will start WeTTy on port 3000. If you want to change the port or redirect stdout/stderr you should change the last line in `wetty.conf` file, something like this: ```systemd exec sudo -u root wetty -p 80 >> /var/log/wetty.log 2>&1 ``` ## FAQ ### What browsers are supported? WeTTy supports all browsers that [xterm.js supports](https://github.com/xtermjs/xterm.js#browser-support).