博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux: C语言使用管道和shell实现自动登录telnet并执行拓扑查询命令
阅读量:2768 次
发布时间:2019-05-13

本文共 1503 字,大约阅读时间需要 5 分钟。

作者:GentlemanTsao

https://blog.csdn.net/GentelmanTsao

业务场景:

已有业务逻辑:通过命令行终端可以登录telnet本地服务,并输入指令查询拓扑讯息。

例如:

telnet 127.0.0.1 7777 # 登录到本地td s2  #子指令,查询拓扑讯息exit   #退出telnet

现在我们要将上述步骤使用C语言做成一个指令:gettopo。

调用gettopo则执行上述操作,提取出关键字串并打印输出。

实现方法

1.topology.sh脚本

首先,写一个topology.sh脚本,用于自动登录telnet并查询拓扑

#!/bin/ship="127.0.0.1"port=7777inputfile=in input1="td s2"input2="exit"rm -fr $inputfile    mknod $inputfile p  exec 8<>$inputfile telnet $ip $port <&8 &sleep 1; echo $input1 >> $inputfile   echo $input2 >> $inputfile

在该脚本中,input1和input2分别设置了子指令,通过管道输入telnet,从而实现登录telnet后执行预设指令。

2.安装sh脚本

上述的shell脚本是以文件的形式存放在模块源码中。

我们添加以下内容到makefile,将脚本安装到/usr/sbin目录下

define Package/meshconfig/install	$(INSTALL_DIR) $(1)/usr/sbin	$(INSTALL_BIN) ./files/topology.sh $(1)/usr/sbin/topoendef

3. C语言实现get_topology方法

现在我们可以直接调用topo来查询拓扑信息了。

接下来用C语言实现get_topology方法,目标是调用topo指令,并提取需要的内容。

char* get_topology(void){
char buf[256] = {
0}; FILE *fp = NULL; static char result[16384] = {
0}; char* filter_oneline_result; memset(result,0,sizeof(result)); if( (fp = popen("topo", "r")) == NULL ) {
perror("popen error!\n"); printf("popen error!\n"); }else {
while (fgets(buf, sizeof(buf), fp)) {
filter_oneline_result = filter_topo_buffer_oneline(buf); strcat(result,filter_oneline_result); } pclose(fp); } return result;}

该方法的实现过程:

1.使用popen来调用topo指令;
2.使用fgets来获取topo的输出;
3.自定义filter_topo_buffer_oneline方法提取需要的内容;
4.最后将结果copy到result中

filter_topo_buffer_oneline是自定义方法,作用是从字符串中提取出想要的内容。

具体实现请查看另一篇:

0(n_n)0

你可能感兴趣的文章
初识Top命令
查看>>
MySQL权限
查看>>
“火狐”很“51”
查看>>
记录两个CakePHP知识点
查看>>
中国移动飞信免费发短信API接口(第三方)
查看>>
1024MySQL中 MONTH(date) 函数
查看>>
073 不断在文件hello.txt头部写入一行"Hello World"字符串,要求代码完整
查看>>
074 TP5 Nginx 打开都是找不到文件(404)(开启pathinfo)
查看>>
078 史上最完美的代码
查看>>
083 过滤字符串中的某个字符
查看>>
089 Linux宝塔面板介绍 Centos安装宝塔面板教程
查看>>
094 chrome浏览页面常用快捷键
查看>>
095 php如何提高网页加载速度?
查看>>
平均要取多少个(0,1)中的随机数才能让和超过1
查看>>
模糊哈希算法的原理与应用
查看>>
UVa 11029 Leading and Trailing (如何计算n^k的开头三位和末尾三位?)
查看>>
面向对象编程风格 VS 基于对象编程风格(boost::bind/function)
查看>>
reinforcement learning for Flappy bird
查看>>
《UNIX环境高级编程》笔记--系统标识
查看>>
Android数据存储方式之SharedPreference
查看>>