SSH连接并发送命令后,无法解析结果为JSON的技术求助
解决SSH执行ifconfig结果转JSON失败的问题
排查步骤与解决方案
1. 先捕获解析错误,明确问题根源
当前代码未处理ifconfig.parse(data)的异常,先添加try-catch块,打印具体报错和原始数据,定位问题:
stream.on('close', function(code, signal) { console.log('Stream :: close :: code: ' + code + ', signal: ' + signal); conn.end(); try { const json = ifconfig.parse(data); console.log(json); } catch (err) { console.error('解析失败:', err.message); console.error('原始输出内容:', data); } })
2. 确保数据编码正确
SSH返回的data是Buffer类型,拼接时需明确转为utf8字符串,避免编码混乱导致解析失败:
stream.on('data', function(d) { console.log('STDOUT: ' + d.toString('utf8')); data += d.toString('utf8'); })
3. 检查ifconfig输出格式是否匹配库要求
ifconfig-parser仅支持特定格式的ifconfig输出,不同系统(如Linux/BSD)或发行版的ifconfig输出可能存在差异。如果打印的原始数据和库预期格式不符,有两种处理方式:
- 更换兼容当前系统的解析工具,或改用
ip addr命令替代ifconfig,再匹配对应解析库 - 手动提取字段后转JSON,示例如下(根据实际输出调整正则):
// 提取所有IPv4地址 const ipRegex = /inet (\d+\.\d+\.\d+\.\d+)/g; const ipList = data.match(ipRegex)?.map(item => item.split(' ')[1]) || []; const result = { networkInterfaces: { ips: ipList } }; console.log(JSON.stringify(result));
4. 确保数据完全接收
将解析逻辑移至end事件中,确保所有stdout数据都已接收完成再处理:
let data = ''; stream.on('data', function(d) { data += d.toString('utf8'); }).on('end', function() { try { const json = ifconfig.parse(data); console.log(json); } catch (err) { console.error('解析失败:', err); } }).on('close', function(code, signal) { console.log('Stream :: close :: code: ' + code + ', signal: ' + signal); conn.end(); }).stderr.on('data', function(errData) { console.log('STDERR: ' + errData.toString('utf8')); });
内容的提问来源于stack exchange,提问作者njubishnow
相关产品推荐
相关产品推荐

