Shellinabox 使用指南:基于 Web 的终端模拟器

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 登录界面

  1. 输入系统用户名(注意:root 用户默认被禁止登录
  2. 输入密码
  3. 成功进入 Shell 环境

安全提示 :如需 root 权限,请先使用普通用户登录,再执行 su -sudo -i 切换。

9.3 右键菜单功能

在终端空白处右键点击,可访问以下功能:

  • 样式切换:黑白主题、彩色终端、单色模式
  • 字体调整:增大/减小字体
  • 传输模式:SSL/明文切换(如未禁用)
  • 复制粘贴:支持浏览器标准快捷键

十、故障排查

问题现象 可能原因 解决方案
无法启动,提示端口占用 4200 端口被占用 修改配置文件更换端口
证书错误,无法 HTTPS 访问 证书不存在或格式错误 检查 /var/lib/shellinabox/certificate.pem
root 无法登录 安全限制 使用普通用户登录后切换
中文显示乱码 浏览器编码或系统 locale 设置 LANG=zh_CN.UTF-8
无法复制粘贴大段文本 浏览器安全限制 分批次粘贴或使用文本编辑器

十一、安全建议

  1. 修改默认端口:避免使用 4200,改用随机高位端口
  2. 强制 HTTPS :不要长期使用 -t 禁用 SSL
  3. 配合反向代理:使用 Nginx/Apache 提供额外的访问控制和日志
  4. 限制登录用户:禁止 root,使用普通用户 + sudo
  5. IP 白名单:通过防火墙限制访问来源
  6. 定期更新:关注 GitHub 仓库获取安全更新

十二、总结

Shellinabox 是一款轻量级、易部署的 Web 终端解决方案,特别适合以下场景:

  • 防火墙限制仅允许 HTTP/HTTPS 流量的环境
  • 临时需要 SSH 访问但无法安装客户端的公共电脑
  • 嵌入式设备或 IoT 设备的远程管理
  • 快速构建基于浏览器的运维平台

虽然功能不如现代 Web SSH 工具(如 ttyd、Wetty)丰富,但其稳定性和低资源占用使其在特定场景下仍有不可替代的价值。

相关推荐
kyle~2 小时前
机器人感知---工业相机硬触发、时间戳同步( PTP)与 ROS2 驱动时间戳设计
linux·c++·机器人·ros2
小则又沐风a2 小时前
深入理解进程概念 第三章 进程调度切换
java·linux·服务器·前端
ZC跨境爬虫2 小时前
跟着 MDN 学 HTML day_63:(Web 中矢量图形的完整指南)
前端·javascript·数据库·ui·html
爱怪笑的小杰杰2 小时前
Leaflet 实现轨迹拐角自动圆弧化:基于球面几何的高精度平滑算法
前端·javascript·算法·无人机
恋猫de小郭2 小时前
2026 Google I/O ,意料之外的 Antigravity 2.0 和消失的 Gemini CLI
前端·人工智能·ai编程
z202305082 小时前
RDMA之路由算法介绍 (6)
linux·服务器·网络·人工智能·ai
楼兰公子2 小时前
# RK3588 Linux 驱动开发完整学习指南RK3588_Linux_Driver_Development.md
linux·驱动开发
光电笑映2 小时前
Linux 文件 IO:从概念到系统调用
linux·运维·服务器
历程里程碑3 小时前
53 多路转接select
linux·开发语言·数据结构·数据库·c++·sql·排序算法