Linux下在终端输入密码隐藏方法
Linux系统中,如何将在终端输入密码时将密码隐藏?
最近做简单的登录界面时,不做任何操作的话,在终端输入密码的同时也会显示输入的密码是什么,这样对于隐蔽性和使用都有不好的体验。那么我就想到将密码用字符'*'隐藏起来,这样看起来才像一个完整的登录界面。
当然,使用QT做登录界面隐藏密码就没有这么麻烦,在本文中,仅作为乐趣供读者参考。
1. 首先来看看实现效果是怎么样的:

在该程序中,我输入了密码是123456,它在输入的同时也将密码用星号'*'代替了,密码也不会丢失,仍然保存在数组中,所以第二行就能完整显示密码。
2. 实现分析
实现隐藏密码的方法就两个过程。第一,使自己在终端输入的字符不显示;第二,在终端上同步输入星号'*'。在终端上输入等量的星号'*'并不难,但是我们要同时让,自己在键盘上输入的字符不显示在终端上,那么,如何让自己输入的字符不显示在终端上,也能存入内存中呢?我们需要禁用回显和行缓冲。
回显:使键盘输入的字符立即显示到终端上;行缓冲:使输入的数据存储到缓冲区中,直到用户输入回车键后才会被传递给程序。这意味着在输入密码时,密码会被暂时存储在缓冲区中,可能会被其他程序截获。禁用行缓冲模式可以避免密码被截获。
3. 函数介绍
经过上述的分析,接下来介绍一个函数,来实现上述的要求。
头文件:
#include <termios.h>
该头文件定义了一个termios结构体,可以使用tcgetattr和tcsetattr函数来获取和设置终端属性。通过设置终端的输入模式,可以实现在输入密码时用星号代替。
禁用回显和行缓冲的代码演示:
// 禁用终端回显和行缓冲struct termios old_term, new_term;tcgetattr(STDIN_FILENO, &old_term); // 获取当前终端属性,存储到old_term中new_term = old_term;new_term.c_lflag &= ~(ECHO | ICANON); // 禁用回显和行缓冲两个属性tcsetattr(STDIN_FILENO, TCSANOW, &new_term);
- 先定义两个结构体,分别代表两种模式。
- 使用tcgetattr函数获取当前属性,以保证可以回到旧属性。
- 赋值
- 将新属性中的回显和行缓冲两个属性禁用,ECHO表示是否回显输入字符,ICANON表示是否启用行缓冲模式。
- 使用tcsetattr函数使用新属性,TCSANOW参数表示立即生效。
在4中,(ECHO | ICANON)表示将ECHO和ICANON标志位置反,即将它们的值从1变为0,再使用&运算符将new_term.c_lflag中的ECHO和ICANON标志位设置为0,而保留其他标志位的值不变。
这样就实现了在键盘上输入但不显示到终端的方法。
4. 输入星号'*'
while((ch = getchar()) != '\n' && i < MAX) {pwd[i++] = ch;printf("*");}
每读取一个字符,都会输出一个星号'*',保证了星号和键盘输入同步进行。
5. 完整代码
#include <stdio.h>
#include <termios.h>
#include <unistd.h>#define MAX 20int main(void)
{char pwd[MAX+1];int i = 0;char ch;// 禁用终端回显和行缓冲struct termios old_term, new_term;tcgetattr(STDIN_FILENO, &old_term);new_term = old_term;new_term.c_lflag &= ~(ECHO | ICANON); // 禁用回显和行缓冲两个属性tcsetattr(STDIN_FILENO, TCSANOW, &new_term);printf("Enter password : ");while((ch = getchar()) != '\n' && i < MAX) {pwd[i++] = ch;printf("*");}pwd[i] = '\0';printf("\nYour password is %s\n", pwd);// 恢复终端属性tcsetattr(STDIN_FILENO, TCSANOW,&old_term);return 0;
}
相关文章:
Linux下在终端输入密码隐藏方法
Linux系统中,如何将在终端输入密码时将密码隐藏? 最近做简单的登录界面时,不做任何操作的话,在终端输入密码的同时也会显示输入的密码是什么,这样对于隐蔽性和使用都有不好的体验。那么我就想到将密码用字符*隐藏起来…...
【ARM 常见汇编指令学习 3 -- ARM64 无符号位域提取指令 UBFX】
文章目录 ARM64 无符号位域提取指令 上篇文章:ARM 常见汇编指令学习 2 – 存储指令 STP 与 LDP 下篇文章:ARM 常见汇编指令学习 4 – ARM64 比较指令 cbnz 与 b.ne 区别 ARM64 无符号位域提取指令 在代码中如何监控寄存器的某1bit, 或者某几…...
求分享如何批量压缩视频的容量的方法
视频内存过大,不但特别占内存,而且还会使手机电脑出现卡顿的现象,除此之外,如果我们想发送这些视频文件可能还会因为内存太大无法发送。因此,我们可以批量地压缩视频文件的内存大小,今天小编要来分享一招&a…...
ChatGPT 是如何工作的:从预训练到 RLHF
欢迎来到人工智能的未来:生成式人工智能!您是否想知道机器如何学习理解人类语言并做出相应的反应?让我们来看看ChatGPT ——OpenAI 开发的革命性语言模型。凭借其突破性的 GPT-3.5 架构,ChatGPT 席卷了世界,改变了我们…...
KafKa脚本操作
所有操作位于/usr/local/kafka_2.12-3.5.1/bin。 rootubuntu2203:/usr/local/kafka_2.12-3.5.1/bin# pwd /usr/local/kafka_2.12-3.5.1/bin rootubuntu2203:/usr/local/kafka_2.12-3.5.1/bin# ls connect-distributed.sh kafka-delegation-tokens.sh kafka-mirror-mak…...
【自动化运维】playbook剧本
目录 一、Ansible 的脚本 playbook 剧本1.1playbooks的组成 二、剧本编写实验2.1定义、引用变量2.2使用远程主机sudo切换用户2.3whenn条件判断2.4迭代 三、Templates 模板四、Tags模板 一、Ansible 的脚本 playbook 剧本 1.1playbooks的组成 (1)Tasks&…...
java中双引号和单引号的区别
起因 刷题的时候,有判断是否相同的情况,然后我发现单引号和双引号在上的表现不一样,所以记录一下。 解释 在Java中,双引号(" ")和单引号(’ )在使用上有很重要的区别&a…...
jenkinsfile指定jenkins流水线的构建号
背景 升级Jenkins过程中不小心导致流水线配置文件job目录丢失, 重新配置流水线后所有流水线构建号码都从1开始构建了, 然而我们的产品关联了jenkins构建号,重新从1 构建会导致各种问题. 解决方案 在Jenkinsfile文件中指定流水线的构建号为一个不存在的数字, 这样就不会冲突了…...
微信小程序:实现提示窗确定,取消执行不同操作(消息提示确认取消)showModal
效果 代码 wx.showModal({title: 提示,content: 是否确认退出,success: function (res) {if (res.confirm) {console.log(用户点击确定)} else if (res.cancel) {console.log(用户点击取消)}}})...
深度学习论文: Q-YOLO: Efficient Inference for Real-time Object Detection及其PyTorch实现
深度学习论文: Q-YOLO: Efficient Inference for Real-time Object Detection及其PyTorch实现 Q-YOLO: Efficient Inference for Real-time Object Detection PDF: https://arxiv.org/pdf/2307.04816.pdf PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代…...
解读随机森林的决策树:揭示模型背后的奥秘
一、引言 随机森林[1]是一种强大的机器学习算法,在许多领域都取得了显著的成功。它由多个决策树组成,而决策树则是构建随机森林的基本组件之一。通过深入解析决策树,我们可以更好地理解随机森林模型的工作原理和内在机制。 决策树是一种树状结…...
OceanMind海睿思获评中国信通院“内审数字化产品评测”卓越级(最高级)!
2023年7月27日,由中国内部审计协会、中国通信标准化协会指导,中国信息通信研究院主办的第二届数字化审计论坛在北京成功召开。 大会聚焦内部审计数字化领域先进实践、研究成果、行业发展举措,重磅发布了多项内部审计数字化领域的最新研究和实…...
TPlink云路由器界面端口映射设置方法?快解析内网穿透能实现吗?
有很多网友在问:TPlink路由器端口映射怎么设置?因为不懂端口映射的原理,所以无从下手,下面小编就给大家分享TPlink云路由器界面端口映射设置方法,帮助大家快速入门TP路由器端口映射设置方法。 1.登录路由器管理界面&a…...
css3的filter图片滤镜使用
业务介绍 默认:第一个图标为选中状态,其他三个图标事未选中状态 样式:选中状态是深蓝,未选中状体是浅蓝 交互:鼠标放上去选中,其他未选中,鼠标离开时候保持当前选中状态 实现:目前…...
❤️创意网页:打造炫酷网页 - 旋转彩虹背景中的星星动画
✨博主:命运之光 🌸专栏:Python星辰秘典 🐳专栏:web开发(简单好用又好看) ❤️专栏:Java经典程序设计 ☀️博主的其他文章:点击进入博主的主页 前言:欢迎踏入…...
react常用知识点
React是一个用于构建用户界面的JavaScript库。以下是React常用的知识点: 组件:React将用户界面分解成小而独立的组件,每个组件都有自己的状态和属性,并且可以通过组合这些组件来构建复杂的用户界面。 // 函数组件示例 function We…...
iOS开发-QLPreviewController与UIDocumentInteractionController显示文档
iOS开发-QLPreviewController与UIDocumentInteractionController显示文档 在应用中,我们有时想预览文件, 可以使用QLPreviewController与UIDocumentInteractionController 一、QLPreviewController与UIDocumentInteractionController QLPreviewController是一个 UIViewContr…...
八、用 ChatGPT 帮助排查生产事故
目录 一、实验介绍 二、背景 三、故障排查概述 3.1 生产环境故障排查涉及的角色...
WPF实战学习笔记25-首页汇总
注意:本实现与视频不一致。本实现中单独做了汇总接口,而视频中则合并到国todo接口当中了。 添加汇总webapi接口添加汇总数据客户端接口总数据客户端接口对接3首页数据模型 添加数据汇总字段类 新建文件MyToDo.Share.Models.SummaryDto using System;…...
FreeRTOS源码分析-7 消息队列
目录 1 消息队列的概念和作用 2 应用 2.1功能需求 2.2接口函数API 2.3 功能实现 3 消息队列源码分析 3.1消息队列控制块 3.2消息队列创建 3.3消息队列删除 3.4消息队列在任务中发送 3.5消息队列在中断中发送 3.6消息队列在任务中接收 3.7消息队列在中断中接收 1 消…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
