如何用 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 接口,并确保你的应用程序能够正常工作。这时,一个强大的接口测试工具就会派上用场。
Apifox 是一个比 Postman 更强大的接口测试工具,Apifox = Postman + Swagger + Mock + JMeter。它支持调试 http(s)、WebSocket、Socket、gRPC、Dubbo 等多种协议的接口,这使得它成为了一个非常全面的接口测试工具,所以强烈推荐去下载体验!
在 Apifox 中,你需要创建一个 WebSocket 请求以便进入相应的界面进行必要的信息填写。以下是步骤:
- 新建一个 HTTP 项目后,在项目中点击“+”按钮。
- 输入 WebSocket 服务的地址。
- 选择性地填写要传输的消息(Message)和参数(Params)。
- 填写完必要信息后,点击“保存”按钮以保留本次请求信息,方便下次调用。
要与服务器进行通信,你首先需要建立一个 WebSocket 连接。只需点击“连接”按钮即可。连接成功后,Apifox 会给出提示,同时服务器也会对此作出响应。
成功连接后,你可以使用 Apifox 提供的“发送”按钮,来发送消息和参数给服务器。
发送消息后,服务器同样可以向客户端回传信息,这一功能展示了 Apifox 的 WebSocket 功能的简便性,快去试试吧!
总结
本文详细说明了如何在Drone CI/CD平台上通过安装SSH和SCP插件,结合WebSocket技术实现远程执行SSH命令和文件上传的功能。同时,文章还推荐了Apifox这一强大的接口测试工具,用于调试包括WebSocket在内的多种协议接口,确保应用的稳定性和可靠性。通过这种方式,开发者可以更高效地进行自动化构建、测试和部署流程。