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

介绍

通常情况下,你可以使用命令行应用程序或终端仿真软件中的SSH客户端来连接SSH服务器。一些工具,比如Python的WebSSH,使你可以通过SSH连接并直接在网页浏览器中运行终端。

这在许多情况下都非常有用。特别是在进行实时演示或演示时,如果以一种使视觉上有意义的方式共享常规终端窗口会很具挑战性,那么它将会非常有帮助。它还可以在教育环境中帮助给予命令行初学者访问权限,因为这样可以避免他们需要在自己的计算机上安装软件(特别是在默认选项带有注意事项的Windows系统上)。最后,特别需要提到的是,Python的WebSSH非常便携,并且只需要Python而不需要其他依赖项即可运行。其他基于网络的终端堆栈可能更加复杂,并且特定于Linux系统。

在本教程中,你将会安装WebSSH并使用浏览器通过SSH连接。然后,你可以选择使用SSL证书来保证安全,并将其部署在Nginx反向代理后面用于生产环境。

先决条件

  • A Windows, Mac, or Linux environment with a running SSH service. It can be useful to run WebSSH locally, but if you don’t have an SSH service running on a local machine, you can use a remote Linux server by following our initial server setup guide for Ubuntu 22.04.
  • The Python programming language installed along with pip, its package manager. You can install Python and pip on Ubuntu by following Step 1 of this tutorial.
  • Optionally, to enable HTTPS in the browser, you will need SSL certificates and your own domain name. You can obtain them by following How To Use Certbot Standalone Mode to Retrieve Let’s Encrypt SSL Certificates. If you do not have your own domain name, you can use an IP address for the first two steps of this tutorial.

第一步 – 安装WebSSH

如果您已经安装了Python和pip,您应该可以从Python软件仓库PyPI中安装Python包。WebSSH旨在从命令行直接安装和运行,因此您无需设置另一个虚拟环境,如《如何安装Python 3并设置编程环境》中所述。虚拟环境在处理自己的项目时更有用,而不是在安装系统范围工具时。

使用pip install命令安装WebSSH包:

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

  1. which wssh
Output
/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 login page

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

Note

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

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

WebSSH command line

在这一点上,您可以像使用SSH连接一样正常使用终端。多个用户也可以同时通过同一个WebSSH实例连接。如果您仅仅将WebSSH运行在本地机器上用于流媒体或捕获视频,这可能是您所需要的全部。您可以在启动WebSSH的终端(而非WebSSH终端)中输入Ctrl+C来停止WebSSH服务器。

如果您在远程服务器上运行,您不应该在非安全的HTTP连接后面在生产环境中使用WebSSH。虽然您仍然受到SSH服务的身份验证机制的保护,但使用HTTP上的SSH连接存在重大安全风险,并可能使他人窃取您的SSH凭据。在接下来的步骤中,您将保护您的WebSSH实例,使其与常规的SSH连接一样安全。

第三步 -(可选)使用SSL证书保护WebSSH

要完成这一步,您应该已经获得了自己的域名和SSL证书。一种方法是使用独立模式通过LetsEncrypt来完成。

当LetsEncrypt检索证书时,默认情况下将其存储在/etc/letsencrypt/live/your_domain。请确保您已经拥有这些证书。

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

要在WebSSH中运行HTTPS支持,您需要提供证书的路径和密钥的路径。这些路径分别是fullchain.pem和privkey.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 nginx
  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 可以被改写为:
/ 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

Note

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

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

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

  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

这个文件可以分解如下:

  • The [Unit] section contains a plaintext description of your new service, as well as an After hook that specifies when it should be run at system startup, in this case after your server’s networking interfaces have come up.
  • The [Service] section specifies which command should actually be run, as well as which user should be running it. In this case, www-data is the default Nginx user on a Ubuntu server, and wssh is the command itself.
  • The [Install] section contains only the WantedBy=multi-user.target line, which works together with the After line in the [Unit] section to ensure that the service is started when the server is ready to accept user logins.

保存并关闭文件。现在您可以启动您的新的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的系统服务。这是一种通用的部署小型服务器端Web应用的良好模型,尤其对于SSH来说,它依赖于密钥对来提供安全性。

接下来,你可能希望了解SSH的其他连接选项。

发表回复 0

Your email address will not be published. Required fields are marked *