OpenCloudOS SSH连接执行报错

WebShell SSH登陆OpenCloudOS 9会直接断开。仔细调查后明白了问题点,这里总结下。

WebShell SSH登陆流程

这里WebShell使用的nodejs-ssh2实现终端登录

  1. ssh connect开启登陆交互Shell
  2. 登陆成功后,SSH底层连接复用,开启exec命令执行Channel,这里并发执行了4个命令。

报错信息

开启调试日志的话,相关记录如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
Inbound: CHANNEL_DATA (r:0, 57)
Inbound: CHANNEL_OPEN_CONFIRMATION (r:1, s:1)
Outbound: Sending CHANNEL_REQUEST (r:1, exec: env)
Inbound: CHANNEL_OPEN_CONFIRMATION (r:2, s:2)
Outbound: Sending CHANNEL_REQUEST (r:2, exec: curl https://1991421.cn)
Inbound: CHANNEL_OPEN_CONFIRMATION (r:3, s:3)
Outbound: Sending CHANNEL_REQUEST (r:3, exec: pwd)
Inbound: CHANNEL_OPEN_CONFIRMATION (r:4, s:4)
Outbound: Sending CHANNEL_REQUEST (r:4, exec: id)
Socket ended
Socket closed
/Users/alanhe/GitHub/express-demo/node_modules/ssh2/lib/client.js:1836
cb(had_err !== true ? had_err : new Error('Unable to exec')); ^

可以看到,就是直接断开了,因此最后报错会是Unable to exec。

分析

  1. 尝试关闭命令执行,或者只保留1个命令执行,发现是OK的。

  2. 该机器是1核1G内存,尝试升级机器配置,发现升级到8GB之类的就不报错了。

  3. 重装系统到OpenCloudOS 8发现即使是同配置没问题。

  4. OpenCloudOS9的OpenSSH是v9.3,而8的是v8.x,测试其它镜像比如Fefora 40 OpenSSH v9.6是没问题。

因此推断9版存在某种限制,导致开启的终端执行channel过多就会断开,该问题并非是因为OpenSSH 9.x兼容性导致的问题。

查看服务侧OpenSSH版本

1
ssh -V

https://static.1991421.cn/2024/2024-06-13-181408.jpeg

解决办法

  1. OpenCloudOS 9修复该SSH问题,毕竟其它系统目前没遇到该类问题。
  2. 在未确定具体限制外,可以关闭或者避免并发执行多命令来解决。

写在最后

虽然目前还没确定OS是哪里限制了,但至少明确了是什么造成的。基于目前了解到的信息,并行执行命令并没有任何错也不该是个问题,但还是别过多了,毕竟MaxSessions之类的也还是会限制下。