Python WebSSH:浏览器远程连接终端的终极指南
引言
通常情况下,你可以使用命令行应用程序或终端仿真软件中的SSH客户端来连接SSH服务器。然而,一些工具,例如Python的WebSSH,允许你通过SSH连接并直接在网页浏览器中运行终端。
这在许多场景下都非常实用。特别是在进行实时演示或教学时,如果以一种视觉上更直观的方式共享常规终端窗口具有挑战性,WebSSH将极大地提供便利。它还可以在教育环境中帮助命令行初学者轻松上手,因为这样可以避免他们在自己的计算机上安装软件(尤其是在默认选项带有注意事项的Windows系统上)。最后,值得一提的是,Python的WebSSH具有高度的可移植性,并且仅需Python即可运行,无需其他依赖项。相比之下,其他基于网络的终端解决方案可能更为复杂,并且通常特定于Linux系统。
在本教程中,你将学习如何安装WebSSH,并通过浏览器进行SSH连接。随后,你还可以选择使用SSL证书来确保连接安全,并将其部署在Nginx反向代理之后,以用于生产环境。
先决条件
- 一个运行着SSH服务的Windows、Mac或Linux环境。在本地运行WebSSH会很有用,但如果你的本地机器上没有运行SSH服务,你可以参考我们的Ubuntu 22.04初始服务器设置指南,使用远程Linux服务器。
- 已安装Python编程语言及其包管理器pip。你可以通过遵循本教程的第一步在Ubuntu上安装Python和pip。
- (可选)为了在浏览器中启用HTTPS,你需要SSL证书和自己的域名。你可以通过阅读《如何使用Certbot独立模式获取Let’s Encrypt SSL证书》来获取它们。如果你没有自己的域名,本教程的前两个步骤可以使用IP地址。
第一步 – 安装WebSSH
如果你已经安装了Python和pip,你应该能够从Python软件包索引(PyPI)安装Python包。WebSSH设计为直接从命令行安装和运行,因此你无需像《如何安装Python 3并设置编程环境》中所述那样设置另一个虚拟环境。虚拟环境在处理自己的项目时更有用,而不是在安装系统范围工具时。
使用pip install
命令安装WebSSH包:
- sudo pip3 install webssh
输出成功构建 webssh
正在安装收集到的软件包:tornado, pycparser, cffi, pynacl, paramiko, webssh
成功安装 cffi-1.15.1 paramiko-2.11.0 pycparser-2.21 pynacl-1.5.0 tornado-6.2 webssh-1.6.0
通过使用sudo
安装,wssh
命令将在全局范围内安装。你可以通过使用which wssh
来验证这一点。
- which wssh
输出/usr/local/bin/wssh
你现在已经安装了WebSSH。下一步,你需要运行并连接它。不过,在此之前,你需要添加一个防火墙规则。WebSSH默认运行在8888端口上。如果你使用ufw
作为防火墙,请通过ufw
允许该端口。
- sudo ufw allow 8888
在本教程中,你稍后会再次回顾那个防火墙规则。
第二步 – 运行并连接到WebSSH
如果你在本地机器上运行WebSSH,你可以直接运行wssh
,无需任何其他参数即可启动。如果你在远程服务器上运行WebSSH,则需要添加"--fbidhttp=False"
标志,以允许通过普通HTTP进行远程连接。如果你在一个不安全的网络上连接,这是不安全的,但对于演示非常有用,并且你将在本教程中稍后为WebSSH提供安全性。
- wssh --fbidhttp=False
现在你可以连接到WebSSH并登录。在Web浏览器中导航到your_domain:8888
(如果你在本地运行,请使用localhost
代替your_domain
)。你将看到WebSSH登录页面。

请提供你的常规SSH凭据。如果你遵循Silicon Cloud的初始服务器设置指南,你将使用基于密钥的身份验证,而不是密码。这意味着你只需要指定你正在连接的服务器的主机名、服务器的用户名以及你的SSH密钥。该密钥应该位于你本地主目录的.ssh/
文件夹中(通常命名为id_rsa
)。
注意
点击连接按钮,你应该会收到默认终端的欢迎提示:

在这一点上,你可以像使用SSH连接一样正常使用终端。多个用户也可以同时通过同一个WebSSH实例连接。如果你仅仅将WebSSH运行在本地机器上用于流媒体或捕获视频,这可能是你所需要的全部。你可以在启动WebSSH的终端(而非WebSSH终端)中输入Ctrl+C
来停止WebSSH服务器。
如果你在远程服务器上运行,你不应该在非安全的HTTP连接后面在生产环境中使用WebSSH。虽然你仍然受到SSH服务的身份验证机制的保护,但使用HTTP上的SSH连接存在重大安全风险,并可能使他人窃取你的SSH凭据。在接下来的步骤中,你将保护你的WebSSH实例,使其与常规的SSH连接一样安全。
第三步 -(可选)使用SSL证书保护WebSSH
要完成这一步,你应该已经获得了自己的域名和SSL证书。一种方法是使用独立模式通过Let’s Encrypt来完成。
当Let’s Encrypt检索证书时,默认情况下将其存储在/etc/letsencrypt/live/your_domain
。请确保你已经拥有这些证书。
- sudo ls /etc/letsencrypt/live/your_domain
输出README cert.pem chain.pem fullchain.pem privkey.pem
要在WebSSH中运行HTTPS支持,你需要提供证书的路径和密钥的路径。这些路径分别是fullchain.pem
和privkey.pem
。默认情况下,WebSSH在端口4433提供HTTPS访问,所以请确保在防火墙中打开该端口。
- sudo ufw allow 4433
接下来,你需要允许
然后,使用你的证书和密钥的路径来运行WebSSH。
- sudo wssh --certfile='/etc/letsencrypt/live/your_domain/fullchain.pem' --keyfile='/etc/letsencrypt/live/your_domain/privkey.pem'
在网络浏览器中导航至https://你的域名:4433
,你应该会看到与之前步骤相同的界面,但现在已支持HTTPS。这是一个足够安全的生产配置设置。然而,你仍然在从终端直接运行wssh应用,并且通过一个不同寻常的端口在浏览器中访问它。在本教程的最后两个步骤中,你将解除这两个限制。
步骤4 – (可选)在Nginx反向代理后面运行WebSSH
将像Nginx这样的网络服务器放在其他面向网络的应用程序之前,可以提高性能并使网站更加安全可靠。你将安装Nginx并配置它来反向代理用户对WebSSH的请求,这意味着它将负责处理用户对WebSSH的请求并将其返回给用户。
刷新你的软件包列表,然后使用apt安装Nginx。
- sudo apt update
- sudo apt install nginx
如果你正在使用ufw防火墙,此时你应该对防火墙配置做一些更改,以使80和443端口的默认HTTP/HTTPS访问可用。ufw有一个名为“Nginx Full”的默认配置,可以提供对这两个端口的访问。
- sudo ufw allow "Nginx Full"
Nginx允许您将每个站点的配置添加到名为sites-available/
的子目录中的单独文件中。使用nano或您最喜欢的文本编辑器,在/etc/nginx/sites-available/webssh
创建一个新的Nginx配置。
- sudo nano /etc/nginx/sites-available/webssh
将以下内容粘贴到新的配置文件中,确保将“your_domain”替换为你的域名。
/etc/nginx/sites-available/webssh
可以被改写为:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name your_domain www.your_domain;
root /var/www/html;
access_log /var/log/nginx/webssh.access.log;
error_log /var/log/nginx/webssh.error.log;
location / {
proxy_pass http://127.0.0.1:8888;
proxy_http_version 1.1;
proxy_read_timeout 300;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
}
listen 443 ssl;
# RSA certificate
ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
# Redirect non-https traffic to https
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
}
您可以将此配置划分为三个主要的“块”。第一个块位于location /
之前,包含了一个用于在默认的HTTP端口80上提供网站的Nginx配置。location /
块包含了一个配置,将进入的连接通过代理转发到内部运行在端口8888上的WebSSH,同时保留SSL。文件末尾的配置(在location /
块之后)加载了您的LetsEncrypt SSL密钥对,并将HTTP连接重定向到HTTPS。
保存并关闭文件。如果您使用的是nano编辑器,请按Ctrl+X
,然后在提示时按Y
,然后再按Enter
键。
接下来,您需要激活这个新配置。Nginx的惯例是从sites-available/
文件夹中创建符号链接(类似快捷方式)到另一个名为sites-enabled/
的文件夹,以便根据需要启用或禁用它们。为了清晰起见,请使用完整路径创建该链接:
- sudo ln -s /etc/nginx/sites-available/webssh /etc/nginx/sites-enabled/webssh
默认情况下,Nginx在/etc/nginx/sites-available/default
目录下包含另一个配置文件,并链接到/etc/nginx/sites-enabled/default
,该配置文件也用于提供默认的索引页面。由于该规则与您的新WebSSH配置冲突,您需要通过将其从/sites-enabled
目录中移除来禁用它。
- sudo rm /etc/nginx/sites-enabled/default
注意:本教程中的Nginx配置是专门用于提供单个应用程序WebSSH的。按照Nginx文档的说明,您可以扩展此Nginx配置以在同一服务器上为多个应用程序提供服务。
接下来,在重新启动Nginx之前,运行nginx -t
命令来验证您的配置。
- sudo nginx -t
输出nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
现在您可以重新启动Nginx服务,以便它能够体现您的新配置。
- sudo systemctl restart nginx
最后,你可以删除之前为了直接访问WebSSH而创建的防火墙规则,因为现在所有的流量都将由Nginx通过标准的HTTP/HTTPS端口处理。
- sudo ufw delete allow 8888
- sudo ufw delete allow 4433
在命令行上重新启动WebSSH。
- wssh
这次不需要提供证书和密钥路径,因为Nginx现在负责处理。然后,在网络浏览器中导航到您的域名。
请注意,WebSSH现在通过Nginx以HTTPS方式提供服务,无需指定端口。目前为止,您已自动化了除了启动wssh
本身之外的所有步骤。您将在最后一步完成这部分。
第五步 – (可选)为WebSSH创建一个Systemd服务
最开始部署时,不会自动在后台运行的服务器端应用程序可能会让人感到困惑,因为每次都需要从命令行直接启动它们。解决此问题的方法是设置自己的后台服务。
为了完成这个任务,您需要创建一个可以被服务器的初始化系统使用的单元文件。在几乎所有现代Linux发行版上,初始化系统都被称为Systemd,并且您可以使用systemctl
命令与其交互。
如果WebSSH仍在您的终端中运行,请按Ctrl+C
停止它。然后,使用nano
或您喜欢的文本编辑器,打开一个名为/etc/systemd/system/webssh.service
的新文件。
- sudo nano /etc/systemd/system/webssh.service
您的单元文件最少需要一个[Unit]
部分、一个[Service]
部分和一个[Install]
部分。
[Unit]
Description=WebSSH terminal interface
After=network.target
[Service]
User=www-data
Group=www-data
ExecStart=wssh
[Install]
WantedBy=multi-user.target
这个文件可以分解如下:
-
[Unit]
部分包含您新服务的纯文本描述,以及一个After
钩子,它指定了服务应在系统启动的何时运行。在本例中,它在服务器的网络接口启动之后运行。 -
[Service]
部分指定了实际应运行的命令,以及应运行该命令的用户。在本例中,www-data
是Ubuntu服务器上Nginx的默认用户,而wssh
是命令本身。 -
[Install]
部分只包含WantedBy=multi-user.target
行,它与[Unit]
部分中的After
行协同工作,以确保服务在服务器准备好接受用户登录时启动。
保存并关闭文件。现在您可以启动您的新的WebSSH服务,并使其在开机时自动运行。
- sudo systemctl start webssh
- sudo systemctl enable webssh
使用systemctl status webssh
命令验证它是否成功启动。您应该会收到与您首次在终端中运行命令时类似的输出。
- sudo systemctl status webssh
Output● webssh.service - WebSSH terminal interface
Loaded: loaded (/etc/systemd/system/webssh.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2022-08-11 22:08:25 UTC; 2s ago
Main PID: 15678 (wssh)
Tasks: 1 (limit: 1119)
Memory: 20.2M
CPU: 300ms
CGroup: /system.slice/webssh.service
└─15678 /usr/bin/python3 /usr/local/bin/wssh
Aug 11 22:08:25 webssh22 systemd[1]: Started WebSSH terminal interface.
Aug 11 22:08:26 webssh22 wssh[15678]: [I 220811 22:08:26 settings:125] WarningPolicy
Aug 11 22:08:26 webssh22 wssh[15678]: [I 220811 22:08:26 main:38] Listening on :8888 (http)
现在您可以在浏览器中重新加载https://your_domain
,并且您应该再次看到WebSSH界面。从现在开始,WebSSH和Nginx将随您的服务器自动重启并在后台运行。
结论
在本教程中,您安装了WebSSH,这是一个在Web浏览器中提供命令行界面的便携解决方案。通过添加SSL,您改进了部署,然后通过添加Nginx反向代理,最后创建了一个WebSSH的Systemd服务。这是一种通用的部署小型服务器端Web应用的良好模型,尤其对于SSH来说,它依赖于密钥对来提供安全性。
接下来,您可能希望了解SSH的其他连接选项。