当前位置: 首页 > news >正文

在C语言中使用伪终端与bash交互

  1. 了解伪终端概念
    • 伪终端(PTY)由一对设备组成:主设备(master)和从设备(slave)。数据写入主设备会出现在从设备,反之亦然。这允许一个进程通过主设备与另一个进程(如bash)通过从设备进行通信。
  2. 相关函数
    • openpty:用于创建伪终端对。其原型为int openpty(int *amaster, int *aslave, char *name, const struct termios *termp, const struct winsize *winp)amasteraslave是指向文件描述符的指针,分别用于主设备和从设备;name可用于获取从设备的路径名;termp可用于设置终端属性;winp可用于设置窗口大小。
    • fork:创建一个新进程,子进程通常用于执行bash,父进程用于与伪终端主设备交互。
    • dup2:在子进程中用于将标准输入、输出和错误重定向到伪终端从设备。
    • writeread:用于在父进程中向伪终端主设备写入命令,并读取bash的输出。
  3. 示例代码
#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;
}
  1. 代码解释
    • 创建伪终端对:使用openpty创建伪终端主设备master和从设备slave
    • 终端设置:保存当前终端设置oldtty,并修改为非规范模式newtty,这样可以实时读取输入而无需等待换行符。
    • 设置非阻塞模式:将伪终端主设备设置为非阻塞模式,以便在读取输出时不会阻塞。
    • 进程创建:通过fork创建子进程,子进程执行bash,父进程与伪终端主设备交互。
    • 子进程操作:关闭master,将标准输入、输出和错误重定向到slave,然后执行bash
    • 父进程操作:关闭slave,向master写入命令(如ls\n),循环读取并打印bash的输出,等待子进程结束,最后恢复终端设置。

这样,通过上述代码,你可以在C语言程序中使用伪终端与bash进行交互。

相关文章:

在C语言中使用伪终端与bash交互

了解伪终端概念&#xff1a; 伪终端&#xff08;PTY&#xff09;由一对设备组成&#xff1a;主设备&#xff08;master&#xff09;和从设备&#xff08;slave&#xff09;。数据写入主设备会出现在从设备&#xff0c;反之亦然。这允许一个进程通过主设备与另一个进程&#xff…...

阿里云 人工智能与机器学习

阿里云的 人工智能&#xff08;AI&#xff09;与机器学习&#xff08;ML&#xff09; 服务为企业提供了全面的AI解决方案&#xff0c;帮助用户在多个行业实现数据智能化&#xff0c;提升决策效率&#xff0c;推动业务创新。阿里云通过先进的技术和丰富的工具&#xff0c;支持用…...

HTML 显示器纯色亮点检测工具

HTML 显示器纯色亮点检测工具 相关资源文件已经打包成html等文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Html相关程序案例&#xff0c;秉着开源精神的想法&#xff0c;望大家喜欢&#…...

【漏洞分析】UDF提权漏洞——CVE-2016-6662-MySQL ‘malloc_lib’变量重写命令执行

0x00 前言 最近在做渗透笔记&#xff0c;其中有一个靶机在getshell后&#xff0c;需要进行提权。发现靶机使用root启动的mysql服务&#xff0c;那么尝试使用UDF提权。于是在提权成功后&#xff0c;花了一天时间特意搜了一下整个UDF提权的漏洞原理和利用&#xff0c;加深理解。…...

Mybatis(day09)

Mybatis基础操作 功能列表&#xff1a; 查询 根据主键ID查询 条件查询新增更新删除 根据主键ID删除 根据主键ID批量删除 准备 实施前的准备工作&#xff1a; 准备数据库表创建一个新的 springboot 工程&#xff0c;选择引入对应的起步依赖&#xff08;mybatis、mysql 驱动、…...

模式识别与机器学习 | 十一章 概率图模型基础

隐马尔科夫模型&#xff08;Hidden Markov Model,HMM&#xff09; HMM是建模序列数据的图模型 1、第一个状态节点对应一个初始状态概率分布 2、状态转移矩阵A, 3、发射矩阵概率B 4、对特定的&#xff08;x,y&#xff09;的联合概率可以表示为 α递归计算——前向算法β递归…...

深圳知识产权保护中心再发力,两大产业专利预审服务全新升级

在当今科技迅猛发展、市场竞争日益激烈的时代&#xff0c;知识产权保护对于产业发展的重要性不言而喻。深圳知识产权保护中心又有大动作&#xff0c;为高端装备制造和珠宝加工产业带来了专利预审服务的新突破。这一举措不仅为这两个产业注入了强大的发展动力&#xff0c;也为深…...

同步与并发:Java的同步舞蹈

现在&#xff0c;我们将深入探讨同步与并发&#xff0c;这是确保多线程程序正确性和效率的关键&#xff0c;就像是Java的同步舞蹈。 1 并发的概念 并发是指在多处理器系统中&#xff0c;多个操作或多个线程同时进行执行。在Java中&#xff0c;这意味着能够有效地利用多核处理…...

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&#xff08;k8s&#xff09;系统中可以创建和管理的最小单元&#xff0c;是资源对象模型中由用户创建或部署的最小资源对象模型‌。Pod是由一个或多个容器组成的&#xff0c;这些容器共享存储和网络资源&#xff0c;可以看作是一个逻辑的主机‌。…...

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 新特性和命令的更详细解读和实际用例分析&#xff0c;帮助更好地理解它们的作用及适用场景&#xff1a; 1. git switch 和 git restore 背景&#xff1a; 传统上&#xff0c;git checkout 是一个多功能命令&#xff0c;用于切换分支、检出文件、创建分支等&…...

自闭症家庭:建立支持系统与平衡生活

在自闭症家庭的世界里&#xff0c;每一天都充满了挑战与希望。自闭症&#xff0c;这一复杂的神经发育障碍&#xff0c;不仅影响着孩子的成长轨迹&#xff0c;也对整个家庭的生活方式产生了深远的影响。面对这一挑战&#xff0c;许多家庭都在努力寻找有效的支持系统和平衡生活的…...

html+css+js网页设计 美食 美食天下2个页面(里面包含php和mysql)

htmlcssjs网页设计 美食 美食天下2个页面&#xff08;里面包含php和mysql&#xff09; 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编…...

高阶知识库搭建实战七、(知识库雏形开发:qianwen-plus+Faiss)(练习推荐)

构建知识库:结合Faiss和qianwen-plus大模型的实践 环境搭建参考前面几篇文章:基础环境搭建、Faiss向量数据库安装 在当今信息爆炸的时代,如何高效地管理和检索海量知识成为了一个重要课题。知识库的构建为我们提供了一种有效的解决方案,它能够将分散的信息整合起来,方便…...

麒麟服务器安装kafka--亲测

我这安装的是单机版本的&#xff1a; 下载地址&#xff1a;Index of /kafka/3.9.0 我下载的是&#xff1a;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微处理器的数据传送指令

目录 数据传送指令&#xff1a; 通用数据传送指令&#xff1a; MOV指令&#xff1a; 堆栈操作指令&#xff1a; PUSH指令&#xff1a; POP指令&#xff1a; 交换指令XCHG&#xff1a; XCHG指令&#xff1a; 换码指令XLAT&#xff1a; 换码指令XLAT&#xff1a; 8086 …...

vue3中onUpdated钩子函数和nextTick的具体使用场景和区别

在 Vue 3 中&#xff0c;onUpdated 钩子函数和 nextTick 方法都用于处理 DOM更新后的操作&#xff0c;但它们的使用场景和触发时机有所不同。以下是它们的具体使用场景和区别&#xff0c;结合代码示例进行解释&#xff1a; onUpdated 钩子函数 使用场景&#xff1a;适用于需要…...

colnames看似简单,却能优化数据处理流程

引言 在数据处理和分析中&#xff0c;变量名称是至关重要的&#xff0c;它们决定了数据的可读性和操作的简便性。在R语言中&#xff0c;colnames 函数以其简单的语法设计&#xff0c;提供了高效管理数据框列名的能力&#xff0c;尤其是在复杂的爬虫任务中显得尤为重要。本篇文…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...