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

介绍

通常,您可以使用终端中的命令行应用程序连接到 SSH 服务器,或包含 SSH 客户端的终端模拟器软件。 一些工具,如 Python 的 WebSSH,可以通过 SSH 连接并直接在 Web 浏览器中运行终端。

这在若干情况下是有用的。 它对于现场演示或演示特别有帮助,因为分享一个正常的终端窗口具有视觉意义将是一项挑战。 在允许访问命令行新消息时,它也可以在教育环境中有所帮助,因为它可以避免他们需要在其机器上安装软件(特别是在Windows上,其中默认选项带有了警告. 最后,Python的WebSSH尤其非常可移植,除了Python之外,不需要依赖性就可以起起跑. 其他基于网络的终端堆栈可能更为复杂,并针对Linux.

在本教程中,您将设置 WebSSH 并在浏览器中通过 SSH 连接,然后可选地使用 SSL 证书保护它,并在 Nginx 反向代理后运行用于生产部署。

前提条件

  • 有运行中的SSH服务的Windows,Mac,或Linux环境. 本地运行WebSSH可能有用,但是如果本地机器上没有运行的SSH服务,可以通过遵循我们的Ubuntu 22.04的初始服务器设置指南来使用远程Linux服务器.
  • 联合国 Python编程语言与它的软件包管理器"pip"一起安装. 您可以在 Ubuntu 上安装 Python 和 ) 步骤 1 。
  • 联合国 可选的是,要在浏览器中启用HTTPS,您需要SSL证书和自有域名. 您可以遵循 [如何使用 Certbot 独立模式获取 SSL 证书( https://andsky.com/tech/tutorials/how-to-use-certbot-standalone-mode-to-retrieve-let-s-encrypt-ssl-certificates-on-ubuntu-22-04 ) 。 如果您没有自己的域名,您可以在此教程的前两个步骤中使用IP地址. .

第1步:安装WebSSH

如果您已经安装了 Python 和 pip, 您应该能够从 PyPI (https://pypi.org/project/webssh/), Python 软件仓库中安装 Python 软件包 。 WebSSH 被设计为从命令行直接安装和运行,所以您不需要像 [如何安装 Python 3并设置编程环境] (https://andsky.com/tech/tutorials/how-to-install-python-3-and-set-up-a-programming-environment-on-an-ubuntu-22-04-server) 中所讨论的那样设置另一个虚拟环境. 虚拟环境在开展自己的项目时,而不是在安装全系统工具时,更有用.

使用「pip install」來安裝 WebSSH 包:

1sudo pip3 install webssh
1[secondary_label Output]
23Successfully built webssh
4Installing collected packages: tornado, pycparser, cffi, pynacl, paramiko, webssh
5Successfully 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来验证这一点:

1which wssh
1[secondary_label Output]
2/usr/local/bin/wssh

您现在已经安装了 WebSSH. 在下一步,您将运行并连接到它. 然而,首先,您需要添加防火墙规则. WebSSH 默认情况下在端口 8888 上运行. 如果您使用ufw作为防火墙,则通过ufw``允许该端口:

1sudo ufw allow 8888

您将在本教程中稍后重新查看该防火墙规则。

步骤 2 – 运行和连接到 WebSSH

如果您在本地计算机上运行 WebSSH,您可以自行运行wssh而无需额外的参数开始。如果您在远程服务器上运行 WebSSH,则需要添加--fbidhttp=False旗帜以允许通过常规 HTTP 进行远程连接。

1wssh --fbidhttp=False

现在您可以连接到 WebSSH 并登录。在 Web 浏览器中导航到 your_domain:8888(如果您在本地运行,则使用 localhost而不是 your_domain)。

WebSSH login page

如果您遵循DigitalOcean的初始服务器设置指南(https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-22-04),您将使用基于密码的身份验证,而不是密码,这意味着您只需要指定您正在连接的服务器的).

<$>[注] 注: 正如您可能想象的手动指定主机名称,WebSSH也可以用来连接到它正在运行的服务器以外的服务器。

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

WebSSH command line

此时,您可以正常使用终端,就像通过 SSH 连接一样。 多个用户也可以通过相同的 WebSSH 实例同时连接。 如果您在本地机器上运行 WebSSH 仅用于流媒体或录制视频,这可能是您所需要的全部。

如果您在远程服务器上运行,您不希望在生产中使用 WebSSH 在未受保护的 HTTP 连接背后使用它. 虽然您仍然受到 SSH 服务的身份验证机制的保护,但使用 HTTP 上的 SSH 连接会带来重大安全风险,并且可能会允许其他人窃取您的 SSH 凭证。

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

要完成此步骤,您应该已经获得自己的域名和SSL证书。 其中一种方法是使用 LetsEncrypt独立模式。

当 LetsEncrypt 获取证书时,默认情况下,它会将其存储在 /etc/letsencrypt/live/your_domain 中。

1sudo ls /etc/letsencrypt/live/your_domain
1[secondary_label Output]
2README cert.pem chain.pem fullchain.pem privkey.pem

要运行具有 HTTPS 支持的 WebSSH,您需要提供通往 cert 的路径和通往 key 的路径. 这些是 fullchain.pemprivkey.pem. 默认情况下,WebSSH 在端口 4433 上提供 HTTPS 访问,所以在防火墙中打开该端口:

1sudo ufw allow 4433

接下来,你需要允许

然后,运行 WebSSH 与通往 cert 和您的密钥的路径:

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

在网页浏览器中,导航到https://your_domain:4433,你应该看到与前一步相同的界面,现在有HTTPS支持. 这是现在足够的设置,以确保安全的生产配置. 然而,你仍然在直接从终端运行wssh应用程序,你正在从不寻常的端口访问浏览器。 在本教程的最后两个步骤中,你将删除这两个限制。

步骤 4 – (可选) WebSSH 在 Nginx 逆向代理程序背后运行

将 Nginx 设置为 reverse proxy请求到 WebSSH,这意味着它将负责处理用户向 WebSSH的请求,并再次返回。

更新您的包列表,然后使用apt安装 Nginx:

1sudo apt update nginx
2sudo apt install nginx

如果你正在使用ufw防火墙,你应该在这个时候对你的防火墙配置做出一些更改,以允许访问默认的HTTP/HTTPS端口,80和443.ufw有一个名为Nginx Full的库存配置,可以访问这两个端口:

1sudo ufw allow “Nginx Full”

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

1sudo nano /etc/nginx/sites-available/webssh

将以下内容粘贴到新的配置文件中,确保用您的域名更换your_domain

 1[label /etc/nginx/sites-available/webssh]
 2server {
 3    listen 80 default_server;
 4    listen [::]:80 default_server;
 5    server_name your_domain www.your_domain
 6    root /var/www/html;
 7
 8    access_log /var/log/nginx/webssh.access.log;
 9    error_log /var/log/nginx/webssh.error.log;
10
11    location / {
12        proxy_pass http://127.0.0.1:8888;
13        proxy_http_version 1.1;
14        proxy_read_timeout 300;
15        proxy_set_header Upgrade $http_upgrade;
16        proxy_set_header Connection "upgrade";
17        proxy_set_header Host $http_host;
18        proxy_set_header X-Real-IP $remote_addr;
19        proxy_set_header X-Real-PORT $remote_port;
20    }
21
22    listen 443 ssl;
23    # RSA certificate
24    ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
25    ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
26
27    # Redirect non-https traffic to https
28    if ($scheme != "https") {
29        return 301 https://$host$request_uri;
30    }
31}

您可以将这种配置读取为有三个。 第一个街区在"位置/"行前,包含一个锅炉板Nginx配置,用于在默认的HTTP端口上服务网站,80. " 位置/ " 块包含一个配置,用于在内部运行于端口888888的WebSSH的代理连接,同时保留SSL. 文件尾端的配置,在 位置 / 块后, 加载您的 LetsEncrypt SSL keypairs 并重定向 HTTP 连接到 HTTPS .

保存并关闭文件. 如果您正在使用nano,请按Ctrl+X,然后在提示时按Y,然后输入。

接下来,您需要激活这个新配置。Nginx的惯例是创建符号链接(如快捷键)从可用网站中的文件到另一个名为可用网站的文件夹,当您决定激活或禁用它们时。

1sudo ln -s /etc/nginx/sites-available/webssh /etc/nginx/sites-enabled/webssh

默认情况下, Nginx 包含另一个配置文件在 /etc/nginx/sites-available/default,链接到 /etc/nginx/sites-enabled/default,这也是其默认索引页面。

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

注意:本教程中的 Nginx 配置旨在服务单个应用程序 WebSSH. 您可以通过遵循 Nginx 文档来扩展此 Nginx 配置,以便在同一服务器上服务多个应用程序。

接下来,运行nginx -t来验证您的配置,然后重新启动 Nginx:

1sudo nginx -t
1[secondary_label Output]
2nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
3nginx: configuration file /etc/nginx/nginx.conf test is successful

现在你可以重新启动你的 Nginx 服务,这样它就会反映你的新配置:

1sudo systemctl restart nginx

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

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

在命令行上重新启动webssh:

1wssh

这次你不需要提供 cert 和 key 路径,因为 Nginx 正在处理它,然后在 Web 浏览器中导航到 your_domain。

请注意, WebSSH 现在正在通过 Nginx 通过 HTTPS 进行服务,而无需指定端口。

步骤5 – (可选)为 WebSSH 创建 Systemd 服务

部署不自动在背景中运行的服务器侧应用程序可能起初是不直观的,因为您需要每次从命令行直接启动它们。

要做到这一点,你将创建一个 unit file 可用于你的服务器的 init system. 在几乎所有现代的 Linux 发行版上, init 系统被称为 Systemd ,你可以使用systemctl命令与它交互。

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

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

您的单元文件至少需要一个[单元]部分、一个[服务]部分和一个[安装]部分:

 1[label /etc/systemd/system/webssh.service]
 2[Unit]
 3Description=WebSSH terminal interface
 4After=network.target
 5
 6[Service]
 7User=www-data
 8Group=www-data
 9ExecStart=wssh
10
11[Install]
12WantedBy=multi-user.target

这个文件可以分解如下:

  • [单位] ' 部分包含关于您新服务的简写说明,以及After ' 钩子,它规定何时应在系统启动时运行,在这种情况下,是在您服务器的联网接口出现之后。
  • 联合国 [服务] ' 一节规定哪些命令应实际运行,哪些用户应运行。 在这种情况下,www-data'是一个Ubuntu服务器上的默认Nginx用户,`wsh'是命令本身。
  • [安装]'部分仅包含WantedBy=多用户.target'行,与[单位]部分中的after'行相配合,以确保服务在服务器准备接受用户登录时启动。 .

现在你可以启动你的新的 WebSSH 服务,并启用它自动启动:

1sudo systemctl start webssh
2sudo systemctl enable webssh

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

1sudo systemctl status webssh
 1[secondary_label Output]
 2 webssh.service - WebSSH terminal interface
 3     Loaded: loaded (/etc/systemd/system/webssh.service; enabled; vendor preset: enabled)
 4     Active: active (running) since Thu 2022-08-11 22:08:25 UTC; 2s ago
 5   Main PID: 15678 (wssh)
 6      Tasks: 1 (limit: 1119)
 7     Memory: 20.2M
 8        CPU: 300ms
 9     CGroup: /system.slice/webssh.service
10             └─15678 /usr/bin/python3 /usr/local/bin/wssh
11
12Aug 11 22:08:25 webssh22 systemd[1]: Started WebSSH terminal interface.
13Aug 11 22:08:26 webssh22 wssh[15678]: [I 220811 22:08:26 settings:125] WarningPolicy
14Aug 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 创建系统服务。

接下来,您可能想了解有关 其他 SSH 连接选项

Published At
Categories with 技术
comments powered by Disqus