linux下c语言调用telnet命令
linux下c语言调用telnet命令详细介绍
在 Linux 下使用 C 语言调用 telnet 命令,可以通过 系统函数(如 system() 或 popen())执行外部命令。以下是具体方法和示例:
一、使用
system() 函数(简单直接)
system() 函数可以直接执行 shell 命令,但无法获取命令输出,适合仅需执行命令、不处理返回结果的场景。
示例代码:
c
command
host
port
command command host port
status command
status
status
status
注意:
system()会启动一个 shell(如/bin/sh)执行命令,存在安全风险(如命令注入),需确保参数可控。telnet命令在非交互模式下会自动退出,输出连接结果(成功或失败)。
二、使用
popen() 函数(获取命令输出)
popen() 函数通过管道执行命令,可读取命令输出,适合需要处理返回信息的场景(如解析连接状态)。
示例代码:
c
host
port
command
FILE pipe
bufferBUFFER_SIZE
command command host port
pipe command
pipe
buffer BUFFER_SIZE pipe
buffer
status pipe
status
status
注意:
- 通过解析输出内容(如
Connected to或Connection refused),可判断连接状态。 pclose()的返回值需通过WEXITSTATUS(status)解析退出码。
三、处理交互场景(需结合
expect)
如果需要模拟用户输入(如登录凭证),需借助 expect 脚本 处理交互。步骤如下:
- 编写
expect脚本(如telnet_login.exp):
tcl$ 0
$ 1
$ 2
$ 3
spawn telnet $ $
expect
send
expect
send
expect
interact
- 在 C 程序中调用
expect脚本:
c
四、替代方案:直接使用 socket 编程
若需更高效或避免依赖外部命令,可直接通过 socket API 实现 telnet 功能(基于 TCP 协议)。示例步骤:
- 创建 socket:
csock AF_INET SOCK_STREAM - 连接目标主机和端口:
cserver_addrserver_addrsin_family AF_INET
server_addrsin_port port
AF_INET host server_addrsin_addr
sock server_addr server_addr
- 发送 / 接收数据(需处理 telnet 协议的协商过程,较复杂)。
总结
- 简单调用:使用
system()或popen()执行telnet 主机 端口,适合非交互场景。 - 交互场景:结合
expect脚本处理登录等交互操作。 - 性能与可控性:若需高性能或自定义逻辑,建议直接使用 socket 编程(绕过外部命令)。
编译时需链接标准库(无需额外选项),例如:
bash
gcc telnet_test.c telnet_test
912 telnet_test.c telnet_test