一、系统
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
评论区