如何使用 Python WebSSH 从浏览器连接到终端

0 股票
0
0
0
0

介绍

通常情况下,会使用终端或终端模拟器软件中的命令行工具(其中包含 SSH 客户端)来连接到 SSH 服务器。有些工具,例如 Python 中的 WebSSH,允许您通过 SSH 连接并在 Web 浏览器中直接运行终端。.

此功能在多种情况下都非常有用。尤其是在现场演示或讲解中,很难以易于理解的方式共享常规终端窗口,因此此功能尤为实用。此外,在教育环境中,当需要为不熟悉命令行的人员提供访问权限时,此功能也十分有用,因为它无需在他们的计算机上安装任何软件(尤其是在 Windows 系统上,因为默认选项可能存在问题)。最后,Python WebSSH 具有极佳的可移植性,除了 Python 之外,无需任何其他依赖项即可进行设置。其他基于 Web 的终端协议栈可能更加复杂,并且仅适用于 Linux 系统。.

在本教程中,您将设置 WebSSH 并通过浏览器中的 SSH 连接到它。然后,您可以选择使用 SSL 证书对其进行保护,并将其放置在 Nginx 反向代理之后,以便部署到生产环境中。.

先决条件
  • 需要运行 SSH 服务的 Windows、Mac 或 Linux 环境。在本地运行 WebSSH 很有用,但如果本地计算机上没有 SSH 服务,则可以使用远程 Linux 服务器。.
  • Python 编程语言是通过其包管理器 pip 安装的。要在 Ubuntu 上安装 Python 和 pip,您可以参考本教程的第一部分。.
  • (可选)要在浏览器中启用 HTTPS,您需要 SSL 证书和您的域名。您可以使用 Certbot 的独立模式获取它们。.

步骤 1 – 安装 WebSSH

如果您已安装 Python 和 pip,则应该能够从 PyPI(Python 软件仓库)安装 Python 包。WebSSH 设计为直接从命令行安装和运行,因此无需像在 pip 中那样设置另一个虚拟环境。 Python 3 安装教程 正如之前讨论的,答案是否定的。虚拟环境更适合用于处理自己的项目,而不是安装系统工具。.

要安装 WebSSH 软件包,请使用以下命令:

sudo pip3 install webssh

输出结果应如下所示:

Output
…
Successfully built webssh
Installing collected packages: tornado, pycparser, cffi, pynacl, paramiko, webssh
Successfully installed 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

步骤 2 – 运行 WebSSH 并连接到它

如果 WebSSH 运行在本地计算机上,则无需添加任何额外参数即可运行 wssh 命令。如果 WebSSH 运行在远程服务器上,则必须使用 -s 选项。 --fbidhttp=False 用于允许通过 HTTP 进行远程连接。如果您使用的是不安全的网络,则此连接不安全,但它可用于演示,您将在后续步骤中保护 WebSSH。.

wssh --fbidhttp=False

现在您可以连接到 WebSSH 并登录。地址为: 您的域名:8888 在您的网络浏览器中,转到(如果您在本地运行,则从) localhost:8888 应显示 WebSSH 登录页面。.

输入您常用的 SSH 凭据。如果您已按照 DigitalOcean 服务器设置指南进行操作,则应使用基于密钥的身份验证,而不是密码。因此,您只需指定服务器主机名、您的用户名和 SSH 密钥(该密钥应位于指定文件夹中)。 .ssh/ 位于您的主目录中(通常名为 id_rsa 是)。.

注意:正如您手动指定主机名所推测的那样,WebSSH 也可用于连接到除其自身运行所在的服务器之外的其他服务器。在本教程中,它将运行在您要连接的同一台服务器上。.

点击按钮即可连接。 连接 点击后,您应该会看到默认的终端欢迎界面。.

此时,您可以像往常一样使用终端,就像通过 SSH 连接一样。多个用户也可以同时通过 WebSSH 实例连接。如果您在本地计算机上安装 WebSSH 仅用于视频流传输或录制,则可能需要此功能。WebSSH 服务器运行完毕后,您可以在启动 WebSSH 的终端(而非 WebSSH 终端)中按 Ctrl+C 来停止它。.

如果您在远程服务器上运行 WebSSH,则不应在生产环境中通过不安全的 HTTP 连接使用 WebSSH。虽然您仍然受到 SSH 服务身份验证机制的保护,但通过 HTTP 使用 SSH 连接会带来严重的安全风险,并可能导致他人窃取您的 SSH 凭据。接下来,您将采取措施保护您的 WebSSH 实例,使其安全性不低于常规 SSH 连接。.

步骤 3 – (可选)使用 SSL 证书保护 WebSSH

要完成此步骤,您必须已经拥有域名和 SSL 证书。一种方法是使用 Certbot 的独立模式。.

收到证书后,请确认它们位于以下路径:

sudo ls /etc/letsencrypt/live/your_domain

要运行支持 HTTPS 的 WebSSH,您需要提供证书和密钥的路径:

sudo wssh --certfile='/etc/letsencrypt/live/your_domain/fullchain.pem' --keyfile='/etc/letsencrypt/live/your_domain/privkey.pem''

在您的网络浏览器中,转到 https://your_domain:4433 请继续操作,您应该会看到与上一步相同的界面,现在支持 HTTPS。.

步骤 4 – (可选)在 Nginx 反向代理后运行 WebSSH

通过在 Web 应用程序前端部署 Nginx 等 Web 服务器,您可以提升性能并简化网站安全管理。您将安装 Nginx 并将其配置为反向代理 WebSSH 请求。.

首先,更新您的软件包列表,然后安装 Nginx:

sudo apt update nginx
sudo apt install nginx

如果您使用的是ufw防火墙,则需要更改其配置以允许访问默认的HTTP/HTTPS端口(端口80和443):

sudo ufw allow “Nginx Full”

然后将 Nginx 配置文件复制到该路径 /etc/nginx/sites-available/webssh 创造:

sudo nano /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/ 行之前)包含 Nginx 配置,用于在默认 HTTP 端口 80 上提供服务。location/ 块包含将传入连接代理到 WebSSH(内部运行在 8888 端口)的配置,同时保持 SSL 连接。文件末尾(location/ 块之后)的配置加载您的 Let's Encrypt SSL 密钥对并将 HTTP 连接重定向到 HTTPS。.

保存并关闭文件。如果您使用的是 nano 编辑器,请按 Ctrl+X,然后按 Y,最后根据提示按 Enter 键。.

接下来,您需要启用此新配置。Nginx 的惯例是,当您决定启用或禁用某些文件时,会在 sites/ 目录下创建指向 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,后者也提供了其默认索引页面。您需要从 /sites-enabled 中删除该规则以禁用它,因为它与您的新 WebSSH 配置冲突:

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

注意:本教程中的 Nginx 配置旨在服务于单个应用程序 WebSSH。您可以按照 Nginx 文档扩展此 Nginx 配置,以在单个服务器上服务于多个应用程序。.

然后,测试 Nginx 配置:

sudo nginx -t
Output
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

这次您无需提供证书和密钥路径,因为 Nginx 会自动处理。然后,在 Web 浏览器中访问您的域名。.

请注意,WebSSH 现在通过 Nginx 使用 HTTPS 提供服务,无需指定端口。至此,除了 SSH 配置本身之外,所有步骤都已自动化。您将在最后一步完成 SSH 配置。.

步骤 5 – (可选)为 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 hook,用于指定何时在系统启动时运行,在本例中是在服务器的网络接口启动之后运行。.
  • [Service] 部分指定要运行的命令以及要运行该命令的用户。在本例中,www-data 是 Ubuntu 服务器上的默认 Nginx 用户,而 wssh 就是命令本身。.
  • [install] 部分仅包含 WantedBy=multi-user.target 这一行,它与 [unit] 部分中的 After 行配合使用,以确保当服务器准备好接受用户登录时,服务能够启动。.

文件保存后,启动该服务并使其在系统启动时运行:

sudo systemctl start webssh
sudo systemctl enable webssh

使用 `systemctl status webssh` 命令验证 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 反向代理和创建 systemd 服务来增强其部署。这种模型对于部署小型服务器端应用程序非常有用,尤其是在使用密钥对进行身份验证的 SSH 安全环境中。.

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

您可能也喜欢