Linux系统的历史记录添加时间和IP信息

1 为什么要优化系统历史记录

对于linux系统,默认情况下,系统记录的历史命令比较简单。某些历史记录可能也无法正常保存,因此当服务器出现异常,希望通过历史命令来了解曾经做了哪些操作时,往往非常被动,下面就给大家介绍如何通过系统内置的变量来优化历史记录,使得查看历史记录更加方便。

2 HISTSIZE和HISTFILESIZE

当在终端上执行历史命令时,Bash 会读取内存中的副本显示已执行命令的历史记录。最后,当 shell 退出时,它会将内存中的内容写回到磁盘上HISTFILE环境变量指向的文件中。

默认情况下,内容存储在位于用户主目录的.bash_history文件中。

[root@k8s-master01 ~]# echo $HISTFILE
/root/.bash_history

HISTSIZE变量中设置的值是可以在内存中存储的最大历史行数。

HISTFILESIZE变量控制可以写回到磁盘上的历史文件的最大行数。

可以简单理解为HISTSIZE变量定义的是执行history命令时可以看到的命令数,HISTFILESIZE变量定义的是保存到磁盘中的history记录数。

[root@k8s-master01 ~]# echo $HISTSIZE
1000
[root@k8s-master01 ~]# 
[root@k8s-master01 ~]# echo $HISTFILESIZE
1000

3 HISTCONTROL

使用HISTCONTROL变量,我们可以控制 bash 如何存储已执行命令的历史记录。

在命令行工作时,我们经常会多次执行某些相同的命令。默认历史记录大小为 500,相同命令的重复次数太多会填满历史记录,并使历史记录变得无用。当然我们可以使用上一小节提到的HISTSIZE 或HISTFILESIZE增加历史列表的大小。

另一种选择是告诉 bash 不要存储重复项。这是通过HISTCONTROL变量完成的。 HISTCONTROL控制 bash 如何存储命令历史记录。目前有两个可能的标志:ignorespace 和ignoredups。ignorespace标志告诉 bash 忽略以空格开头的命令。另一个标志ignoredups告诉 bash 忽略重复项。如果您希望指定两个值,则可以用冒号 ignorespace:ignoredups连接和分隔值,或者您可以只指定ignoreboth。

常用的HISTCONTROL变量有

  • ignoredups 默认,忽略重复命令
  • ignorespace 忽略所有一空格开头的命令
  • ignoreboth ignoredups 和 ignorespace 的组合
  • erasedups 删除历史记录中重复命令,相同的指令仅保留最近的一个

如果同时设定多个选项,中间使用冒号。如:HISTCONTROL=ignorespace:erasedups

[root@k8s-master01 ~]# export |grep -i histc
declare -x HISTCONTROL="ignoredups"

4 HISTTIMEFORMAT

Linux 中的 bash shell 允许我们访问命令历史记录,即使用 history 命令按顺序执行的命令列表。history 命令用于跟踪所有已执行的命令。这在故障排除或审计期间非常重要。没有设置 HISTTIMEFORMAT 的历史命令只显示 command# 和 command 但不显示命令执行的时间。因此,要显示与每个历史条目关联的时间戳信息,必须设置 HISTTIMEFORMAT。

[root@k8s-master01 ~]# HISTTIMEFORMAT="%F %T "  #历史记录中加上年月日及时间
[root@k8s-master01 ~]# history |head -101  2023-07-16 23:03:51 df2  2023-07-16 23:03:51 yum install vim wget git strace3  2023-07-16 23:03:51 yum install net-tools4  2023-07-16 23:03:51 df5  2023-07-16 23:03:51 top6  2023-07-16 23:03:51 history7  2023-07-16 23:03:51 ls8  2023-07-16 23:03:51 vim ifcfg-eth09  2023-07-16 23:03:51 df10  2023-07-16 23:03:51 vim /etc/selinux/config

可以看到时间都是一样的,是定义变量后的时间,这属于正常现象,因为之前的记录并没有记录时间。后续的历史命令将会记录上执行时间。

5 PROMPT_COMMAND

在出现 shell 命令输入提示符之前,作为命令来执行这个变量。

[root@k8s-master01 ~]# export PROMPT_COMMAND="date '+%F %T'"
2022-11-21 13:11:43 # 在出现下面的提示符之前执行了 date 命令
[root@k8s-master01 ~]# ls
anaconda-ks.cfg  hosts  k8s-ha-install  kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm  kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm  kubeadm-config.yaml  new.yaml  rook
2022-11-21 13:11:48 # 再次出现
[root@k8s-master01 ~]# a
-bash: a: command not found
2022-11-21 13:11:51 # 每次命令行提示符出现之前它都会出现
[root@k8s-master01 ~]# 

通过上面介绍的这些变量,我们可以实现将历史命令收集到文件中,实现方式如下。

[root@k8s-master01 ~]# mkdir -p /var/log/history.d
[root@k8s-master01 ~]# echo 'export PROMPT_COMMAND="(umask 000; msg=\$(history 1 | { read x y; echo \$y; }); echo [\$(who am i | awk \"{print \\\$(NF-2),\\\$(NF-1),\\\$NF}\")] [\$(whoami)@\`pwd\`]\" \$msg\" >>/var/log/history.d/history)"' >> /etc/profile
[root@k8s-master01 ~]# source /etc/profile
[root@k8s-master01 ~]# tailf /var/log/history.d/history
[2023-07-16 23:03 (172.20.15.57)] [root@/root] source /etc/profile
[2023-07-16 23:03 (172.20.15.57)] [root@/root] history
[2023-07-16 23:03 (172.20.15.57)] [root@/root] tailf /var/log/history.d/history
[2023-07-16 23:03 (172.20.15.57)] [root@/root] docker ps
[2023-07-16 23:03 (172.20.15.57)] [root@/root] hsit
[2023-07-16 23:03 (172.20.15.57)] [root@/root] history
[2023-07-16 23:03 (172.20.15.57)] [root@/root] history
[2023-07-16 23:03 (172.20.15.57)] [root@/root] ssh 172.31.250.110
[2023-07-16 23:03 (172.20.15.57)] [root@/root] 2023-07-16 23:05:30 HISTTIMEFORMAT="%F %T "
[2023-07-16 23:03 (172.20.15.57)] [root@/root] 2023-07-16 23:05:41 history |head -10

可以看到,导入变量后,记录了历史命令的执行时间,登录ip、执行用户,以及具体命令等信息。这样完备的历史命令记录对于后期的问题排查是非常有益的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/688351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[计算机网络]深度学习传输层TCP协议

💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录专栏:深度学习传输层TCP协议 🎉欢迎大家点赞👍评论📝收藏⭐文章 [计算机网络]深度学习传输层TCP协议 前提概括一: TCP协议段格式二:确认应答三:超时重传四:…

开源软件的商业模式

开源软件(Open Source Software, OSS)是指源代码公开的软件,任何人都可以查看、修改和分发这些软件的源代码。开源软件的商业模式与传统商业软件有所不同,它更多地依赖于社区协作、品牌建设和专业服务等方式来实现商业价值。 社区…

SpringBoot + Lua = 王炸!

曾经有一位魔术师,他擅长将Spring Boot和Redis这两个强大的工具结合成一种令人惊叹的组合。他的魔法武器是Redis的Lua脚本。 今天,我们将揭开这个魔术师的秘密,探讨如何在Spring Boot项目中使用Lua脚本,以解锁新的可能性和提高性能。如果你一直在寻找提升你的应用程序的方…

数论 - 质数和约数

文章目录 前言一、质数1.质数的判定-试除法2.分解质因子-试除法3.筛选质数 二、约数1.求约数-试除法2.约数的个数3.约数之和4.最大公约数-欧几里得算法 前言 本章博客将介绍质数和约数的常用模板,这些题目都比较简单,都可以通过暴力获取答案,…

vivado RAM HDL Coding Techniques

Vivado synthesis可以解释各种RAM编码风格,并将它们映射到分布式RAM中或块RAM。此操作执行以下操作: •无需手动实例化RAM基元 •节省时间 •保持HDL源代码的可移植性和可扩展性从编码示例下载编码示例文件。 在分布式RAM和专用RAM之间的选择块存储器…

基于SSM的电影购票系统(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的电影购票系统(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring Spri…

AI趋势(01)人工智能发展史简介

说明:简要解读AI的发展历史 1 AI的早期起源(1950 年代-1960 年代) 1.1 人工智能的概念提出 人工智能的概念最早可以追溯到上世纪50年代,当时计算机科学家John McCarthy提出了“人工智能”这一概念,并于1956年在美国达…

十大经典排序算法之一--------------堆排序(java详解)

一.堆排序基本介绍: 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。堆是具有以下性质的完全二叉树:每个…

C语言猜数字小游戏智能版

不仅有对错&#xff0c;还有评分系统&#xff0c;根据回答的次数给予合适的反馈。此代码适合linux和安卓系统&#xff0c;如果windows想用得删除\033[xxm之类的ANSI打印转义字符&#xff0c;换成windows对应的清屏、切换颜色函数 #include<stdio.h> #include <stdlib…

LTE-M与NB-IoT蜂窝物联网

大规模、高速连接的部署需要大量带宽的支持。而蜂窝低功耗广域 (LPWA)技术为传感器和短数据突发交易设备在快速的、以 5G 为中心的技术世界中的不间断运行让路。长期演进机器类型通信 (LTE-M) 和窄带物联网 (NB-IoT)等移动物联网技术提供安全且经济高效的蜂窝 LPWA 功能。它们是…

内存基础知识

内存作用&#xff1a;用来存放数据 int x10&#xff1b; xx1&#xff1b; 这会生成一个可执行文件&#xff08;装入模块&#xff09;然后存入内存地址中 绝对装入&#xff1a;-如果知道程序放到内存中哪个位置&#xff0c;编译程序将产生绝对地址的目标代码 可重定位装入&am…

汽车零部件软件开发中常用滤波算法

滑动窗口滤波器:均值滤波与中值滤波的应用及局限性 滑动窗口滤波是数字信号处理中的基本技术,通过在数据序列上移动一个固定大小的窗口并计算窗口内数据点的统计量(如均值或中值)来平滑信号。本文将探讨滑动窗口均值滤波和中值滤波的基本实现、工作原理及其局限性,并引入…

idea 打不开项目 白屏

使用IDEA打开项目&#xff0c; 不知名原因崩溃了&#xff0c; 直接出现缩略图白屏。 解决过程&#xff1a; 尝试过重启IDEA&#xff0c;重启过电脑&#xff0c;重新引入相同项目&#xff08;使用不同路径&#xff0c;存在缓存记录&#xff0c;依然打不开&#xff09;&#xff…

数据结构——lesson3单链表介绍及实现

目录 1.什么是链表&#xff1f; 2.链表的分类 &#xff08;1&#xff09;无头单向非循环链表&#xff1a; &#xff08;2&#xff09;带头双向循环链表&#xff1a; 3.单链表的实现 &#xff08;1&#xff09;单链表的定义 &#xff08;2&#xff09;动态创建节点 &#…

删除链表的倒数第N个节点

删除链表的倒数第N个节点 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 进阶&#xff1a;你能尝试使用一趟扫描实现吗&#xff1f; 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例…

蓝桥杯Java组备赛(二)

题目1 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int max Integer.MIN_VALUE;int min Integer.MAX_VALUE;double sum 0;for(int i0;i<n;i) {int x sc.nextInt()…

13.5. 多尺度目标检测

这里是对那一节代码的通俗注释&#xff0c;希望对各位学习有帮助。 值得注意的是&#xff0c;multibox_prior函数的宽高计算网络上有争议&#xff0c;此处我仍认为作者的写法是正确的&#xff0c;如果读者有想法&#xff0c;可以在评论区留言&#xff0c;我们进行讨论。 import…

文件上传漏洞--Upload-labs--Pass03--特殊后缀与::$DATA绕过

方法一&#xff1a;特殊后缀绕过&#xff1a; 一、什么是特殊后缀绕过 源代码中的黑名单禁止一系列后缀名 之外的后缀&#xff0c;称之为‘特殊后缀名’&#xff0c;利用其来绕过黑名单&#xff0c;达到上传含有恶意代码的文件的目的。 二、代码审计 接下来对代码逐条拆解进行…

iocp简单例子

首先说明&#xff1a;纯iocp使用的例子看&#xff1a;纯iocp例子&#xff08;里面的代码可能无法运行&#xff0c;但是下面的代码一定可以运行&#xff0c;可以看看它里面的 PostQueuedCompletionStatus函数的使用&#xff0c;参考参考然后拿出来放到下面的代码里测试&#xff…

VQ23 请按城市对客户进行排序,如果城市为空,则按国家排序(order by和case when的连用)

代码 select * from customers_info order by (case when city is null then country else city end)知识点 order by和case when的连用