Shellinabox(发音 "shell-in-a-box")是由 Markus Gutschke 开发的一款开源、基于 Web 的 AJAX 终端模拟器。它内置了一个 Web 服务器,通过浏览器即可提供原生 Shell 的外观和体验,无需安装任何客户端插件,只需一个支持 JavaScript 和 CSS 的现代浏览器即可访问远程服务器的终端。
一、核心特性
- 零客户端依赖:无需安装 PuTTY、OpenSSH 等工具,纯浏览器访问
- SSL/TLS 加密:默认启用 HTTPS,支持自签名或可信证书
- 防火墙友好:仅需开放一个 HTTP/HTTPS 端口,适合只允许 Web 流量的环境
- VT100 模拟器:完整的终端仿真,支持颜色、自动补全、复制粘贴等
- 多服务支持:可配置多个服务路径,如 SSH 代理、本地 Shell、自定义命令等
- 安全限制:默认禁止 root 登录,需通过普通用户切换,增强安全性
二、安装指南
2.1 Debian / Ubuntu 系统
bash
# 直接通过官方仓库安装
sudo apt-get update
sudo apt-get install -y shellinabox
# 查看安装文件清单
dpkg -L shellinabox
2.2 RHEL / CentOS / Fedora 系统
bash
# 安装 EPEL 源(CentOS/RHEL 需要)
sudo yum install -y epel-release
# 安装 shellinabox 及 OpenSSL 依赖
sudo yum install -y openssl shellinabox
2.3 源码编译安装(通用)
适用于需要最新特性或自定义编译选项的场景:
bash
# 安装编译依赖
# Debian/Ubuntu:
sudo apt-get install -y git libssl-dev libpam0g-dev zlib1g-dev dh-autoreconf
# RHEL/CentOS:
sudo yum install -y git openssl-devel pam-devel zlib-devel autoconf automake libtool
# 克隆源码并编译
git clone https://github.com/shellinabox/shellinabox.git
cd shellinabox
autoreconf -i
./configure --prefix=/usr/local/shellinabox
make && sudo make install
三、配置文件详解
3.1 配置文件位置
| 系统 | 配置文件路径 |
|---|---|
| Debian/Ubuntu | /etc/default/shellinabox |
| RHEL/CentOS/Fedora | /etc/sysconfig/shellinaboxd |
3.2 配置示例(CentOS/RHEL)
编辑 /etc/sysconfig/shellinaboxd:
bash
# Shell in a box daemon configuration
# For details see shellinaboxd man page
# 是否自动启动
SHELLINABOX_DAEMON_START=1
# 监听端口(默认 4200,建议修改为随机端口增强安全性)
PORT=6175
# 运行用户和组
USER=shellinabox
GROUP=shellinabox
# 证书目录
CERTDIR=/var/lib/shellinabox
# 核心参数配置
# --no-beep: 禁用蜂鸣声(避免浏览器插件崩溃)
# --disable-ssl-menu: 禁止用户切换传输模式
# -s /:SSH:IP: 指定后端 SSH 服务器地址
OPTS="--no-beep --disable-ssl-menu -s /:SSH:192.168.1.100"
# 仅允许本地访问(配合反向代理使用)
# OPTS="-s /:SSH:192.168.1.100 --localhost-only"
# 禁用 SSL(仅在内网或已配置反向代理 SSL 时使用)
# OPTS="-t -s /:SSH:192.168.1.100"
3.3 配置示例(Debian/Ubuntu)
编辑 /etc/default/shellinabox:
bash
SHELLINABOX_PORT=8888
SHELLINABOX_ARGS="--no-beep -s /:SSH:10.1.10.117"
四、命令行参数全解
以下是 shellinaboxd -h 输出的完整参数说明及实用解析:
text
Usage: shellinaboxd [OPTIONS]...
Starts an HTTP server that serves terminal emulators to AJAX enabled browsers.
List of command line options:
-b, --background[=PIDFILE] run in background
后台运行,可指定 PID 文件路径
-c, --cert=CERTDIR set certificate dir (default: $PWD)
设置 SSL 证书目录,默认当前目录
--cert-fd=FD set certificate file from fd
从文件描述符读取证书
--css=FILE attach contents to CSS style sheet
附加自定义 CSS 样式文件
--cgi[=PORTMIN-PORTMAX] run as CGI
以 CGI 模式运行,可指定端口范围
-d, --debug enable debug mode
启用调试模式,输出详细日志
-f, --static-file=URL:FILE serve static file from URL path
提供静态文件服务,如 -f favicon.ico:/path/to/icon.ico
-g, --group=GID switch to this group (default: nogroup)
切换到指定用户组运行
-h, --help print this message
显示帮助信息
--linkify=[none|normal|aggressive] default is "normal"
URL 链接识别模式:none(不识别)|normal(默认)|aggressive(激进)
--localhost-only only listen on 127.0.0.1
仅监听本地地址,配合反向代理使用
--no-beep suppress all audio output
禁用所有音频输出(推荐,避免浏览器崩溃)
-n, --numeric do not resolve hostnames
不解析主机名,使用 IP 地址
-m, --messages-origin=ORIGIN allow iframe message passing from origin
允许来自指定来源的 iframe 消息传递
--pidfile=PIDFILE publish pid of daemon process
将守护进程 PID 写入指定文件
-p, --port=PORT select a port (default: 4200)
指定监听端口,默认 4200
-s, --service=SERVICE define one or more services
定义服务,格式:URL:USER:GROUP:HOME:COMMAND
-t, --disable-ssl disable transparent SSL support
禁用 SSL,使用纯 HTTP
--disable-ssl-menu disallow changing transport mode
禁止用户在菜单中切换 SSL/明文模式
--disable-utmp-logging disable logging to utmp and wtmp
禁用 utmp/wtmp 登录记录
-q, --quiet turn off all messages
静默模式,关闭所有输出
--unixdomain-only=PATH:USER:GROUP:CHMOD listen on unix socket
仅监听 Unix 域套接字
-u, --user=UID switch to this user (default: nobody)
切换到指定用户运行
--user-css=STYLES defines user-selectable CSS options
定义用户可选的 CSS 主题
-v, --verbose enable logging messages
启用详细日志记录(Apache 风格)
--version prints version information
打印版本信息
--disable-peer-check disable peer check on a session
禁用会话对等检查
五、常用启动配置示例
5.1 基础启动
bash
# 后台运行,使用 /tmp 目录下的证书,默认端口 4200
shellinaboxd -b -c /tmp
# 指定端口 8080
shellinaboxd -b -c /tmp -p 8080
# 前台调试模式
shellinaboxd -d -p 8080
5.2 SSH 代理模式
bash
# 代理连接到远程 SSH 服务器(HTTPS)
shellinaboxd -b -s /:SSH:192.168.1.100
# 禁用 SSL,纯 HTTP 代理(内网使用)
shellinaboxd -t -b -s /:SSH:192.168.1.100
# 多服务配置:根路径登录本地,/who 路径显示在线用户
shellinaboxd -t -s /:LOGIN -s /who:nobody:nogroup:/:w
5.3 本地 Shell 模式
bash
# 绑定本地 bash(需 root 权限)
shellinaboxd -d -s /terminal1/:user:group:/home/user:/bin/bash
# 标准本地登录(使用系统 login 程序)
shellinaboxd -b -s /:LOGIN
5.4 主题与样式
bash
# 黑白主题,禁用 SSL 菜单,后台安静运行
shellinaboxd -t -b -q --css=shellinabox/white-on-black.css
# 提供用户可选主题(右键菜单切换)
shellinaboxd --user-css "Normal:+black-on-white.css,Reverse:-white-on-black.css" -s /:LOGIN
5.5 安全加固配置
bash
# 仅本地监听 + 禁用 SSL(配合 Nginx/Apache 反向代理)
shellinaboxd --localhost-only --disable-ssl -b -t --no-beep
# 禁用蜂鸣 + 禁止切换传输模式
shellinaboxd -b --no-beep --disable-ssl-menu -s /:SSH:192.168.1.100
六、SSL/TLS 证书配置
6.1 自动生成证书
Shellinabox 首次启动时会自动在证书目录生成自签名证书(/var/lib/shellinabox/certificate.pem),无需手动干预。
6.2 手动生成自签名证书
bash
# 创建证书目录
mkdir -p /var/lib/shellinabox
cd /var/lib/shellinabox
# 生成 x509 格式的 PEM 证书(公钥+私钥)
openssl req -new -x509 -nodes -out server.crt -keyout server.key -days 365 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyOrg/OU=IT/CN=your-server-ip"
# 合并为 shellinabox 所需的格式
cat server.crt server.key > certificate.pem
# 如果是域名访问,文件名需为 certificate-域名.pem
# 例如:cat server.crt server.key > certificate-example.com.pem
6.3 使用可信证书
将 Let's Encrypt 或其他 CA 签发的证书合并为 PEM 格式:
bash
cat your_domain.crt your_domain.key > /var/lib/shellinabox/certificate-yourdomain.pem
七、服务管理与防火墙
7.1 系统服务管理
bash
# 启动服务
sudo systemctl start shellinabox # systemd
sudo service shellinabox start # SysVinit
# 停止服务
sudo systemctl stop shellinabox
# 重启服务
sudo systemctl restart shellinabox
# 开机自启
sudo systemctl enable shellinabox
sudo chkconfig shellinaboxd on # CentOS 6
7.2 防火墙配置
bash
# firewalld (CentOS/RHEL 7+)
sudo firewall-cmd --permanent --add-port=4200/tcp
sudo firewall-cmd --reload
# 或指定自定义端口
sudo firewall-cmd --permanent --add-port=6175/tcp
sudo firewall-cmd --reload
# iptables (旧版系统)
sudo iptables -A INPUT -p tcp --dport 4200 -j ACCEPT
sudo service iptables save
八、反向代理配置
当需要通过域名访问或集成到现有 Web 服务时,建议配置反向代理。
8.1 Nginx 配置
nginx
server {
listen 443 ssl;
server_name shell.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://127.0.0.1:4200;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket 支持(如需要)
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
注意 :使用反向代理时,shellinabox 需添加 --localhost-only --disable-ssl 参数。
8.2 Apache 配置
apache
<Location /shell>
ProxyPass http://localhost:4200/
ProxyPassReverse http://localhost:4200/
Order allow,deny
Allow from all
</Location>
九、访问与使用
9.1 浏览器访问
https://your-server-ip:4200
首次访问时会提示证书不受信任(自签名证书),点击"高级" → "继续前往"即可。
9.2 登录界面
- 输入系统用户名(注意:root 用户默认被禁止登录)
- 输入密码
- 成功进入 Shell 环境
安全提示 :如需 root 权限,请先使用普通用户登录,再执行
su -或sudo -i切换。
9.3 右键菜单功能
在终端空白处右键点击,可访问以下功能:
- 样式切换:黑白主题、彩色终端、单色模式
- 字体调整:增大/减小字体
- 传输模式:SSL/明文切换(如未禁用)
- 复制粘贴:支持浏览器标准快捷键
十、故障排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 无法启动,提示端口占用 | 4200 端口被占用 | 修改配置文件更换端口 |
| 证书错误,无法 HTTPS 访问 | 证书不存在或格式错误 | 检查 /var/lib/shellinabox/certificate.pem |
| root 无法登录 | 安全限制 | 使用普通用户登录后切换 |
| 中文显示乱码 | 浏览器编码或系统 locale | 设置 LANG=zh_CN.UTF-8 |
| 无法复制粘贴大段文本 | 浏览器安全限制 | 分批次粘贴或使用文本编辑器 |
十一、安全建议
- 修改默认端口:避免使用 4200,改用随机高位端口
- 强制 HTTPS :不要长期使用
-t禁用 SSL - 配合反向代理:使用 Nginx/Apache 提供额外的访问控制和日志
- 限制登录用户:禁止 root,使用普通用户 + sudo
- IP 白名单:通过防火墙限制访问来源
- 定期更新:关注 GitHub 仓库获取安全更新
十二、总结
Shellinabox 是一款轻量级、易部署的 Web 终端解决方案,特别适合以下场景:
- 防火墙限制仅允许 HTTP/HTTPS 流量的环境
- 临时需要 SSH 访问但无法安装客户端的公共电脑
- 嵌入式设备或 IoT 设备的远程管理
- 快速构建基于浏览器的运维平台
虽然功能不如现代 Web SSH 工具(如 ttyd、Wetty)丰富,但其稳定性和低资源占用使其在特定场景下仍有不可替代的价值。