目 录CONTENT

文章目录

linux小技巧

简中仙
2022-09-09 / 0 评论 / 0 点赞 / 58 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于2024-02-02,若内容或图片失效,请留言反馈。 本文如有错误或者侵权的地方,欢迎您批评指正!

一、系统

1、查看系统版本号和内核信息

# cat /proc/version
Linux version 3.10.0-1160.71.1.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Tue Jun 28 15:37:28 UTC 2022
# uname -a
Linux localhost 3.10.0-1160.71.1.el7.x86_64 #1 SMP Tue Jun 28 15:37:28 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
# yum -y install redhat-lsb
# lsb_release -a
LSB Version:    :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch
Distributor ID: CentOS
Description:    CentOS Linux release 7.9.2009 (Core)
Release:        7.9.2009
Codename:       Core
# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
# cat /etc/issue
\S
Kernel \r on an \m
rpm -q redhat-release

2、查看物理CPU个数、核数、逻辑CPU个数

CPU总核数 = 物理CPU个数 * 每颗物理CPU的核数
总逻辑CPU数 = 物理CPU个数 * 每颗物理CPU的核数 * 超线程数

查看CPU信息(型号)

# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
      8  Intel(R) Xeon(R) Platinum 8269CY CPU @ 2.50GHz

查看物理CPU个数

# cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
1

查看每个物理CPU中core的个数(即核数)

# cat /proc/cpuinfo| grep "cpu cores"| uniq
cpu cores       : 4

查看逻辑CPU的个数

# cat /proc/cpuinfo| grep "processor"| wc -l
8

3、时间戳与日期

日期与时间戳的相互转换

#将日期转换为Unix时间戳
date +%s

#将Unix时间戳转换为指定格式化的日期时间
date -d @1361542596 +"%Y-%m-%d %H:%M:%S"

date日期操作

date +%Y%m%d               #显示前天年月日
date -d "+1 day" +%Y%m%d   #显示前一天的日期
date -d "-1 day" +%Y%m%d   #显示后一天的日期
date -d "-1 month" +%Y%m%d #显示上一月的日期
date -d "+1 month" +%Y%m%d #显示下一月的日期
date -d "-1 year" +%Y%m%d  #显示前一年的日期
date -d "+1 year" +%Y%m%d  #显示下一年的日期

获得毫秒级的时间戳

在linux Shell中并没有毫秒级的时间单位,只有秒和纳秒。其实这样就足够了,因为纳秒的单位范围是(000000000..999999999),所以从纳秒也是可以的到毫秒的

current=`date "+%Y-%m-%d %H:%M:%S"`     #获取当前时间,例:2015-03-11 12:33:41
timeStamp=`date -d "$current" +%s`      #将current转换为时间戳,精确到秒
currentTimeStamp=$((timeStamp*1000+`date "+%N"`/1000000)) #将current转换为时间戳,精确到毫秒
echo $currentTimeStamp

4、Linux禁用透明大页

Redhat

sed -i '$a echo nerver > /sys/kernel/mm/redhat_transparent_hugepage/defrag\necho nerver > /sys/kernel/mm/redhat_transparent_hugepage/enabled'

CentOS

echo never > /sys/kernel/mm/transparent_hugepage/defrag ;\
echo never > /sys/kernel/mm/transparent_hugepage/enabled ;\
sed -i '/GRUB_CMDLINE_LINUX/ s/"$/ transparent_hugepage=never"/' /etc/default/grub ;\
grub2-mkconfig -o /boot/grub2/grub.cfg

5、升级内核

内核下载地址:https://elrepo.org/linux/kernel/

  • kernel-lt(lt=long-term)长期有效
  • kernel-ml(ml=mainline)主流版本

1、安装最新内核

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org && \
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm && \
yum --enablerepo=elrepo-kernel install -y kernel-ml 

2、配置默认内核

# 查看grube启动时当前默认设置的内核
grub2-editenv list

# 查看grub2当前支持可启动的内核
awk -F \' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg 

0 : CentOS Linux (3.10.0-1160.71.1.el7.x86_64) 7 (Core)
1 : CentOS Linux (4.19.12-1.el7.elrepo.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-1127.19.1.el7.x86_64) 7 (Core)
3 : CentOS Linux (3.10.0-1127.el7.x86_64) 7 (Core)
4 : CentOS Linux (0-rescue-20200914151306980406746494236010) 7 (Core)

# 设置grube启动时使用最新的内核
grub2-set-default 'CentOS Linux (4.19.12-1.el7.elrepo.x86_64) 7 (Core)'

# 再次查看grube启动时当前默认设置的内核
grub2-editenv list

# 重启生效
reboot now

3、更新基础软件

# 更新kernel-ml-devel、kernel-ml-headers、kernel-ml-doc、kernel-tools、perf、kernel-ml-headers
yum --enablerepo=elrepo-kernel install -y kernel-ml-devel kernel-ml-headers kernel-ml-doc kernel-tools perf python-perf

4、编译安装内核

yum groupinstall "Development Tools" -y && \
yum install -y \
	openssl-devel \
	rpm-build \
	redhat-rpm-config \
	asciidoc \
	hmaccalc \
	perl-ExtUtils-Embed \
	pesign \
	xmlto \
	audit-libs-devel \
	binutils-devel \
	elfutils-devel \
	elfutils-libelf-devel \
	ncurses-devel \
	newt-devel \
	numactl-devel \
	pciutils-devel \
	python-devel \
	zlib-devel \
	rpm-build
# wget https://mirrors.tuna.tsinghua.edu.cn/kernel/v4.x/linux-4.19.306.tar.xz
# tar xf linux-4.19.306.tar.xz
# cd linux-4.19.306/
# make menuconfig
# make -j `nproc` 
# make INSTALL_MOD_STRIP=1 modules_install > /dev/null && make modules_install && make install
# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg && sudo grub2-set-default 0 && sudo grub2-mkconfig -o /boot/grub2/grub.cfg
  • make config(基于文本的最为传统的配置界面,不推荐使用)
  • make menuconfig(基于文本选单的配置界面,字符终端下推荐使用)
  • make xconfig(基于图形窗口模式的配置界面,Xwindow下推荐使用)
  • make oldconfig(如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦)

5、生成rpm包

# make rpm-pkg -j `nproc` 
# make modules_install && make INSTALL_MOD_STRIP=1 rpm-pkg -j `nproc`
# cd ~/rpmbuild/RPMS/x86_64/
# yum localinstall kern* -y
# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg && grub2-set-default 0 && grub2-mkconfig -o /boot/grub2/grub.cfg

6、删除多余内核

# rpm -qa | grep kernel											# 查看通过 rpm 安装的内核
# yum remove kernel-tools-libs-3.10.0-1160.95.1.el7.x86_64		# 删除多余内核
# grub2-mkconfig -o /boot/grub2/grub.cfg						# 更新引导配置

6、取消进入终端自动创建perl5

#  vim /etc/profile.d/perl-homedir.sh
PERL_HOMEDIR=0

原因是perl会默认为每个用户加载local::lib,如果你不需要则无需加载。而用户登陆时会执行/etc/profile文件,此文件又会执行/etc/profile.d/*.s

7、ISO自动挂载

echo "/mnt/iso/CentOS-7-x86_64-Minimal-1804.iso /mnt/cdrom iso9660 defaults,loop  0 0" >> /etc/fstab && \
mount -a && \
df -mh

二、常用技巧

1、linux cp 直接覆盖不提示信息

默认情况下,cp覆盖时,无论加什么参数 -f 之类的 还是提示是否覆盖。

原因是:服务器会默认增加别名 alias cp=’cp -i’,当你执行cp时,其实执行的是cp –i。

# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

cp 时取消提示信息,直接覆盖,不需要用户再敲击 y 进行交互,这在脚本执行时很重要。

下面是两种做法解决这个问题。

方法一:将别名禁掉

# vi ~/.bashrc 

在alias cp=’cp -i’前加上”#”注释掉这行,:wq! 保存退出,然后重新登陆就可以了。

方法二:cp 前 加 \

# \cp 1.txt /back/1.txt  

方法三:使用yes|

yes| cp -r /home/test/. /tmp/test

2、cp目录下的带隐藏文件的子目录

cp目录下的带隐藏文件的子目录

cp -R /home/test/* /tmp/test

/home/test下的隐藏文件都不会被拷贝,子目录下的隐藏文件倒是会的

cp -R /home/test/. /tmp/test

3、bash不显示路径

命令行会变成-bash-3.2$主要原因可能是用户主目录下的配置文件丢失

# 方式一
cp -a /etc/skel/. ~

# 方式二
echo "export PS1='[\u@\h \W]\$'" >> ~/.bash_profile ;\
source ~/.bash_profile

4、shell脚本的调试

  • 在脚本运行时添加-x参数
  • 在脚本中开头添加set -x

5、修改时区

Docker容器中

  • 添加环境变量:TZ = Asia/Shanghai

Linux主机

timedatectl set-timezone "Asia/Shanghai"			# 设置时区
timedatectl status 									# 查看当前的时区状态
date -R												# 查看时区

或者

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

6、获取出口IP地址

curl http://members.3322.org/dyndns/getip
curl cip.cc
curl myip.ipip.net
curl ifconfig.me
curl ipinfo.io
curl icanhazip.com

7、生成随机字符串

# 基于时间和随机数的MD5哈希摘要
echo "$(date +%s)$RANDOM" | openssl dgst -md5 -binary | base64 | head -c 10

# 从/dev/random生成16字节的随机数据并转为Base64编码
head -c 16 /dev/random | base64

# 使用OpenSSL生成10字节长度的十六进制随机数
openssl rand -hex 10

# 直接生成8位UUID片段,对字节数进行Base64编码
uuidgen | cut -c-8 | base64

# 从/dev/urandom生成包含特定字符集的15字符长随机字符串
tr -dc 'A-Za-z0-9_#\-+=^>)({|%' < /dev/urandom | head -c 15

8、监控特定端口的打开连接,包括按 IP 侦听、计数和排序

watch -n 1 "netstat -plan | grep :443 | awk {'print \$5'} | cut -d: -f 1 | sort | uniq -c | sort -nk 1"

三、常用脚本

1、批量打通指定主机SSH免密钥登录脚本

#!/bin/bash

# 脚本使用说明
echo "脚本使用方法: ./HitthroughSSH.sh hosts.txt"
echo "hosts.txt格式: IP:root_password"

# 检查并安装expect工具(适用于基于yum的系统,如CentOS/RHEL)
if ! rpm -qa | grep -q expect; then
    echo "== 步骤1: 安装expect工具..."
    yum -y install expect || {
        echo "安装expect失败,请检查网络或yum源。"
        exit 1
    }
fi

# 检查是否存在ssh密钥对,不存在则生成
if [ ! -f ~/.ssh/id_rsa ]; then
    echo "== 步骤2: 生成ssh私钥与公钥..."
    ssh-keygen -t rsa -b 4096 -N "" -f ~/.ssh/id_rsa
fi

# 读取hosts.txt中的IP和密码信息
while IFS=: read -r ip password; do
    # 使用expect实现自动化登录并推送公钥
    echo "== 步骤3: 对主机${ip}进行免密钥登录设置..."
    expect <<- EOF
        set timeout 10
        spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$ip
        expect {
            "*yes/no*" {send "yes\r"; exp_continue}
            "*assword:*" {send "$password\r"}
        }
        expect eof
EOF

    # 验证是否成功设置免密登录
    echo "== 步骤4: 登录验证..."
    ssh -o StrictHostKeyChecking=no root@$ip "date"
done < "./$1"

# 清理临时文件(如果需要)
# rm -rf ./HitthroughSSH.sh ./hosts.txt

# 提示用户执行完成
echo "== 批量打通SSH免密钥登录已完成!"

2、硬盘自动分区,格式化,开机自动挂载到/data

#!/bin/bash

# 定义要操作的磁盘设备名称及文件系统类型(可选ext4或xfs)
disk="/dev/sdc"
filesystem="xfs"

# 检查用户输入的文件系统类型
if [[ "$filesystem" != "ext4" && "$filesystem" != "xfs" ]]; then
    echo "错误:不支持的文件系统类型,请选择'ext4'或'xfs'"
    exit 1
fi

# 使用fdisk进行分区操作
echo "开始对 ${disk} 进行分区..."
fdisk "${disk}" << EOF
n
p
1


w
q
EOF

# 检查分区是否成功创建,以及新分区是否存在
partition_created=$(lsblk -l | grep "${disk}1" | wc -l)
if [ "$partition_created" -eq 0 ]; then
    echo "分区创建失败,请检查磁盘状态。"
    exit 1
fi

# 根据用户选择格式化为对应的文件系统
case $filesystem in
    ext4)
        echo "格式化新分区为ext4..."
        mkfs.ext4 "${disk}1"
        ;;
    xfs)
        echo "格式化新分区为xfs..."
        mkfs.xfs "${disk}1"
        ;;
esac

# 获取新分区UUID或Label,并添加到/etc/fstab中(这里以XFS为例使用Label)
partition_label="data_volume"
if [ "$filesystem" = "xfs" ]; then
    # 对于XFS,可以设置一个label并以此挂载
    tune2fs -L "${partition_label}" "${disk}1"
    fstab_entry="LABEL=${partition_label} /data ${filesystem} defaults,noatime 0 0"
else
    # 对于EXT4或其他支持UUID的文件系统,获取UUID并写入fstab
    partition_uuid=$(blkid "${disk}1" | awk -F '[= "]+' '{print $3}')
    fstab_entry="UUID=${partition_uuid} /data ${filesystem} defaults,noatime 0 0"
fi
echo "将${disk}1分区信息写入/etc/fstab以便开机自动挂载..."
echo "${fstab_entry}" >> /etc/fstab

# 创建挂载点目录(如果不存在)
mkdir -p /data

# 挂载新分区,并验证挂载状态
mount -a
mountpoint=/data
if mount | grep -q "on ${mountpoint} "; then
    echo "分区已成功挂载至/data:"
    df -hT /data
else
    echo "挂载分区到/data失败,请检查fstab配置和磁盘状态。"
fi

四、常用软件安装

1、检查软件是否安装

rpm -qa |grep "jq"
if [ $? -eq 0 ] ;then
    echo "jq hava been installed "
else
    yum -y install epel-release && yum -y install jq
fi

2、centos7 yum软件降级

CentOS软件降级操作如下:

首先查看软件升级的事务ID:
# yum history list all
根据ID查看变更的内容:
# yum history info ID
确认ID确认,执行回滚操作:
# yum history undo ID
0

评论区