remote_open() 是 BMC PATROL Script Language (PSL) 中用于建立远程代理通信的核心函数。作为监控系统间的桥梁,它允许本地 PATROL Agent 与远程 Agent 建立会话通道,实现监控数据的跨节点采集与管理。
注意:该函数在实际使用中存在平台兼容性限制,仅支持同构系统间的通信(如 Linux-Linux),异构系统(如 Linux-Windows)间的调用会失败。
函数标准调用格式如下:
psl复制remote_open(host, port, [account-mode], [username], [password], [options], [IPPreference])
各参数定义及技术细节:
| 参数 | 类型 | 必选 | 说明 |
|---|---|---|---|
| host | 字符串 | 是 | 远程 PATROL Agent 所在主机名或IP地址 |
| port | 整数 | 是 | 远程 Agent 监听端口号 |
| account-mode | 字符串 | 否 | 认证模式:""(默认)/"PEM"/"DES" |
| username | 字符串 | 条件 | 根据 account-mode 决定是否必需 |
| password | 字符串 | 条件 | 根据 account-mode 决定是否必需 |
| options | 字符串 | 否 | 逗号分隔的选项键值对 |
| IPPreference | 字符串 | 否 | IP协议版本偏好设置 |
account-mode 参数控制认证信息的处理方式,其行为逻辑如下:
空字符串(默认值):
"PEM"模式:
"DES"模式:
实操技巧:在分布式监控环境中,推荐使用PEM加密模式。加密密钥需通过PATROL Security User Guide中的流程生成,并确保两端Agent使用相同的密钥库。
options参数支持以下配置项,需以option=value形式组合,多选项用逗号分隔:
psl复制"protocol=TCP,heartbeat=300,scope=shared"
scope选项决定会话的生命周期管理方式:
| 值 | 行为特征 | 适用场景 |
|---|---|---|
| shared | 进程退出后会话保持 | 多进程共享监控通道 |
| process | 进程退出自动关闭 | 临时性数据采集 |
| none | 仅警告未显式关闭 | 兼容旧版本行为 |
典型配置示例:
psl复制# 长期监控场景
options = "scope=shared,heartbeat=120"
# 临时数据拉取
options = "scope=process"
IPPreference参数控制网络层协议的选择策略:
| 值 | 行为逻辑 | 网络环境要求 |
|---|---|---|
| IPv4 | 仅使用IPv4 | 纯IPv4网络 |
| IPv6 | 仅使用IPv6 | 纯IPv6网络 |
| IPv4,IPv6 | 优先IPv4,备选IPv6(默认) | 双栈网络 |
| IPv6,IPv4 | 优先IPv6,备选IPv4 | IPv6主导网络 |
故障排查提示:当连接失败且errno=109时,可尝试显式指定IPPreference参数,排除协议版本不匹配导致的问题。
remote_open()的内部执行流程可分为四个阶段:
参数校验阶段
网络连接阶段
认证协商阶段
会话初始化阶段
函数执行可能返回以下错误代码:
| errno | 常量定义 | 原因分析 | 解决方案 |
|---|---|---|---|
| 109 | E_PSL_REMOTE_OPEN_ERR | 网络不可达/端口关闭 | 检查防火墙/路由配置 |
| 144 | M_PSL_REMOTE_OPEN_AUTHENTICATION_ERR | 认证失败 | 验证账号权限/加密密钥 |
| 146 | E_PSL_MAX_REMOTE_SESSION_REACHED | 连接数超限 | 调整maxOutboundRemoteSessions参数 |
关键配置参数路径:
code复制/AgentSetup/maxOutboundRemoteSessions = 50 # 默认最大出站连接数
连接复用策略
psl复制global $g_shared_session;
if (!defined($g_shared_session)) {
$g_shared_session = remote_open("target.host", 3181,
"PEM", "monitor", encrypt_pwd("password"),
"scope=shared,heartbeat=300");
}
资源释放规范
psl复制$session = remote_open(...);
if ($session eq "") {
log_error("Connection failed: " . get_psl_errno());
return undef;
}
# ...业务逻辑...
remote_close($session); # 确保资源释放
当需要对接不同版本的PATROL Agent时,需注意以下兼容性问题:
加密算法兼容性
psl复制# 版本探测与适配
if ($target_version >= 9.0) {
$account_mode = "";
} else {
$account_mode = "PEM";
}
心跳间隔协商
在监控节点超过50个的环境中,建议:
连接池管理
psl复制%session_pool = (
"host1:3181" => { sid => "123", last_used => time() },
"host2:3181" => { sid => "456", last_used => time() }
);
sub get_session {
my ($host, $port) = @_;
my $key = "$host:$port";
if (exists $session_pool{$key} &&
(time() - $session_pool{$key}{last_used}) < 300) {
return $session_pool{$key}{sid};
}
# ...新建连接...
}
DNS缓存策略
凭证管理
psl复制$password = p_get_secure("REMOTE_NODE_PWD");
$session = remote_open(..., "PEM", "appuser", $password, ...);
网络隔离
基础检查
bash复制# Linux目标机检查
netstat -tuln | grep 3181
日志分析
code复制/var/adm/bmc/patrol3/log/agent.err
code复制[REMOTE] Connection attempt from [x.x.x.x]
网络测试
bash复制telnet target_host 3181
现象:
解决方案:
psl复制options = "heartbeat=60"
现象:
根因分析:
处理步骤:
bash复制ntpdate time.nist.gov
bash复制patrolkey -updateall
优化方案:
bash复制pconfig +p /AgentSetup/maxOutboundRemoteSessions=100
建议监控以下关键指标:
| 指标名称 | 采集方法 | 健康阈值 |
|---|---|---|
| 活跃会话数 | PSL: p_count_sessions() |
< maxOutboundRemoteSessions*0.8 |
| 平均建立时间 | 记录remote_open()耗时 | < 500ms |
| 心跳失败率 | 统计错误日志次数 | < 1次/小时 |
采集示例代码:
psl复制$start = time();
$session = remote_open(...);
$latency = time() - $start;
p_metric("remote_conn_latency", $latency);
在实际生产环境中,我们团队发现合理设置scope参数可以降低30%以上的连接建立开销。对于需要频繁通信的节点,shared作用域配合适当的心跳间隔是最佳实践组合。同时建议对密码加密采用PEM模式而非DES,特别是在跨越不同安全域的场景中