在C语言中使用伪终端与bash交互
- 了解伪终端概念:
- 伪终端(PTY)由一对设备组成:主设备(master)和从设备(slave)。数据写入主设备会出现在从设备,反之亦然。这允许一个进程通过主设备与另一个进程(如
bash)通过从设备进行通信。
- 伪终端(PTY)由一对设备组成:主设备(master)和从设备(slave)。数据写入主设备会出现在从设备,反之亦然。这允许一个进程通过主设备与另一个进程(如
- 相关函数:
openpty:用于创建伪终端对。其原型为int openpty(int *amaster, int *aslave, char *name, const struct termios *termp, const struct winsize *winp)。amaster和aslave是指向文件描述符的指针,分别用于主设备和从设备;name可用于获取从设备的路径名;termp可用于设置终端属性;winp可用于设置窗口大小。fork:创建一个新进程,子进程通常用于执行bash,父进程用于与伪终端主设备交互。dup2:在子进程中用于将标准输入、输出和错误重定向到伪终端从设备。write和read:用于在父进程中向伪终端主设备写入命令,并读取bash的输出。
- 示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <termios.h>
#include <string.h>#define BUFFER_SIZE 1024// 设置文件描述符为非阻塞模式
void set_nonblocking(int fd) {int flags = fcntl(fd, F_GETFL, 0);fcntl(fd, F_SETFL, flags | O_NONBLOCK);
}int main() {int master, slave;pid_t pid;char buffer[BUFFER_SIZE];struct termios oldtty, newtty;// 创建伪终端对if (openpty(&master, &slave, NULL, NULL, NULL) == -1) {perror("openpty");return 1;}// 保存当前终端设置tcgetattr(STDIN_FILENO, &oldtty);newtty = oldtty;// 设置终端为非规范模式newtty.c_lflag &= ~(ICANON | ECHO);// 设置终端属性tcsetattr(STDIN_FILENO, TCSANOW, &newtty);// 设置伪终端主设备为非阻塞模式set_nonblocking(master);// 创建子进程pid = fork();if (pid == -1) {perror("fork");close(master);close(slave);return 1;} else if (pid == 0) {// 子进程close(master);// 将标准输入、输出和错误重定向到伪终端从设备if (dup2(slave, STDIN_FILENO) == -1) {perror("dup2 stdin");return 1;}if (dup2(slave, STDOUT_FILENO) == -1) {perror("dup2 stdout");return 1;}if (dup2(slave, STDERR_FILENO) == -1) {perror("dup2 stderr");return 1;}close(slave);// 启动bashexecl("/bin/bash", "bash", (char *)NULL);perror("execl");return 1;} else {// 父进程close(slave);// 向bash发送命令const char *command = "ls\n";if (write(master, command, strlen(command))!= strlen(command)) {perror("write");}// 读取bash的输出ssize_t bytes_read;while ((bytes_read = read(master, buffer, sizeof(buffer) - 1)) > 0) {buffer[bytes_read] = '\0';printf("%s", buffer);}// 等待子进程结束waitpid(pid, NULL, 0);// 恢复终端设置tcsetattr(STDIN_FILENO, TCSANOW, &oldtty);close(master);}return 0;
}
- 代码解释:
- 创建伪终端对:使用
openpty创建伪终端主设备master和从设备slave。 - 终端设置:保存当前终端设置
oldtty,并修改为非规范模式newtty,这样可以实时读取输入而无需等待换行符。 - 设置非阻塞模式:将伪终端主设备设置为非阻塞模式,以便在读取输出时不会阻塞。
- 进程创建:通过
fork创建子进程,子进程执行bash,父进程与伪终端主设备交互。 - 子进程操作:关闭
master,将标准输入、输出和错误重定向到slave,然后执行bash。 - 父进程操作:关闭
slave,向master写入命令(如ls\n),循环读取并打印bash的输出,等待子进程结束,最后恢复终端设置。
- 创建伪终端对:使用
这样,通过上述代码,你可以在C语言程序中使用伪终端与bash进行交互。
相关文章:
在C语言中使用伪终端与bash交互
了解伪终端概念: 伪终端(PTY)由一对设备组成:主设备(master)和从设备(slave)。数据写入主设备会出现在从设备,反之亦然。这允许一个进程通过主设备与另一个进程ÿ…...
阿里云 人工智能与机器学习
阿里云的 人工智能(AI)与机器学习(ML) 服务为企业提供了全面的AI解决方案,帮助用户在多个行业实现数据智能化,提升决策效率,推动业务创新。阿里云通过先进的技术和丰富的工具,支持用…...
HTML 显示器纯色亮点检测工具
HTML 显示器纯色亮点检测工具 相关资源文件已经打包成html等文件,可双击直接运行程序,且文章末尾已附上相关源码,以供大家学习交流,博主主页还有更多Html相关程序案例,秉着开源精神的想法,望大家喜欢&#…...
【漏洞分析】UDF提权漏洞——CVE-2016-6662-MySQL ‘malloc_lib’变量重写命令执行
0x00 前言 最近在做渗透笔记,其中有一个靶机在getshell后,需要进行提权。发现靶机使用root启动的mysql服务,那么尝试使用UDF提权。于是在提权成功后,花了一天时间特意搜了一下整个UDF提权的漏洞原理和利用,加深理解。…...
Mybatis(day09)
Mybatis基础操作 功能列表: 查询 根据主键ID查询 条件查询新增更新删除 根据主键ID删除 根据主键ID批量删除 准备 实施前的准备工作: 准备数据库表创建一个新的 springboot 工程,选择引入对应的起步依赖(mybatis、mysql 驱动、…...
模式识别与机器学习 | 十一章 概率图模型基础
隐马尔科夫模型(Hidden Markov Model,HMM) HMM是建模序列数据的图模型 1、第一个状态节点对应一个初始状态概率分布 2、状态转移矩阵A, 3、发射矩阵概率B 4、对特定的(x,y)的联合概率可以表示为 α递归计算——前向算法β递归…...
深圳知识产权保护中心再发力,两大产业专利预审服务全新升级
在当今科技迅猛发展、市场竞争日益激烈的时代,知识产权保护对于产业发展的重要性不言而喻。深圳知识产权保护中心又有大动作,为高端装备制造和珠宝加工产业带来了专利预审服务的新突破。这一举措不仅为这两个产业注入了强大的发展动力,也为深…...
同步与并发:Java的同步舞蹈
现在,我们将深入探讨同步与并发,这是确保多线程程序正确性和效率的关键,就像是Java的同步舞蹈。 1 并发的概念 并发是指在多处理器系统中,多个操作或多个线程同时进行执行。在Java中,这意味着能够有效地利用多核处理…...
Kafka详解 ③ | Kafka集群操作与API操作
目录 1、Kafka集群操作 1.1、创建 topic 1.2、查看主题命令 1.3、生产者生产 1.4、消费者消费数据 1.5、运行 describe topics命令 1.6、增加 topic分区数 1.7、增加配置 1.8、删除配置 1.9、删除 topic 2、Kafka的Java API操作 2.1、生产者代码 2.2、消费者代 2…...
k8s基础(1)—Kubernetes-Pod
一、Pod简介 Pod是Kubernetes(k8s)系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型。Pod是由一个或多个容器组成的,这些容器共享存储和网络资源,可以看作是一个逻辑的主机。…...
iOS - 数组的真实类型
1. NSArray 类簇 // 1. __NSArray0 (空数组) NSArray *empty [];// 2. __NSArrayI (不可变数组) NSArray *immutable [1, 2, 3];// 3. __NSArrayM (可变数组) NSMutableArray *mutable [NSMutableArray array];// 4. __NSSingleObjectArrayI (单元素数组) NSArray *single …...
k8s启动报错
执行kubeadm init --image-repository registry.aliyuncs.com/google_containers 出现如下结果: [api-check] The API server is not healthy after 4m0.000885686s Unfortunately, an error has occurred: context deadline exceeded This error is likely caused by:…...
git:指令集
以下是对这些 Git 新特性和命令的更详细解读和实际用例分析,帮助更好地理解它们的作用及适用场景: 1. git switch 和 git restore 背景: 传统上,git checkout 是一个多功能命令,用于切换分支、检出文件、创建分支等&…...
自闭症家庭:建立支持系统与平衡生活
在自闭症家庭的世界里,每一天都充满了挑战与希望。自闭症,这一复杂的神经发育障碍,不仅影响着孩子的成长轨迹,也对整个家庭的生活方式产生了深远的影响。面对这一挑战,许多家庭都在努力寻找有效的支持系统和平衡生活的…...
html+css+js网页设计 美食 美食天下2个页面(里面包含php和mysql)
htmlcssjs网页设计 美食 美食天下2个页面(里面包含php和mysql) 网页作品代码简单,可使用任意HTML辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编…...
高阶知识库搭建实战七、(知识库雏形开发:qianwen-plus+Faiss)(练习推荐)
构建知识库:结合Faiss和qianwen-plus大模型的实践 环境搭建参考前面几篇文章:基础环境搭建、Faiss向量数据库安装 在当今信息爆炸的时代,如何高效地管理和检索海量知识成为了一个重要课题。知识库的构建为我们提供了一种有效的解决方案,它能够将分散的信息整合起来,方便…...
麒麟服务器安装kafka--亲测
我这安装的是单机版本的: 下载地址:Index of /kafka/3.9.0 我下载的是:https://dlcdn.apache.org/zookeeper/zookeeper-3.9.3/apache-zookeeper-3.9.3-bin.tar.gz https://dlcdn.apache.org/kafka/3.9.0/kafka_2.12-3.9.0.tgz 一、下载并上…...
微机——8086微处理器的数据传送指令
目录 数据传送指令: 通用数据传送指令: MOV指令: 堆栈操作指令: PUSH指令: POP指令: 交换指令XCHG: XCHG指令: 换码指令XLAT: 换码指令XLAT: 8086 …...
vue3中onUpdated钩子函数和nextTick的具体使用场景和区别
在 Vue 3 中,onUpdated 钩子函数和 nextTick 方法都用于处理 DOM更新后的操作,但它们的使用场景和触发时机有所不同。以下是它们的具体使用场景和区别,结合代码示例进行解释: onUpdated 钩子函数 使用场景:适用于需要…...
colnames看似简单,却能优化数据处理流程
引言 在数据处理和分析中,变量名称是至关重要的,它们决定了数据的可读性和操作的简便性。在R语言中,colnames 函数以其简单的语法设计,提供了高效管理数据框列名的能力,尤其是在复杂的爬虫任务中显得尤为重要。本篇文…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
