如何用 WebSocket 执行 SSH 命令
我们可以在 Drone 中安装 SSH 插件,并使用 WebSocket 去对 SSH 进行命令的发送~
Drone 是什么
Drone是一款基于 Docker 的持续集成(CI)和持续交付(CD)平台。它通过自动化构建、测试和部署软件来加快开发过程,减少人工错误,提高应用程序的可靠性。
WebSocket
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,是 HTML5 的一个新特性。它使得浏览器和服务器之间可以实时地进行双向数据传输,而无需进行轮询或长轮询等技术。
与 HTTP 协议不同,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 谷歌浏览器插件。
新建 WebSocket 请求
WebSocket 是客户端和服务端之间的长链接,因此你需要在 Apifox 中创建一个 WebSocket 请求,以便跳转到 Apifox 界面并填写相应的请求信息:
- 点击创建按钮
- 填入 WebSocket 服务的地址
- 可以选择填写 Message 和 Params
信息 和 参数
发送信息
在 Message 中,你可以填写要传递到服务端的信息。服务端将接收你发送的信息。
携带参数
在传输过程中,你也可以携带参数,通过在地址上添加查询参数完成。
可以携带的数据类型包括 string、integer、number、array 等。
保存请求
写完所需信息之后,可以点击 保存按钮,进行保存,方便下次可继续调用。
连接、发送 WebSocket 请求
连接 WebSocket 服务
我们想要跟服务端进行 WebSocket 通信,就需要先建立一个 WebSocket 连接,我们只需要点击 连接 按钮。
连接成功之后,Apifox 有成功的提示~
服务端那边也会因为连接成功,而做出响应
发送 WebSocket 请求
使用 Apifox 点击发送按钮,向服务端发送 Message 和 Params。
与 WebSocket 服务通信
在消息发送完毕后,服务端也可以通过向客户端发送数据来进行通信。比方说,我在此处设置服务端每秒向客户端发送当前时间戳,这是 Apifox 的 WebSocket 功能,非常方便实用~
与 WebSocket 断开连接
如何不想连接了,可以点击断开按钮。
即可断开连接。
关于 Apifox
欢迎体验一下,完全免费的哦:在线使用 Apifox。
Apifox 是全世界 API 工具中的佼佼者,它的好处包括:
- 更容易创建API: 使用 Apifox,你可以轻松地从头开始创建 API ,或将现有的 API 直接从现有文档中导入。该平台具有易于使用的界面,可以轻松建立 API
- 自动生成文档: 使用 Apifox,API 文档将自动生成,节省你的时间和精力。文档是 API 的重要组成部分,它可以帮助开发人员和利益相关者了解如何使用它们,Apifox 可以提供精确而有用的文档
- 协作工作: Apifox 使得协作工作变得简单,可以让你在实时共享你的工作并获得反馈。对于团队在大型或复杂的API上工作的情况特别有用
- 版本控制: Apifox 具有内置的版本控制系统,可跟踪对你的API所做的所有更改。这个功能可以帮助你撤回任何更改,恢复早期版本的API,或同时维护多个版本
- 安全性: Apifox 具有强大的安全功能,可以保护你的 API 免受未经授权的访问或恶意攻击。该平台使用 HTTPS 加密,你还可以管理访问控制和 API 使用限制