• Stars
    star
    2,940
  • Rank 15,407 (Top 0.4 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created almost 14 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

jQuery Terminal Emulator - JavaScript library for creating web-based terminals with custom commands

ASCII Art that represent text jQuery Terminal - JavaScript Library for Web Based Terminal Emulators

JavaScript Library for Web Based Terminal Emulators

npm bower Build and test Coverage Status NPM Downloads jsDelivr Downloads Paid Support LICENSE MIT

Summary

jQuery Terminal Emulator is a plugin for creating command line interpreters in your applications. It can automatically call JSON-RPC service when a user types commands or you can provide your own function in which you can parse user commands. It's ideal if you want to provide additional functionality for power users. It can also be used to debug your application.

You can use this JavaScript library to create a web based terminal on any website.

Because with this library you need to code all the commands yourself, you can call it fake terminal emulator. In contrast to library that will give you access to real terminal like online SSH. To have real online SSH I suggest to use xterm.js library.

Features:

  • You can create an interpreter for your JSON-RPC service with one line of code (just use url as first argument).

  • Support for authentication (you can provide functions when users enter login and password or if you use JSON-RPC it can automatically call login function on the server and pass token to all functions).

  • Stack of interpreters - you can create commands that trigger additional interpreters (eg. you can use couple of JSON-RPC service and run them when user type command)

  • Command Tree - you can use nested objects. Each command will invoke a function (own REPL), if the value is an object it will create a new interpreter and use the function from that object as commands. You can use as many nested object/commands as you like. If the value is a string it will create JSON-RPC service.

  • Support for command line history, it uses Local Storage if possible.

  • Support for tab completion.

  • Includes keyboard shortcut from bash like CTRL+A, CTRL+D, CTRL+E etc.

  • Bash reverse history search (CTRL+R / CTRL+G).

  • You can create and overwrite existing keyboard shortcuts.

  • Multiple terminals on one page (every terminal can have different commands, its own authentication function and its own command history).

  • It catches all exceptions and displays error messages in the terminal (you can see errors in your javascript and php code in terminal if they are in the interpreter function).

  • Using extended commands you can change working of the terminal without touching the front-end code (using echo method and terminal formatting like syntax). Read more in docs.

  • Easy way to change the style of the terminal (like color or cursor animation).

  • Chinese and Japanese character support.

  • You can use ASCII forms and collect information from users.

  • Animation (including typing effect and Canvas canvas adapter).

  • Support ANSI escapes codes.

  • Experimental mobile support, see open issues

Demo

You can test current version at this URL:

or if it doesn't use latest version (because of jsDelivr cache) you can force it with this URL:

And development version using:

You can use any version you want, everything what jsDelivr GH API accepts.

Installation

Include jQuery library, you can use cdn from https://jquery.com/download/

or use jsDelivr:

<script src="https://cdn.jsdelivr.net/npm/jquery"></script>

Then include js/jquery.terminal-2.37.1.min.js and css/jquery.terminal-2.37.1.min.css

You can grab the files from CDN:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.terminal/2.37.1/js/jquery.terminal.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/jquery.terminal/2.37.1/css/jquery.terminal.min.css" rel="stylesheet"/>

or

<script src="https://cdn.jsdelivr.net/npm/[email protected]/js/jquery.terminal.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/css/jquery.terminal.min.css">

If you always want latest version, you can get it from unpkg without specifying version, it will redirect to the latest ones:

<script src="https://unpkg.com/jquery.terminal/js/jquery.terminal.min.js"></script>
<link href="https://unpkg.com/jquery.terminal/css/jquery.terminal.min.css" rel="stylesheet"/>

Bleeding Edge Version

If you want to test bleeding edge, development version of jQuery Terminal. You can use those files:

<script src="https://cdn.jsdelivr.net/gh/jcubic/jquery.terminal@devel/js/jquery.terminal.min.js"></script>
<link href="https://cdn.jsdelivr.net/gh/jcubic/jquery.terminal@devel/css/jquery.terminal.min.css" rel="stylesheet"/>

but it's not refreshed as fast as rawgit was, because it's CDN and need to be propagated to different servers.

Keyboard key polyfill

NOTE: From version 1.0.0 if you want to support old browsers then you'll need to use key event property polyfill. You can check the support for it on can I use.

<script src="https://unpkg.com/[email protected]/keyboard.js"></script>

Command Line

You can also install jQuery Terminal using command line, from bower repository:

bower install jquery.terminal

or npm registry:

npm install jquery.terminal

Example of usage

This is code that uses low level function, that gives you full control of the commands, just pass anything that the user types into a function.

jQuery(function($, undefined) {
    $('#term_demo').terminal(function(command) {
        if (command !== '') {
            var result = window.eval(command);
            if (result != undefined) {
                this.echo(String(result));
            }
        }
    }, {
        greetings: 'Javascript Interpreter',
        name: 'js_demo',
        height: 200,
        width: 450,
        prompt: 'js> '
    });
});

Here is a higher level call, using an object as an interpreter, By default the terminal will parse commands that a user types and replace number like strings with real numbers regex with regexes and process escape characters in double quoted strings.

jQuery(function($, undefined) {
    $('#term_demo').terminal({
        add: function(a, b) {
            this.echo(a + b);
        },
        re: function(re, str) {
           if (re instanceof RegExp && re.test(str)) {
              this.echo(str + ' [[;green;]match]');
           }
        },
        foo: 'foo.php',
        bar: {
            sub: function(a, b) {
                this.echo(a - b);
            }
        }
    }, {
        height: 200,
        width: 450,
        prompt: 'demo> '
    });
});

command add 2 2 will display 4 (not 22).

Command foo will change prompt to foo> and each new command will execute json-rpc method from foo.php script.

command bar will change the prompt to bar> and if you type sub 10 2 it will display 8. To exit from bar nested command you can type exit or press CTRL+D.

command re /^foo/ foo-bar will echo: "foo-bar match" where "match" will be green.

By default arguments are required but you can disable the check like this:

jQuery(function($, undefined) {
    $('#term_demo').terminal({
        add: function(...args) {
            this.echo(args.reduce((a,b) => a + b));
        }
    }, {
       checkArity: false
    });
});

And add command will accept any number of argments and it will sum them up (if they are numbers).

You can create JSON-RPC interpreter with authentication in just one line:

$('#term_demo').terminal('service.php', {login: true});

The rest of the code can be on the server, so you can write fully working application, without any front-end, that can be tested in browser.

First argument to terminal can also be array with objects strings and functions, with one requirement, that only one function can be used as last fallback for commands that was not found in RPC or in objects.

jQuery(function($, undefined) {
    $('#term_demo').terminal([{
        add: function(...args) {
            this.echo(args.reduce((a,b) => a + b));
        }
    } 'foo.php', function(command) {
       this.echo("You've typed " + command, {formatters: false, exec: false});
    }], {
       checkArity: false
    });
});

More examples here. You can also check Full Documentation or Getting Started Guide on Wiki.

Quick Start Tutorials

If you want to start with jQuery Terminal you can look at those tutorials:

Security

Because of security in version 1.20.0 links with protocols different than ftp or http(s) (it was possible to enter javascript protocol, that could lead to XSS if author of the app echo user input and save it in DB) was turn off by default. To enable it, you need to use anyLinks: true option.

In version 1.21.0 executing terminal methods using extendend commands [[ terminal::clear() ]] was also disabled by default because attacker (depending on your application) could execute terminal::echo with raw option to enter any html and execute any javascript. To enable this feature from this version you need to use invokeMethods: true option.

The features are safe to enable, if you don't save user input in DB and don't echo it back to different users (like with chat application). It's also safe if you escape formatting before you echo stuff.

If you don't save user input in DB but allow to echo back what user types and have enabled execHash options, you may have reflected XSS vulnerability if you enable this features. If you escape formatting this options are also safe.

NOTE: To disable exec if you have execHash (or echo stuff from users with invokeMethods: true), you can also set option {exec: false} to your echo call and use it only when you get values from server (not from DB indireclty from users). If you do this you will be able to echo stuff from users and execute terminal methods from server (this feature is mostly done just for that).

Contributors

If you want to contribute read CONTRIBUTING.md first. Here are project contributors:


Jakub T. Jankiewicz

commits

Hood Chatham

commits

Jean-Michel Carrel

commits

kid1412z

commits

Marcel Link

commits

Sébastien Warin

commits

Christopher John Ryan

commits

Johan

commits

Snyk bot

commits

Florian Schäfer

commits

David Refoua

commits

Ishan Ratnapala

commits

Qijia Liu

commits

Tomasz Ducin

commits

7twin

commits

Abdelrahman Omran

commits

Anton Vasil'ev

commits

Ezinne Anne Emilia

commits

finlob

commits

Hasan

commits

Hraban Luyat

commits

Jarry Shaw

commits

Jon Steinich

commits

Martin v. Löwis

commits

Mateusz Paprocki

commits

exit1

commits

Robert W

commits

Steve Phillips

commits

Yutong Luo

commits

coderaiser

commits

Dev Kumar Gupta

commits

stereobooster

commits

Steve Kirkegard

commits

youurayy

commits

jQuery Terminal Website contributors:


Jakub T. Jankiewicz

commits

Ezinne Anne Emilia

commits

Marc Laporte

commits

Rich Morin

commits

4s3ti

commits

DInesh51297

commits

Logan Rosen

commits

Acknowledge

Projects include with the source code:

Other code used inside the project or inspired by:

Personal thanks:

Also thanks to:

BrowserStack

for cross-device testing opportunity.

Paid Support

You can request paid support, you can find details at support.jcubic.pl.

License

Licensed under MIT license

Copyright (c) 2011-2023 Jakub T. Jankiewicz

More Repositories

1

sysend.js

Web application synchronization between different tabs
JavaScript
1,025
star
2

wayne

Service Worker Routing library for in browser HTTP requests
JavaScript
547
star
3

lips

Scheme based powerful lisp interpreter written in JavaScript
JavaScript
323
star
4

chat-gpt

ChatGPT conversation saving bookmark
JavaScript
291
star
5

tagger

Zero Dependency, Vanilla JavaScript Tag Editor
JavaScript
261
star
6

jquery.splitter

jQuery Splitter is plugin that split your content with movable splitter between them
JavaScript
240
star
7

gaiman

Gaiman: Text based game engine and programming language
JavaScript
137
star
8

leash

Browser Shell
JavaScript
120
star
9

jquery.rotate

Simple plugin that add rotate css property and animation
JavaScript
94
star
10

git

GIT Web Terminal
JavaScript
82
star
11

Clarity

Customizable Monoshape Vector Icon Theme for GTK+
SVG
39
star
12

jquery.filebrowser

File browser jQuery plugin
JavaScript
30
star
13

jquery.terminal-www

jQuery Terminal Website
HTML
26
star
14

favloader

Vanilla JavaScript library for loading animation in favicon
JavaScript
23
star
15

cmatrix

Render Matrix effect animation on Canvas in JavaScript
JavaScript
22
star
16

lily

Simple JavaScript options parser inspired by yargs
JavaScript
21
star
17

jsh.php

Terminal like php shell (PHP web terminal emulator)
PHP
20
star
18

jsvi

fork of JSVI - VI in JavaScript
JavaScript
18
star
19

Monadic

JavaScript micro library - POC
JavaScript
16
star
20

fake-linux-terminal

Fake GNU/Linux, Unix, MacOS terminal based system
HTML
15
star
21

json-rpc

JSON-RPC implementaion in php and JavaScript
PHP
13
star
22

electron-terminal

Base for jQuery Terminal based Electron apps
JavaScript
12
star
23

route.js

Simple routing library that can be use on the server or in the browser
JavaScript
11
star
24

jquery.micro

Pico/Nano like editor for jquery.
JavaScript
11
star
25

coverage.el

Emacs minor mode for displaying code coverage
Emacs Lisp
10
star
26

chat

Simple Chat with Server Side Events, PHP and SQLite
PHP
8
star
27

prism-cli

Syntax highlighting for command line
JavaScript
7
star
28

try-python

Try Python website
Python
7
star
29

commodore64

Commodore 64 jQuery Terminal Demo
HTML
7
star
30

ascii-canvas

String based text rendering for Node and Browser
JavaScript
6
star
31

jquery.resize

Custom resize jQuery event for element
JavaScript
6
star
32

notes

Simple text based notes taking app
JavaScript
6
star
33

webrtc-share

Application for sharing files using WebRTC
PHP
6
star
34

jcubic.pl

Głównie JavaScript - blog głównie o Front-Endzie
PHP
5
star
35

awesome-ascii

List of Awesome ASCII libraries
5
star
36

ansidec

Unix formatting transformer in JavaScript
JavaScript
5
star
37

firepad

Simple firepad based source code editor
HTML
5
star
38

quizerach

Simple Quiz Maker Open Source App (WIP)
TypeScript
4
star
39

calendar

ASCII calendar that can be used in Node.js or Browser
JavaScript
4
star
40

angular.piechart

Angular 1.5 component for svg based piecharts
JavaScript
4
star
41

velvet

Vanilla JavaScript Universal CSS in JS library
TypeScript
4
star
42

jcubic

3
star
43

chess

Terminal based chess game
HTML
3
star
44

snapp

Simple Text based notes taking app
PHP
3
star
45

open-source-library

Template for JavaScript Open Source library
Makefile
3
star
46

ToME

ToME - Tales of Middle Earth
C
3
star
47

leash-cordova

Cordova leash shell
JavaScript
3
star
48

filter-paste-js

intercept content pasting into iframe with design mode
JavaScript
3
star
49

fs-browser

In Browser File System App
JavaScript
3
star
50

jquery-position-event

jQuery cursor position change event
JavaScript
2
star
51

isomorphic-lolcat

Lolcat gradient that can be used in browser or Node
JavaScript
2
star
52

react-wayne-auth

JavaScript
2
star
53

koduj-curriculum

Curriculum for teaching programming using JavaScript and p5.js library
2
star
54

dotfiles

Linux dotfiles
Shell
2
star
55

cataloger

Shopping cart like catalog library
JavaScript
2
star
56

json-rpc-list

List of JSON-RPC implementations
2
star
57

compickr

Flickr composition checker
JavaScript
2
star
58

jankiewicz

Personal Blog of Jakub T. Jankiewicz
Liquid
2
star
59

aimed

Simple JavaScript Markdown Editor
JavaScript
2
star
60

yapp

Yet Another PHP Proxy
JavaScript
2
star
61

kopalinski.sqlite

Słownik Wyrazów Obcych Kopalińskiego jako baza sqlite
Python
2
star
62

koduj

P5.js playground
PHP
2
star
63

static

static files used with cdn.jsdelivr.net
JavaScript
2
star
64

opensourcelogo

Logo for you Open Source project
2
star
65

price.py

Scraping prices from Ceneo.pl and save in SQLite database
Python
1
star
66

php-terminal-jwt

Demo of JWT with jQuery Terminal
PHP
1
star
67

refClass

R
1
star
68

jquery.draglessClick

Better jQuery click event that's not invoked when you drag or select text
JavaScript
1
star
69

swift.manager

Server file browser and terminal with apps support
JavaScript
1
star
70

bassel.jcubic.pl

Bassel badge page
PHP
1
star
71

roman

ReactJS application with unit tests
TypeScript
1
star
72

REPL

REPL Bookmarklets for different languages
1
star
73

Similar-Stuff

Get Similar stuff from tastekid.com
Python
1
star
74

expression.php

Safely evaluate math, string, and boolean expressions
PHP
1
star
75

cv

My resume
Makefile
1
star
76

quatro

Simple Q&A Open Source application in PHP
PHP
1
star
77

interactive-scheme-tutorial

Interactive Scheme Tutorial
HTML
1
star
78

Downloader

Command Line tool for download file from file hosting sites.
Ruby
1
star
79

gps.py

Simple script to add GPS EXIF data to images
Python
1
star
80

flash-3d

School project 3D Flash animation in C++
C
1
star
81

FizzBuzz

JavaScript version of function only FizzBuzz
JavaScript
1
star
82

uncp

UNsplash Cache Proxy
PHP
1
star
83

jsvi-app

jsvi app for leash shell
JavaScript
1
star
84

bash

Bash Interpreter written in JavaScript
1
star