WebSocket 实现 SSH 远程命令执行

本文介绍了如何使用 WebSocket 协议实现 SSH 远程命令执行,让用户可以在浏览器中直接执行远程服务器的命令。

用 Apifox,节省研发团队的每一分钟

WebSocket 实现 SSH 远程命令执行

免费使用 Apifox

相关推荐

最新文章

API

一体化协作平台

API 设计

API 文档

API 调试

自动化测试

API Mock

API Hub

立即体验 Apifox
目录

如何用 WebSocket 执行 SSH 命令

我们可以在 Drone 中安装 SSH 插件,并使用 WebSocket 去对 SSH 进行命令的发送~

Drone 是什么

Drone是一款基于 Docker 的持续集成(CI)和持续交付(CD)平台。它通过自动化构建、测试和部署软件来加快开发过程,减少人工错误,提高应用程序的可靠性。

Drone 

WebSocket

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,是 HTML5 的一个新特性。它使得浏览器和服务器之间可以实时地进行双向数据传输,而无需进行轮询或长轮询等技术。

与 HTTP 协议不同,WebSocket 是一种持久连接,常常用于实时通信,例如在线游戏、实时聊天、性能监控等。

WebSocket

使用 Drone、WebSocket 进行 SSH 上传

安装 Drone SSH 插件

在 Drone 项目中安装 Drone SSH 插件。

kind: pipeline
name: example

steps:
  - name: ssh
    image: appleboy/drone-ssh
    settings:
      host: ssh.example.com
      username: root
      password: ${PLUGIN_PASSWORD}
      script:
        - cd /opt/
        - ls
        - echo "Hello, World!"

安装 Drone SCP 插件

在Drone项目中安装Drone SCP(Secure Copy)插件。

kind: pipeline
name: example

steps:
  - name: scp
    image: appleboy/drone-scp
    settings:
      host: ssh.example.com
      username: root
      password: ${PLUGIN_PASSWORD}
      source:
        - ./file.txt
      target: /opt/

请注意,这两个示例使用的是基本的用户名/密码身份验证,但如果你使用的是 SSH 密钥对,则可以将其用作凭据。

使用 WebSocket 进行 SSH 连接

可以使用 Python 的 websocket 模块连接 WebSocket,并发送 SSH 命令。 以下是连接并执行命令的示例代码。

import websocket
import ssl
import json

def on_message(ws, message):
    print(message)

def on_error(ws, error):
    print(error)

def on_close(ws):
    print("### closed ###")

def on_open(ws):
    data = {
        "host": "ssh.example.com",
        "username": "root",
        "password": "mypassword",
        "command": "ls -al"
    }
    ws.send(json.dumps(data))

if __name__ == "__main__":
    websocket.enableTrace(True)
    url = "wss://my-drone-server.com/ws"
    headers = {
        "Authorization": "Bearer <DRONE_TOKEN>"
    }
    ws = websocket.WebSocketApp(url,
                                header=headers,
                                on_message=on_message,
                                on_error=on_error,
                                on_close=on_close)
    ws.on_open = on_open
    ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})

上面的代码并没有在 command 字段中输入实际的 SSH 命令,而是使用 ls -al 示例命令。 要执行其他命令,请将其替换为所需的命令。

使用 WebSocket 上传文件

可以使用 Python 的 websocket-client 模块和 paramiko 模块来连接和上传文件。 以下是连接和上传文件的示例代码。

import websocket
import paramiko
import ssl
import json

def on_message(ws, message):
    print(message)

def on_error(ws, error):
    print(error)

def on_close(ws):
    print("### closed ###")

def on_open(ws):
    transport = paramiko.Transport(('ssh.example.com', 22))
    transport.connect(username='root', password='mypassword')
    sftp = transport.open_sftp()
    # 上传文件到/ opt目录
    sftp.put("./file.txt", "/opt/file.txt")
    sftp.close()
    transport.close()
    ws.close()

if __name__ == "__main__":
    websocket.enableTrace(True)
    url = "wss://my-drone-server.com/ws"
    headers = {
        "Authorization": "Bearer <DRONE_TOKEN>"
    }
    ws = websocket.WebSocketApp(url,
                                header=headers,
                                on_message=on_message,
                                on_error=on_error,
                                on_close=on_close)
    ws.on_open = on_open
    ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})

Apifox 调试 WebSocket 服务

如果你正在开发 WebSocket 服务并需要进行调试,我建议你尝试使用一些优秀的 API 调试工具,例如Apifox,它可以帮助你完美地调试 WebSocket 服务~

Apifox 有 Web端 和 客户端,如果你使用的是 Web端,想要调试本地服务,需要安装插件:Apifox 谷歌浏览器插件

Apifox 谷歌浏览器插件

新建 WebSocket 请求

WebSocket 是客户端和服务端之间的长链接,因此你需要在 Apifox 中创建一个 WebSocket 请求,以便跳转到 Apifox 界面并填写相应的请求信息:

  • 点击创建按钮
  • 填入 WebSocket 服务的地址
  • 可以选择填写 Message 和 Params
新建 WebSocket 请求

信息 和 参数

发送信息

在 Message 中,你可以填写要传递到服务端的信息。服务端将接收你发送的信息。

发送信息

携带参数

在传输过程中,你也可以携带参数,通过在地址上添加查询参数完成。

可以携带的数据类型包括 string、integer、number、array 等。

携带参数

保存请求

写完所需信息之后,可以点击 保存按钮,进行保存,方便下次可继续调用。

保存请求

连接、发送 WebSocket 请求

连接 WebSocket 服务

我们想要跟服务端进行 WebSocket 通信,就需要先建立一个 WebSocket 连接,我们只需要点击 连接 按钮。

建立 WebSocket 连接

连接成功之后,Apifox 有成功的提示~

连接成功

服务端那边也会因为连接成功,而做出响应

发送 WebSocket 请求

使用 Apifox 点击发送按钮,向服务端发送 Message 和 Params。

发送 WebSocket 请求

与 WebSocket 服务通信

在消息发送完毕后,服务端也可以通过向客户端发送数据来进行通信。比方说,我在此处设置服务端每秒向客户端发送当前时间戳,这是 Apifox 的 WebSocket 功能,非常方便实用~

与 WebSocket 服务通信

与 WebSocket 断开连接

如何不想连接了,可以点击断开按钮。

与 WebSocket 断开连接

即可断开连接。

关于 Apifox

欢迎体验一下,完全免费的哦:在线使用 Apifox

Apifox 是全世界 API 工具中的佼佼者,它的好处包括:

  • 更容易创建API: 使用 Apifox,你可以轻松地从头开始创建 API ,或将现有的 API 直接从现有文档中导入。该平台具有易于使用的界面,可以轻松建立 API
  • 自动生成文档 使用 Apifox,API 文档将自动生成,节省你的时间和精力。文档是 API 的重要组成部分,它可以帮助开发人员和利益相关者了解如何使用它们,Apifox 可以提供精确而有用的文档
  • 协作工作: Apifox 使得协作工作变得简单,可以让你在实时共享你的工作并获得反馈。对于团队在大型或复杂的API上工作的情况特别有用
  • 版本控制: Apifox 具有内置的版本控制系统,可跟踪对你的API所做的所有更改。这个功能可以帮助你撤回任何更改,恢复早期版本的API,或同时维护多个版本
  • 安全性: Apifox 具有强大的安全功能,可以保护你的 API 免受未经授权的访问或恶意攻击。该平台使用 HTTPS 加密,你还可以管理访问控制和 API 使用限制
Apifox