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包:

  1. 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来验证这一点。

  1. which wssh
输出
/usr/local/bin/wssh

你现在已经安装了WebSSH。下一步,你需要运行并连接它。不过,在此之前,你需要添加一个防火墙规则。WebSSH默认运行在8888端口上。如果你使用ufw作为防火墙,请通过ufw允许该端口。

  1. sudo ufw allow 8888

在本教程中,你稍后会再次回顾那个防火墙规则。

第二步 – 运行并连接到WebSSH

如果你在本地机器上运行WebSSH,你可以直接运行wssh,无需任何其他参数即可启动。如果你在远程服务器上运行WebSSH,则需要添加"--fbidhttp=False"标志,以允许通过普通HTTP进行远程连接。如果你在一个不安全的网络上连接,这是不安全的,但对于演示非常有用,并且你将在本教程中稍后为WebSSH提供安全性。

  1. wssh --fbidhttp=False

现在你可以连接到WebSSH并登录。在Web浏览器中导航到your_domain:8888(如果你在本地运行,请使用localhost代替your_domain)。你将看到WebSSH登录页面。

WebSSH登录页面

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

注意

注意:从需要手动指定主机名可以猜测,WebSSH也可以用来连接到除了正在运行的服务器之外的其他服务器。对于本教程,它正在运行在你连接的同一台服务器上。

点击连接按钮,你应该会收到默认终端的欢迎提示:

WebSSH命令行

在这一点上,你可以像使用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。请确保你已经拥有这些证书。

  1. sudo ls /etc/letsencrypt/live/your_domain
输出
README cert.pem chain.pem fullchain.pem privkey.pem

要在WebSSH中运行HTTPS支持,你需要提供证书的路径和密钥的路径。这些路径分别是fullchain.pemprivkey.pem。默认情况下,WebSSH在端口4433提供HTTPS访问,所以请确保在防火墙中打开该端口。

  1. sudo ufw allow 4433

接下来,你需要允许

然后,使用你的证书和密钥的路径来运行WebSSH。

  1. 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。

  1. sudo apt update
  2. sudo apt install nginx

如果你正在使用ufw防火墙,此时你应该对防火墙配置做一些更改,以使80和443端口的默认HTTP/HTTPS访问可用。ufw有一个名为“Nginx Full”的默认配置,可以提供对这两个端口的访问。

  1. sudo ufw allow "Nginx Full"

Nginx允许您将每个站点的配置添加到名为sites-available/的子目录中的单独文件中。使用nano或您最喜欢的文本编辑器,在/etc/nginx/sites-available/webssh创建一个新的Nginx配置。

  1. 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/的文件夹,以便根据需要启用或禁用它们。为了清晰起见,请使用完整路径创建该链接:

  1. 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目录中移除来禁用它。

  1. sudo rm /etc/nginx/sites-enabled/default

注意:本教程中的Nginx配置是专门用于提供单个应用程序WebSSH的。按照Nginx文档的说明,您可以扩展此Nginx配置以在同一服务器上为多个应用程序提供服务。

接下来,在重新启动Nginx之前,运行nginx -t命令来验证您的配置。

  1. 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服务,以便它能够体现您的新配置。

  1. sudo systemctl restart nginx

最后,你可以删除之前为了直接访问WebSSH而创建的防火墙规则,因为现在所有的流量都将由Nginx通过标准的HTTP/HTTPS端口处理。

  1. sudo ufw delete allow 8888
  2. sudo ufw delete allow 4433

在命令行上重新启动WebSSH。

  1. wssh

这次不需要提供证书和密钥路径,因为Nginx现在负责处理。然后,在网络浏览器中导航到您的域名。

请注意,WebSSH现在通过Nginx以HTTPS方式提供服务,无需指定端口。目前为止,您已自动化了除了启动wssh本身之外的所有步骤。您将在最后一步完成这部分。

第五步 – (可选)为WebSSH创建一个Systemd服务

最开始部署时,不会自动在后台运行的服务器端应用程序可能会让人感到困惑,因为每次都需要从命令行直接启动它们。解决此问题的方法是设置自己的后台服务。

为了完成这个任务,您需要创建一个可以被服务器的初始化系统使用的单元文件。在几乎所有现代Linux发行版上,初始化系统都被称为Systemd,并且您可以使用systemctl命令与其交互。

如果WebSSH仍在您的终端中运行,请按Ctrl+C停止它。然后,使用nano或您喜欢的文本编辑器,打开一个名为/etc/systemd/system/webssh.service的新文件。

  1. sudo nano /etc/systemd/system/webssh.service

您的单元文件最少需要一个[Unit]部分、一个[Service]部分和一个[Install]部分。

/etc/systemd/system/webssh.service
[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服务,并使其在开机时自动运行。

  1. sudo systemctl start webssh
  2. sudo systemctl enable webssh

使用systemctl status webssh命令验证它是否成功启动。您应该会收到与您首次在终端中运行命令时类似的输出。

  1. 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的其他连接选项。

bannerAds