jQuery Terminal Emulator is a plugin for creating command line interpreters in your applications.
npm install jquery.terminalJavaScript Library for Web Based Terminal Emulators

!bower


!NPM Downloads



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.
* 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
You can test current version at this URL:
* https://jcubic.github.io/jquery.terminal/
or if it doesn't use latest version (because of jsDelivr cache) you can force it with this URL:
* https://jcubic.github.io/jquery.terminal/?ver=2.45.2
And development version using:
* https://jcubic.github.io/jquery.terminal/?ver=devel
You can use any version you want, everything what jsDelivr GH API accepts.
Include jQuery library, you can use cdn from https://jquery.com/download/
or use jsDelivr:
``html
`
Then include js/jquery.terminal-2.45.2.min.js and css/jquery.terminal-2.45.2.min.css
You can grab the files from CDN:
`html`
or
`html`
If you always want latest version, you can get it from unpkg without specifying version,
it will redirect to the latest ones:
`html`
or jsDelivr that is bit faster:
`html`
#### Bleeding Edge Version
If you want to test bleeding edge, development version of jQuery Terminal. You can use those files:
`html`
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.
`html`
or
`html`
#### 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
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.
`javascript`
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.
`javascript
$('body').terminal({
cat: function(width = 200, height = 300) {
return $();`
},
title: function() {
return fetch('https://terminal.jcubic.pl')
.then(r => r.text())
.then(html => html.match(/
}
}, {
checkArity: false,
greetings: 'My Terminal\n'
});
And more advanced example:
`javascript`
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.exit
To exit from bar nested command you can type 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:
`javascript`
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:
`javascript`
$('#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.
`javascript`
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.
If you want to start with jQuery Terminal you can look at those tutorials:
* How to create interactive terminal like website? (beginner level)
* How to Create an Interactive Terminal-Based Portfolio (intermediate level)
The first tutorial is have all the basics, even if you're new to programming and JavaScript. The
second one explain everything but it assume that you know the basics. If you pick the second and and
stuck you can reference the first one. It's worth checking the first one anyway.
TL;DR: You can also use this Terminal Website Template.
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() ]] wasterminal::echo
also disabled by default because attacker (depending on your application) could execute with raw option to enter any html and execute any javascript. To enable thisinvokeMethods: true
feature from this version you need to use 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),{exec: false}
you can also set option 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).
If you want to contribute read CONTRIBUTING.md first. Here are project contributors:
|
Jakub T. Jankiewicz
commits |
Riccardo Mura
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 |
Tomasz Ducin
commits |
Qijia Liu
commits |
Ishan Ratnapala
commits |
David Refoua
commits |
|
Antoine
commits |
youurayy
commits |
Steve Kirkegard
commits |
stereobooster
commits |
Dev Kumar Gupta
commits | [
dependabot[bot]](https://github.com/dependabot[bot])
commits |
coderaiser
commits |
|
Yutong Luo
commits |
Steve Phillips
commits |
Robert W
commits |
exit1
commits |
Mateusz Paprocki
commits |
Martin v. Löwis
commits |
KiddoV
commits |
|
Jon Steinich
commits |
John Jarvis
commits |
Jarry Shaw
commits |
jpaye
commits |
Hraban
commits |
Hasan
commits |
finlob
commits |
|
Ezinne Anne Emilia
commits |
Anton Vasilev
commits |
Abdelrahman Omran
commits |
7twin
commits |
jQuery Terminal Website contributors:
|
Jakub T. Jankiewicz
commits |
Ezinne Anne Emilia
commits |
Marc Laporte
commits |
Rich Morin
commits |
Carlos Colaço
commits |
DInesh51297
commits |
David
commits |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
|
Logan Rosen
commits |
Projects include with the source code:
* Storage plugin by Dave Schindler (MIT)
* jQuery Timers (WTFPL)
* Cross-Browser Split by Steven Levithan (MIT)
* jQuery Caret by Gideon Sireling (3-BSD)
* sprintf.js by Alexandru Mărășteanu (3-BSD)
* node-ansiparser by Joerg Breitbart (MIT)
* emoji regex by Mathias Bynens (MIT)
Other code used inside the project or inspired by:
* How to detect iPad and iPad OS version in iOS 13 and Up? (StackOverflow)
* How do I scroll to an element within an overflowed Div? (StackOverflow)
* isInViewport by Mudit Ameta (MIT)
* Detecting and generating CSS animations in JavaScript by Chris Heilmann
* polyfill for KeyboardEvent.prototype.key` by Christopher Robert Van Wiemeersch (CC0)
* wheel event detection by MDN
* CodeMirror by Marijn Haverbeke, was inspiration for some clipboard handling solutions.
ASNSI Art used by this project
* Dennis Ritchie by SanderFocus
* Regina Pacis by burps
* marble by Necrofiliac
Personal thanks:
* T.J. Crowder for helping with tracking_replace on StackOveflow
* @jerch for helping with ANSI Parsing
* @cviejo for ASCII table algorithm fix
Also thanks to:

for cross-device testing opportunity.

Licensed under MIT license
Copyright (c) 2010-2025 Jakub T. Jankiewicz