CentOS安装sshpass工具-自动化SSH密码认证
sshpass是一个在Linux环境下用于自动化SSH密码认证的工具。
一、功能特点
- 自动化SSH登录:sshpass允许用户在命令行中直接传递密码,从而无需在SSH连接时手动输入密码。这对于自动化脚本和批处理任务非常有用,因为它可以在非交互式环境下完成密码的输入,使得SSH命令可以完全在脚本中运行。
- 多种密码传递方式:sshpass支持从命令行、文件或环境变量中读取密码,提供了多种方式来传递密码,以适应不同的安全需求和场景。
- 远程命令执行:除了自动化SSH登录外,sshpass还可以在登录成功后执行指定的远程命令。
- 交互模式:sshpass在需要时允许交互模式,以便在登录过程中与远程主机进行交互。
二、安装方法
sshpass可以在多种Linux发行版中安装,常用的安装方法包括:
- 使用包管理器安装:对于大多数基于Debian(如Ubuntu)和Red Hat(如CentOS)的发行版,sshpass通常可以通过默认的包管理器直接安装。例如,在Debian/Ubuntu上,可以使用
sudo apt-get update
和sudo apt-get install sshpass
命令进行安装;在Red Hat/CentOS上,则可以使用sudo yum install sshpass
(或对于使用dnf的新版CentOS/RHEL,使用sudo dnf install sshpass
)命令进行安装。 - 从源代码编译安装:如果包管理器中没有sshpass,或者需要安装特定版本的sshpass,可以从源代码编译安装。这通常涉及安装编译依赖、下载并解压源代码、编译和安装等步骤。
三、使用示例
常见使用示例:
- 基本连接操作:假设要连接到远程服务器example.com,用户名是user,密码是password,可以使用
sshpass -p 'password' ssh user@example.com
命令进行连接。 - 使用环境变量传递密码:可以使用环境变量来传递密码,例如
export SSHPASS='password'
,然后使用sshpass -e ssh user@example.com
命令进行连接。 - 从文件中读取密码:如果不希望在命令行中明文显示密码,可以将密码存储在文件中,然后从文件中读取密码。例如,使用
sshpass -f /path/to/password_file ssh user@example.com
命令进行连接。 - 远程执行命令:如果需要在远程服务器上执行命令,但不想手动输入密码,可以使用
sshpass -p 'password' ssh user@example.com 'command_to_execute'
命令。 - 与rsync等工具一起使用:sshpass也可以与其他需要SSH认证的工具一起使用。例如,使用rsync进行文件传输时,可以使用
sshpass -p 'password' rsync -avz /local/path user@example.com:/remote/path
命令。
例如:
sshpass -p ${password} ssh ${ip} -o StrictHostKeyChecking=no "cd ${DIR}; screen -dmSL ${name} -t ${name} env ${cmd}"
这条命令使用了
sshpass
工具来自动化SSH登录过程,并结合了一系列SSH选项和一个要在远程服务器上执行的命令。下面是对这条命令各部分的详细解释:
- sshpass -p ${password}:
sshpass
是一个工具,用于非交互式地提供SSH密码。-p ${password}
选项用于直接在命令行中指定密码,其中${password}
是一个变量,需要在执行命令之前被替换为实际的密码值。- ssh ${ip}:
ssh
是Secure Shell(安全外壳协议)的缩写,用于加密地远程登录到另一台计算机。${ip}
是一个变量,代表要连接的远程服务器的IP地址或主机名。- -o StrictHostKeyChecking=no:
- 这是
ssh
命令的一个选项,用于指定在第一次连接到服务器时不要检查服务器的SSH密钥是否在~/.ssh/known_hosts
文件中。这通常用于自动化脚本中,以避免因密钥不匹配而导致的连接失败。但请注意,这样做会降低安全性,因为它可能会使你容易受到“中间人”攻击。- "cd DIR;screen−dmSL{name} -t nameenv{cmd}":
- 这是要在远程服务器上执行的命令,用引号括起来以确保它作为一个整体被
ssh
命令执行。cd ${DIR}
:改变当前目录到${DIR}
变量指定的路径。screen -dmSL ${name} -t ${name} env ${cmd}
:使用screen
命令在远程服务器上创建一个新的屏幕会话。
-dmS
选项告诉screen
在“分离(detached)”模式下创建一个新的会话,并立即返回命令行,而不是附加到该会话。L
选项用于在会话中启用日志记录(但注意,这里L
后面没有直接跟日志文件的路径,可能是命令的省略或错误;通常L
后面应该跟着日志文件的路径)。${name}
变量用于指定会话的名称。-t ${name}
选项设置会话的标题为${name}
。env ${cmd}
在screen
会话中执行${cmd}
变量指定的命令,并通过env
命令(可能是为了设置或传递环境变量,但这里的使用方式不太标准;通常env
后面会跟具体的环境变量设置,而不是直接跟命令)。注意:
${password}
、${ip}
、${DIR}
、${name}
和${cmd}
都是变量,需要在执行这条命令之前被替换为实际的值。- 使用
sshpass
直接在命令行中传递密码是不安全的,因为它可能会在命令历史、进程列表或其他地方暴露密码。更安全的做法是使用SSH密钥认证。-o StrictHostKeyChecking=no
选项降低了连接的安全性。在生产环境中,最好避免使用它,或者确保你完全信任你要连接的服务器。env ${cmd}
的使用方式可能不是你所期望的。如果你的目的是在screen
会话中设置环境变量并执行命令,你应该以env VAR1=value1 VAR2=value2 command
的形式使用它。如果${cmd}
已经包含了命令和所需的环境变量设置,那么直接使用${cmd}
可能就足够了(不需要前面的env
)。
四、安全性考虑
在使用sshpass时需要注意以下几点:
- 避免在命令行中直接传递密码:尽量使用环境变量或从文件中读取密码的方法,以避免密码在命令行历史记录中暴露。
- 限制密码文件的访问权限:如果将密码存储在文件中,请确保只有特定用户可读该文件。
- 考虑使用更安全的认证方法:对于更安全和方便的SSH连接,建议使用SSH密钥认证而不是密码认证。
1. 检查软件包名称
确保软件包名称正确。在 CentOS/RHEL 中,sshpass
是一个常用的工具,但可能不在默认的软件源中。
(1) 确认软件包名称
yum search sshpass
-
如果没有找到
sshpass
,可能需要启用额外的软件源。
2. 启用 EPEL 仓库
sshpass
通常位于 EPEL(Extra Packages for Enterprise Linux) 仓库中。如果未启用 EPEL 仓库,可以按照以下步骤启用:
(1) 安装 EPEL 仓库
sudo yum install epel-release
(2) 清理缓存
sudo yum clean all sudo yum makecache
(3) 再次安装 sshpass
sudo yum install sshpass
3. 手动下载并安装 sshpass
如果 EPEL 仓库不可用,可以手动下载并安装 sshpass
。
(1) 下载 sshpass
RPM 包
访问 RPMFind 或 PKGS.org,搜索 sshpass
并下载适合你的系统版本的 RPM 包。
(2) 安装 RPM 包
sudo yum install ./sshpass-<version>.rpm
-
替换
<version>
为下载的 RPM 包版本。
4. 使用源码编译安装
如果无法通过包管理器安装,可以从源码编译安装 sshpass
。
(1) 下载源码
wget https://sourceforge.net/projects/sshpass/files/sshpass/1.09/sshpass-1.09.tar.gz
(2) 解压并编译
tar -xzf sshpass-1.09.tar.gz cd sshpass-1.09 ./configure make sudo make install
(3) 验证安装
sshpass -V
5. 检查系统版本
确保你的系统版本支持 sshpass
。sshpass
在较新的 CentOS/RHEL 版本中更容易获取。
(1) 检查系统版本
cat /etc/redhat-release
(2) 更新系统
如果系统版本较旧,建议更新到最新版本:
sudo yum update
6. 其他注意事项
-
权限问题:确保以
root
用户或使用sudo
运行命令。 -
网络问题:确保系统可以访问互联网,能够连接到软件源。
总结
-
如果
sshpass
不在默认仓库中,启用 EPEL 仓库是最简单的解决方法。 -
如果 EPEL 仓库不可用,可以手动下载 RPM 包或从源码编译安装。
相关文章:
CentOS安装sshpass工具-自动化SSH密码认证
sshpass是一个在Linux环境下用于自动化SSH密码认证的工具。 一、功能特点 自动化SSH登录:sshpass允许用户在命令行中直接传递密码,从而无需在SSH连接时手动输入密码。这对于自动化脚本和批处理任务非常有用,因为它可以在非交互式环境下完成…...
js 中 如何获取数组的交集【面试题】
一、数组元素为基本类型:Number、String、等基本类型时 1、使用 Set 和 filter(适用于两个数组) const intersection (arr1, arr2) > {const set new Set(arr2);return [...new Set(arr1)].filter(item > set.has(item)); };将第二…...
value-key 的作用
在 el-autocomplete 组件中,value-key 是一个非常重要的属性,它用于指定选项对象中作为值的字段名。当选项列表是一个包含多个属性的对象数组时,value-key 能帮助组件明确哪个属性是实际要使用的值。比如,选项列表为 [{id: 01, na…...
Spring MVC:从历史演变到实战入门
1. Java Web的发展历史与MVC模式 1.1 Model I与Model II的演进 Model I(JSPJavaBean) 作为早期Java Web开发的主流模式,其核心架构如下: graph LR A[客户端] --> B[JSP页面] B --> C{业务逻辑} C --> D[JavaBean] D -…...
Matlab设置表table的表头
用到matlab的table很好用。经常涉及放入数据,读取数据,下面总结常用的知识点。 1. 把不同数据类型放到同一个表中 想把时间类型和数值类型放到统一table中。困扰的点是,我已经知道了表头名称, 如何批量的为表头命名,…...
预测蓝桥杯16届嵌入式省赛客观题
以下是15道蓝桥杯嵌入式省赛客观题预测,每道题均包含**选项列表**、**答案**和**解析**,格式清晰便于快速查阅: 一、预测1 ### **一、STM32G4硬件基础与外设配置** 1. **STM32G431RBT6的Flash和RAM容量分别为?** **选项**&a…...
综合章节:游戏网络化、模组化与深度扩展
模块一:网络功能与玩家数据同步 目标:实现玩家得分上传、全球排行榜展示及云端数据同步。 # network_manager.py(网络请求封装) import requests import threadingclass NetworkManager:def __init__(self, base_url"http:…...
PostgreSQL:索引与查询优化
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
Android Compose 框架的 ViewModel 委托深入剖析(二十)
Android Compose 框架的 ViewModel 委托深入剖析 一、引言 在 Android 开发中,数据的管理和状态的保存是至关重要的。ViewModel 作为 Android 架构组件的一部分,为我们提供了一种在配置更改(如屏幕旋转)时保存数据和管理 UI 状态…...
android|生成二维码qrcode(android)
1.build.gradle implementation com.google.zxing:core:3.4.1引入zxing库 只是生成的话引入core库就可以了 2.封装方法 import android.graphics.Bitmap; import android.graphics.Color;import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; imp…...
element-plus中el-empty空盒子组件和Collapse 折叠面板组件的使用
一.el-empty空盒子组件的使用 直接复制下面的代码: <el-empty description"description" /> 展示效果: 还可以自定义文字描述: <el-empty description"暂未选择患者"/> 二.Collapse 折叠面板组件的使用 复制…...
Windows 和 Linux 操作系统架构对比以及交叉编译
操作系统与架构兼容性详解 1. 可执行文件格式:PE vs ELF Windows: PE (Portable Executable) 格式 详细解释: PE 格式是 Windows 下的可执行文件标准 包含多个区段(Sections),如代码段、数据段、资源段 文件头包含…...
【区块链安全 | 第一篇】密码学原理
文章目录 1.哈希函数1.1 哈希函数的性质1.2 常见哈希算法1.3 Merkle Tree(默克尔树)1.4 HMAC(哈希消息认证码) 2. 公钥密码学2.1 对称加密 vs 非对称加密2.2 RSA 算法2.3 ECC(椭圆曲线密码学)2.4 Diffie-He…...
3.23[A]linux
gedit 是 GNOME 桌面环境下的文本编辑器,类似于 Windows 中的记事本,但功能更强大,支持语法高亮、多文件编辑等特性。它是一个图形化界面的文本编辑器,适合在需要直观编辑文本文件的场景中使用。 gedit 通常用于编辑配置文件、源代…...
AI革命之下的前端将会如何发展?
一、AI 为前端开发带来的变革 (一)提升开发效率 传统的 Web 前端开发常常面临大量重复性工作,如编写简单表单、布局组件等,这些工作耗时费力且易出错,严重影响开发效率和项目进度。而 AI 的出现,通过自动…...
【2025】基于springboot+vue的农产品商城系统设计与实现(源码、万字文档、图文修改、调试答疑)
项目完整功能以演示视频为准 基于Spring Boot Vue的农产品商城系统设计与实现功能结构图如下: 课题背景 随着互联网的普及和电子商务的快速发展,农产品线上销售成为推动农业现代化和乡村振兴的重要力量。传统的农产品销售模式存在信息不对称、销售渠道单…...
沪深300股指期货的看涨看跌方式是怎样的?
沪深300指数代表了中国A股市场中300家大公司的整体表现。股指期货交易允许老板们预测指数未来的涨跌,并从中获利。 沪深300股指期货基础操作 首先,沪深300股指期货中的看涨操作:老板们可以通过买入沪深300股指期货合约,代码也就是…...
使用selenium来获取数据集
使用selenium来获取数据集 1、下载最新的chrome浏览器与chromedriver.exe 查看chrome的版本,打开谷歌浏览器,点击右上角的三个点,然后点击【帮助】, 点击【关于Google Chrome】 然后去下载同样为134版本号的chromedriver.exe, 网址:https://googlechromelabs.github.…...
MCP(大模型上下文协议)
以下是关于大模型MCP协议(Model Context Protocol)的详细介绍,综合其定义、技术架构、应用场景及行业影响: 一、定义与核心目标 **MCP(Model Context Protocol,模型上下文协议)**是由Anthropic…...
FPGA中串行执行方式之流水线(Pipeline)
FPGA中串行执行方式之流水线(Pipeline) 在FPGA设计中,流水线(Pipeline) 是一种常见的优化技术,用于提高系统的吞吐量和性能。流水线通过将复杂的逻辑分解为多个阶段,每个阶段在一个时钟周期内完成一部分工作,并将中间结果传递到下一阶段。这种方式可以显著提高时钟…...
Python 3.8 Requests 爬虫教程(2025最新版)
遵守网站的爬虫规则、避免爬取敏感信息、保护个人隐私! 一、环境配置与基础验证 # 验证 Python 版本(需 ≥3.8) import sys print(sys.version) # 应输出类似 3.8.12 的信息# 安装 requests 库(若未安装) # 命令行执…...
【深度学习】GAN生成对抗网络:原理、应用与发展
GAN生成对抗网络:原理、应用与发展 文章目录 GAN生成对抗网络:原理、应用与发展1. 引言2. GAN的基本原理2.1 核心思想2.2 数学表达2.3 训练过程 3. GAN的主要变体3.1 DCGAN (Deep Convolutional GAN)3.2 CGAN (Conditional GAN)3.3 CycleGAN3.4 StyleGAN…...
LINUX基础 [三] - 进程创建
目录 前言 进程创建的初次了解(创建进程的原理) 什么是fork函数? 初识fork函数 写时拷贝 fork函数存在的意义 fork调用失败的原因 进程终止 运行完毕结果不正确 main函数返回 库函数函数exit 系统调用接口_exit 进程异常终止 进…...
AI比人脑更强,因为被植入思维模型【24】替身决策思维模型
定义 替身决策思维模型是一种在面对复杂问题或决策情境时,通过将自己代入到不同的角色(即“替身”)中,从这些角色的视角出发去思考、分析和做出决策的思维方式。这种思维模型要求决策者暂时摆脱自身固有的思维定式和立场…...
数据清洗:基于python抽取jsonl文件数据字段
基于python抽取目录下所有“jsonl”格式文件。遍历文件内某个字段进行抽取并合并。 import os import json import time from tqdm import tqdm # 需要先安装:pip install tqdmdef process_files():# 设置目录路径dir_path r"D:\daku\关键词识别\1623-00000…...
spring后端处理各种请求
在Spring MVC中处理JSON请求和返回JSON消息的步骤如下: 1. 添加依赖 确保项目中包含处理JSON的库,如Jackson。 Maven配置(pom.xml): <dependency><groupId>com.fasterxml.jackson.core</groupId>…...
企业级部署zabbix分布式监控系统
目录 一、Zabbix分布式监控系统介绍 1.什么是“Zabbix” 2.Zabbix分布式监控系统的特点 3.Zabbix分布式监控系统的原理 4.Zabbix分布式监控系统的运用 5. Zabbix分布式监控系统的部署顺序 二、搭建 1.设备硬件配置参考 2.zabbix分布式监控系统各节点设备名称和IP规划 …...
OkHttp 的证书设置
在 Android 开发中,通过 OkHttp 自定义 SSLSocketFactory 和 X509TrustManager 可以有效增强 HTTPS 通信的安全性,防止中间人攻击(如抓包工具 Charles/Fiddler 的拦截)。以下是实现防抓包的关键技术方案: 一、Okhttp设…...
ETL:数据清洗、规范化和聚合的重要性
在当今这个数据呈爆炸式增长的时代,数据已成为企业最为宝贵的资产之一。然而,数据的海量增长也伴随着诸多问题,如数据来源多样、结构复杂以及质量问题等,这些问题严重阻碍了数据的有效处理与深度分析。在此背景下,ETL&…...
蓝桥杯备考:图的遍历
这道题乍一看好像没什么不对的,但是!但是!结点最大可以到10的5次方!!!我们递归的时间复杂度是很高的,我们正常遍历是肯定通过不了的,不信的话我们试一下 #include <iostream>…...
【多媒体交互】Unity Kinect实现UI控件的点击
在Unity中,通过Kinect实现UI控件的点击功能,主要涉及手部追踪、坐标映射和手势检测三个核心环节。 实现步骤 初始化Kinect与关节追踪 使用KinectManager获取用户ID和手部关节点(如JointType.HandLeft)的坐标。 long userId _…...
QinQ项展 VLAN 空间
随着以太网技术在网络中的大量部署,利用 VLAN 对用户进行隔离和标识受到很大限制。因为 IEEE802.1Q 中定义的 VLAN Tag 域只有 12 个比特,仅能表示 4096 个 VLAN,无法满足城域以太网中标识大量用户的需求,于是 QinQ 技术应运而生。…...
OBS虚拟背景深度解析:无需绿幕也能打造专业教学视频(附插件对比)
想要录制教学视频却苦于背景杂乱?本文将手把手教你用OBS实现专业级虚拟背景效果,无需绿幕也能轻松营造沉浸式教学场景。文末附6个提升画面质感的免费背景资源! 一、虚拟背景的核心价值:从「教师宿舍」到「虚拟讲堂」的蜕变 我们调…...
26考研——图(6)
408答疑 文章目录 一、图的基本概念二、图的存储三、图的遍历四、图的应用五、图的代码实操六、参考资料鲍鱼科技课件26王道考研书 七、总结图的存储结构邻接矩阵邻接表 图的遍历图的相关概念完全图和连通图图的连通性 关键路径学习建议 一、图的基本概念 文章链接: link 二、…...
Redis常用数据类型深度解析:从理论到最佳实践
Redis常用数据类型深度解析:从理论到最佳实践 一、引言二、Redis数据类型全景图三、核心数据类型详解**1. String(字符串)****2. Hash(哈希表)****3. List(列表)****4. Set(集合&…...
DeepSeek-V3 模型更新,加量不加价
DeepSeek V3-0324 是 DeepSeek V3 系列的重要升级版本,虽然被官方称为「小版本迭代」,但其在技术能力、开源策略和用户体验上均有显著提升。以下是主要新特性功能和核心变化: 推理能力 基准测试性能显著提升: MMLU-Pro࿱…...
Vue项目的 Sass 全局基础样式格式化方案,包含常见元素的样式重置
步骤 1:创建全局样式文件 在项目中创建文件:src/assets/scss/global.scss 内容如下: // 全局盒模型设定(边框计入宽高) *, *::before, *::after {box-sizing: border-box;margin: 0;padding: 0; }// 基础元素样式重置…...
【Spring篇】Spring的生命周期
一、Bean 生命周期的核心阶段 1. 实例化(Instantiation) • 触发时机:容器启动时(单例 Bean)或请求时(原型 Bean)。 • 实现方式: 通过反射(Class.newInstance() 或构造…...
Qt中通过QLabel实时显示图像
Qt中的QLabel控件用于显示文本或图像,不提供用户交互功能。以下测试代码用于从内置摄像头获取图像并实时显示: Widgets_Test.h: class Widgets_Test : public QMainWindow {Q_OBJECTpublic:Widgets_Test(QWidget *parent nullptr);~Widgets…...
[数据结构]1.时间复杂度和空间复杂度
这里写目录标题 1. 算法复杂度2. 时间复杂度2.1 执行次数2.2 大O渐进表示法2.3 常见时间复杂度计算eg1eg2eg3eg4eg5eg6eg7eg8eg9 3. 空间复杂度eg1eg2eg3eg4 4. 常见复杂度对比5. 复杂度练习eg1 1. 算法复杂度 衡量一个算法的好坏,一般是从时间空间两个维度来衡量&…...
【每日算法】Day 6-1:哈希表从入门到实战——高频算法题(C++实现)
摘要 :掌握高频数据结构!今日深入解析哈希表的核心原理与设计实现,结合冲突解决策略与大厂高频真题,彻底掌握O(1)时间复杂度的数据访问技术。 一、哈希表核心思想 哈希表(Hash Table) 是一种基于键值对的…...
物联网平台架构介绍
物联网是连接物理设备、传感器、软件等的网络系统,使设备能够自动收集、交换和处理数据,实现智能化识别、定位、跟踪、监控和管理。随着物联网技术的飞速发展,物联网平台架构的设计变得至关重要,它决定了物联网系统的性能、可扩展…...
TCP/IP三次握手的过程,为什么要3次?
一:过程 第一次(SYN): 客户端发送一个带有SYN标志的TCP报文段给服务器,设置SYN1,并携带初始序列号Seqx(随机值),进入SYN_SENT状态。等待服务器相应。 第二次(…...
开源模型应用落地-语音转文本-whisper模型-AIGC应用探索(四)
一、前言 语音转文本技术具有重要价值。它能提高信息记录和处理的效率,使人们可以快速将语音内容转换为可编辑、可存储的文本形式,方便后续查阅和分析。在教育领域,可帮助学生更好地记录课堂重点;在办公场景中,能简化会议记录工作。同时,该技术也为残障人士提供了便利,让…...
Qt开发:QInputDialog的使用
文章目录 一、QInputDialog的介绍二、 QInputDialog的基本用法三、使用 QInputDialog的实例四、QInputDialog的信号与槽 一、QInputDialog的介绍 QInputDialog 是 Qt 提供的一个对话框类,用于获取用户输入的文本、整数或浮点数。它提供了简单易用的静态方法和可定制…...
【系统架构设计师】软件质量管理
目录 1. 说明2. 软件质量保证2.1 说明2.2 质量保证的主要目标2.3 目标2.4 主要作用2.5 主要任务 3. 软件质量保证3.1 说明3.2 ISO 90003.3 CMM 4. 例题4.1 例题1 1. 说明 1.软件质量就是软件与明确地和隐含地定义的需求相一致的程度,更具体地说,软件质量…...
医院挂号预约小程序|基于微信小程序的医院挂号预约系统设计与实现(源码+数据库+文档)
医院挂号预约小程序 目录 基于微信小程序的医院挂号预约系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、小程序用户端 2、系统服务端 (1) 用户管理 (2)医院管理 (3)医生管理 …...
UE4-UE5虚幻引擎,前置学习一--Console日志输出经常崩溃,有什么好的解决办法
有些差异 这么牛逼的引擎,居然有这种入门级别的问题,一触发清理,大概率(80%)会崩溃 无论虚幻5还是UE4都有这个问题,挺烦人的 实在忍不了了,这次,今天 就想问问有什么好的处理方法么?&#x…...
javaSE.多维数组
1 final 引用类型 final int[] arr 继承Object 的引用类型,不能改变引用的对象 存的其实是引用 数组类型数组,其实存的是引用 int [][] arr new int[][] { {1,2,3}, {4,5,6} };int [] a arr[0]; int [] b arr[1];...
Linux输入系统应用编程
什么是输入系统 Linux 输入系统是处理用户输入设备(如键盘、鼠标、触摸屏、游戏手柄等)的软件架构。在应用编程层面,它提供了与这些输入设备交互的接口。 主要组成部分 输入设备驱动层:直接与硬件交互的驱动程序 输入核心层:内核中的输入子…...