介绍
通常,您可以使用终端中的命令行应用程序连接到 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]
2…
3Successfully 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)。
如果您遵循DigitalOcean的初始服务器设置指南(https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-22-04),您将使用基于密码的身份验证,而不是密码,这意味着您只需要指定您正在连接的服务器的).
<$>[注] 注: 正如您可能想象的手动指定主机名称,WebSSH也可以用来连接到它正在运行的服务器以外的服务器。
点击 连接 按钮,你应该被欢迎你的默认终端欢迎提示:
此时,您可以正常使用终端,就像通过 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.pem
和 privkey.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 连接选项。