linux 常用命令及问题大全

文件相关

scp(远程传输)

scp -r /opt root@17.11.11.11:/opt
scp /opt/a root@17.11.11.11:/opt

ls(展示文件信息)

按修改时间倒叙排列
    ls -lt

正序
    ls -ltr
  
实现文件按大小排序
    ls -lSh

find(正则匹配)

正则匹配
find /etc -regex .*wd

/opt目录下找jar包里的文件-【java/lang/Integer.class】
find /opt/ -name "*.jar" | while read jarfile; do
    jar -tf $jarfile | grep "java/lang/Integer.class"
    if [ $? -eq 0 ]
    then
        echo "find class in jar : "$jarfile
    fi
done

cat

新增内容
cat 文件全路径 | tail -n +cat -n 文件全路径 |grep -A 0 '上次获取的日志信息时间戳'|tail -1| awk -F " " '{ print $1 }' | grep -v '上次获取的日志信息时间戳'

最新N条
cat 文件全路径 | tail -n N

获取文件指定行
https://blog.youkuaiyun.com/flyinmo/article/details/116208042

文件内容带行号
cat -n filename

显示从100行到200行的内容
cat filename | head -n 200 | tail -n +100  

模糊查询日志
模糊查询以a开头的文件:
cat /opt/gy/a*

cut

cut命令用来显示行中的指定部分,删除文件中指定字段。cut经常用来显示文件的内容
以:分割取2和5列的值:
cut -f2,5 -d":"

参考链接
https://blog.youkuaiyun.com/yexiangcsdn/article/details/80886693

sed

 显示从100行到200行的内容
sed -n ‘100,200p' filename

获取第二行之后的第二列数据:
cat a.txt | sed -n '2,$p' | awk '{print $2}'
获取第二行之后的第二列为2的数据:
cat a.txt | sed -n '2,$p' | awk '$2 == 2'
获取第二行之后的第二列模糊匹配为2的数据:
cat a.txt | sed -n '2,$p' | awk '$2 ~ /2/'
获取第二行之后的第二列模糊匹配为2的数据并截取部分列以#排序:
cat a.txt | sed -n '2,$p' | awk '$2 ~ /2/'|awk {'printf("%s#%s#%s\n",$2,$3,$4)'}

sed示例
把filename文件每行 以\r结束的字符 替换成空白
sed -i 's/\r$//' filename

-i :直接修改读取的文件的内容,而不是输出到终端。
s替代模式
\r$表示任何以\r结束的字符


1.指定目录(/opt/gy/12)替换所有文件的相关字符串[/opt/aaa->/opt/bbb]:
sed -i 's/\/opt\/aaa/\/opt\/bbb/g' `grep '' -rl /opt/gy/12`【/需要用\转译】
sed -i 's#/opt/aaa#/opt/bbb#g' `grep '' -rl /opt/gy/12`

2.使用双引号,变量直接引用即可
sed -i "s#${eco}#ori#g" block.vf

awk

https://www.cnblogs.com/superbaby11/p/16690137.html

ps

ps -aux|sed -n'1,$p'

mpstat

每两秒查询1次,共查询5次,取平均值
mpstat -P -ALL 2 5 | grep -w "平均时间"|sed -n '2,$p' | awk '{print $12}'
获取cpu核数
cat /proc/cpuinfo|grep -w "processor"| awk '{print $3}'

top

cpu、内存排序
输入大写P,则结果按CPU占用降序排序。输入大写M,结果按内存占用降序排序。(注:大写P可以在capslock状态输入p,或者按Shift+p)

统计即时资源使用情况
top -b -n 1

统计某个服务的内存使用总量:
top -b -n 1|grep 'zabbix_server'|awk -F" " '{sum+=$10} END {print sum}'

top -b -n 1|tail -n +7|awk -F" " '{sum+=$10} END {print sum}'

查看某个进程
top -p 15273

文件格式

查看文件格式:
解释器错误-^M,一般是文件格式有问题:
查看文件格式:set ff
设置文件格式:set ff=unit

du

查看/文件夹下所有文件大小:
du -sh *: /

查看各文件夹大小:
du -h --max-depth=1

查看/的两层目录中各文件夹大小:
du -h --max-depth=2 /

按字节倒序排序目录:
du -s /opt/* | sort -rn

du -h --max-depth=1 /opt| sort -hr
参数说明:
    --max-depth:表示要查看几层目录, 也可以用 -d 1表示查看1层目录
    sort -r:反向显示
    sort -h:compare human readable numbers (e.g., 2k 1G)

grep

指定文件后缀下opt目录中查询出现关键字的文件名称:
    grep -rl --include="*.xml" '查询关键字' /opt/

忽略大小写:
    grep -i a

忽略正则匹配
    grep -v -E 'a|aa'
    

正则过滤数据
1.不要含123和456的
cat mgr.log|grpe -v -E '123|456'

2.获取所有mgr开头的日志文件并过滤指定字符
cat mgr*.log|grep -A100 'ES查询出错'|grep -A0 -E 'net.gy.exa|ES查询出错' 

dd

创建指定大小文件
dd if=/dev/zero of=50M.file bs=1M count=50
bs=1M表示每一次读写1M数据,count=50表示读写 50次,这样就指定了生成文件的大小为50M。bs参数还可以进一步细分为ibs和obs两种,为读操作与写操作分别指定不同的Buffer大小。
https://www.shuzhiduo.com/A/Gkz10WM2dR/

压缩相关

zip
zip -q -r snmpperl.zip /opt/tmp/*

unzip -q a.zip -d /opt/gy

-q:静默解压
-d:指定目录

操作目录

a=$(dirname '/usr/local/a.txt')
result:/usr/local

a=$(basename '/usr/local/a.txt')
result:a.txt

jar包操作

查看jar包内文件:
jar -tf *.jar

网络相关

查看网卡信息

ifconfig
ethtool 网卡名称

自动连接有线

/etc/sysconfig/network-scripts/ifcfg-enpxxxxxx(xxx)文件(文件名中ifcfg-后边跟的可以理解为网卡名)
ONBOOT=yes

防火墙

firewalld
启动: systemctl start firewalld
关闭: systemctl stop firewalld
查看状态: systemctl status firewalld
开机禁用 : systemctl disable firewalld
开机启用 : systemctl enable firewalld

firewall-cmd --zone=public --query-port=8888/tcp
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --remove-port=8088/tcp --permanent

防火墙设置:
firewall-cmd --list-all  --zone=public

查询打开的端口
firewall-cmd --zone=public --list-ports

批量开放端口,如从7000到7005这之间的端口我们全部要打开
firewall-cmd --zone=public --add-port=8000-9500/tcp --permanent
firewall-cmd --zone=public --remove-port=8000-9500/tcp --permanent(这个有延迟,要过一会生效)

重新载入一下防火墙设置,使设置生效
firewall-cmd --reload

允许ip10.11.110.238访问8088端口
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.11.110.238" port protocol="tcp" port="8088" accept"

查看已设置规则
firewall-cmd --zone=public --list-rich-rules

限制ip10.11.110.238访问8088端口即禁止访问机器
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.11.110.238" port port="8088" protocol="tcp" reject"
 
删除已设置规则
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="10.11.110.238" port port="8088" protocol="tcp" reject"

参考:
https://www.cnblogs.com/yizhipanghu/p/11171211.html

iptables
查看已开放端口:
iptables -L -n -v

添加规则:
iptables -I INPUT -p tcp --dport 50070 -j ACCEPT
iptables -I INPUT -p tcp --dport 50070 -j DROP

禁止某段端口访问
iptables -I INPUT -s 123.0.0.0/8 -j DROP      #封整个段即从123.0.0.1到123.255.255.254的数据包

只允许指定ip访问22端口
iptables -I INPUT -p tcp --dport 22 -s 192.168.116.23 -j ACCEPT


删除规则:
iptables -D INPUT -p tcp --dport 50070 -j ACCEPT

 https://www.muouseo.com/topic/z64y96y5lg/71xyj8ed9z

查询默认网关

route -n|grep G|grep -v 'Destination'|awk '{print $2}'

包传输

tcpdump -i 网卡名称 udp port 6000

length单位为字节(mtu【最大传输单元】),ifconfig可知每个网卡mtu的最大值

curl

-O参数将服务器回应保存成文件,并将 URL 的最后部分当作文件名。
$ curl -O https://arthas.aliyun.com/arthas-boot.jar
上面命令将服务器回应保存成文件,文件名为arthas-boot.jar。

路由跟踪命令

traceroute
traceroute 10.11.110.11

1.简单介绍
数字(第几条)   ip(当前跳的所在地址)   三个时间(RTT,也就是往返时延)
返回结果里的三个时间不是最大,最小和平均,而是traceroute发送了三个独立的数据包,统计出了每个RTT(往返时延)

2.显示* * * 的情况
可能是路由器禁止了ICMP数据包
如果从某跳开始所有的时间都成了星号,即超时,则网络故障很有可能就出现在了这一跳

3.原理
Traceroute程序使用ICMP报文和IP首部中的TTL字段,TTL由发送端初始化,当路由器接收到一份IP数据包,如果TTL字段是0或者1,路由器将该数据包丢弃,并给源主机发一个ICMP“超时”信息。

    首先它发送一份TTL字段为1的IP数据报给目的主机,处理这个数据报的第一个路由器将TTL值减1,然后丢弃该数据报,并给源主机发送一个ICMP报文,这个报文包含了路由器的IP地址,这样就得到了第一个路由器的地址,然后,traceroute发送一个TTL为2的数据报来得到第二个路由器的IP地址,继续这个过程,直至这个数据报到达目的主机。

    那么,traceroute是怎么知道到达了目的主机的呢?

    目的主机在接收到TTL值为1的IP数据报是不会丢失的,这样也不会产生一个超时的ICMP数据报文了,那么程序如何判断是否已经到达目的主机了呢?

    在Linux下,traceroute程序发送一个UDP数据报给目的主机,但它选择一个不可能的值作为UDP端口号(大于30000),使目的主机的任何一个应用程序都不可能使用该端口,因此,当该数据报达到目的主机的时候,目的主机会产生一个“端口不可达”错误的ICMP报文,这样,traceroute程序要做的就是区分接收到的ICMP报文是超时还是端口不可达,从而来区分是路由器还是目的主机。
    
    等待时间1秒,不解析域名,最多10跳。
    traceroute -n -m10 -w1 10.11.110.11
traceroute命令默认使用UDP协议,但是可以使用-i选项指定其他协议。例如使用TCP协议
traceroute -T www.baidu.com
另外也可以使用ICMP协议
traceroute -I www.baidu.com

tracepath
与traceroute类似,但是简化的路由追踪命令
用法及参数
-n 显示IP,不显示主机
-l 初始化包的长度,默认65535
-b 打印主机名以及IP信息
-p 指定端口
-m 设置最大的跳跃节点数,默认是30
使用详解
【1】和traceroute的区别
Tracepath使用套接字API来实现其所有功能(安全,所以不需要root权限)。
Traceroute操作原始包以实现其某些功能(不安全,需要root权限)。
【2】使用例子
[root@localhost ~]# tracepath 192.168.30.131
1:  localhost.localdomain                                 0.038ms pmtu 65520
1:  localhost.localdomain                                 0.039ms reached
1:  localhost.localdomain                                 0.035ms reached
Resume: pmtu 65520 hops 1 back 1
[root@localhost ~]# tracepath -n 192.168.30.131
1:  192.168.30.131                                        0.035ms pmtu 65520
1:  192.168.30.131                                        0.019ms reached
1:  192.168.30.131                                        0.011ms reached
Resume: pmtu 65520 hops 1 back 1

进程相关

查看端口

udp6000:
netstat -lnup | grep 6000
tcp6000:
netstat -lntp | grep 6000

netstat -nap|grep 端口号

查看某个端口开启详情

lsof: 常用于查找进程打开了哪些文件以及与打开文件相关联的内容
lsof -i:2181

lsof -i udp

https://blog.youkuaiyun.com/nyist_zxp/article/details/115340302

查看当前系统中所有打开的文件和句柄数:
lsof | wc -l 

查询所有用户为root的打开的文件:
lsof -i |awk -F" " '$3 ~ /root/'|wc -l


进程的句柄数

查看进程的句柄数:
cat /proc/{PID}/status | grep "Max open files"
查看句柄数限制

ulimit
显示当前用户的句柄数限制:
ulimit -n
ulimit -a

查看系统允许的最大句柄数:
cat /proc/sys/fs/file-max

系统级打开最大文件句柄的数量永久生效的修改方法,修改文件,文件末尾加入配置内容:
#vim /etc/sysctl.conf

fs.file-max = 2000000
然后执行命令,使修改配置立即生效:
#sysctl -p

#ulimit -n

1024

进程级打开文件句柄数量永久生效的修改方法,修改文件,文件末尾加入配置内容:

这里限制一个用户的所有shell能打开的最大数:

#vim /etc/security/limits.conf


* soft nofile 65535

* hard nofile 65535

修改以后,需要重新登录才能生效。

如果需要设置当前用户session立即生效,还需要执行:

#ulimit -n 65535 

对于服务器,一般修改进程级的最大打开文件句柄数即可(系统默认1024,有点小)。一般不需要调整系统级的最大数。

如果出现了达到系统级别最大限制时,也需要同步调整系统级的最大数的。

查看后台任务

jobs -l

后台运行脚本(会话被其他人关掉后,仍能运行):
    nohup /opt/sh.sh &>/dev/null &

系统信息

硬盘相关

磁盘信息
两种方式
1.# 普通硬盘可使用
smartctl -a /dev/sda
2.lsblk
光驱设备以上命令获取不到,需要用这个命令
lsblk --nodeps -no serial /dev/sda

查看硬盘序列号
cg命令:lsblk -dno serial
查看块设备完整路径
lsblk -p
查看lsblk命令版本
lsblk -V

参考链接
lsblk:
    https://blog.youkuaiyun.com/fuhanghang/article/details/128852431

查看序列号

smartctl -a /dev/sda
lsblk --nodeps -no serial /dev/sda   

所有磁盘的名称及序列号(zyyw)
lsblk -dno name,serial
参考链接
https://blog.youkuaiyun.com/FromTheWind/article/details/127925869

cpu

lscpu

系统配置相关

sysctl
从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载:
sysctl -p

基础信息
查看操作系统:
cat /etc/os-release

查看系统运行时间:
cat /proc/uptime
6447032.12 48185264.69
第一列输出的是,系统启动到现在的时间(以秒为单位),这里简记为num1;
第二列输出的是,系统空闲的时间(以秒为单位),这里简记为num2。
系统的空闲率(%) = num2/(num1*N) 其中N是SMP系统中的CPU个数。
从上面我的一台机器上的数据可知,
本机启动到现在的时间长度为:6447032.12 seconds = 74.6 days
空闲率为:48185264.69/(6447032.12*8)=93.4%
系统空闲率越大,说明系统比较闲,可以加重一些负载;而系统空闲率很小,则可能考虑升级本机器硬件或者迁移部分负载到其他机器上。

内存相关

查看当前内存使用情况
free -h


内存使用情况
cat /proc/meminfo | grep Commit 
https://zhuanlan.zhihu.com/p/508597947

组件问题

httpd

No space left on device错误(httpd服务【zabbix】)
1.ipcs -s
2.ipcs -s | perl -ane '/^0x00000000/ && ipcrm -s $F[1]'
https://blog.youkuaiyun.com/weixin_34198797/article/details/93927560?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-2
ipc空间不足
(IPC介绍:
IPC进程间通信(Inter-Process Communication)就是指多个进程之间相互通信,交换信息的方法。Linux IPC基本上都是从Unix平台上继承而来的。主要包括最初的Unix IPC,System V IPC以及基于Socket的IPC。另外,Linux也支持POSIX IPC。
IPC具体包含:
(1)信号量,用来管理对共享资源的访问
(2)共享内存,用来高效地实现进程间的数据共享
(3)消息队列,用来实现进程间数据的传递。我们把这三种工具统称为System V IPC的对象,每个对象都具有一个唯一的IPC标识符(identifier)。要保证不同的进程能够获取同一个IPC对象,必须提供一个IPC关键字(IPC key),内核负责把IPC关键字转换成IPC标识符。   使用ipcs命令可以查看当前使用情况,使用ipcs -l查看系统配置参数。)

服务相关

低版本Linux启动脚本及开机自启动设置

1、将/init/startshell这个文件复制一份到/etc/rc.d/init.d目录下
2、使用service start shell start/stop/restart 命令进行采集端的启动/停止/重启操作
3、使用chkconfig startshell on 命令设置开机自启动

常用日志目录

系统日志文件:
/var/log/message

yum服务下载安装

基础
1.查看yum源仓库列表:
2.yum repolist all
清空缓存:
yum clean all
3.下载指定的rpm包以及当前os缺少的依赖包:
yum install --downloadonly --downloaddir=<指定下载目录> <rpm包>
4.查看可用的版本
yum list [package_name] --showduplicates

离线安装rpm包
安装插件
$ yum -y install yum-download
下载net-snmp-perl-5.7.2-49.el7.x86_64 及其依赖包
$ yum -y install net-snmp-perl-5.7.2-49.el7.x86_64 --downloadonly --downloaddir=/home/test/ 

安装yum-utils
$ yum -y install yum-utils
下载 vlc 及其依赖包
$ yumdownloader --resolve --destdir=/home/test vlc 


上面俩个基于本机环境,下面全量下载:
一.安装yum-utils
$ yum -y install yum-utils

二.yum建立本地源
1.查看yum源可提供版本:
yum provides net-snmp-perl
2.查看要安装的rpm包所需要的依赖:
yum deplist net-snmp-perl-5.7.2-49.el7_9.1.x86_64

下载net-snmp-perl-5.7.2-49.el7.x86_64 和全量依赖包
$ repotrack -p /opt/gy/snmpperlfinal_2/ net-snmp-perl-5.7.2-49.el7.x86_64 -r base
-r base:下载基础版本

下载完制作本地yum库:
mkdir /opt/gy/myrepo
createrepo /opt/gy/myrepo
cd /etc/yum.repos.d 
rename repo repp *.repo
yum clean all
cat  >> /etc/yum.repos.d/my_dir.repo <<EOF
[base]
name=20231106_linux-myrepodir
baseurl=file:///opt/gy/myrepo
enabled=1
gpgcheck=0
EOF

三.安装
yum install net-snmp-perl-5.7.2-49.el7_9.1.x86_64

rpm安装卸载

rpm -qa|grep net-snmp
rpm -ivh XX
rpm -e XX

强制删除(慎用,记得备份)
rpm -e --nodeps glusterfs-api glusterfs-libs

版本降级
【krb5-libs-1.15.1-55.el7_9.x86_64.rpm->krb5-libs-1.15.1-55.el7.x86_64.rpm】
rpm -Uvh --oldpackage 需要安装的降级包全名(krb5-libs-1.15.1-55.el7.x86_64.rpm)
版本降级所有xz相关的包:
rpm -Uvh xz* --oldpackage
关于降级:已经安装的版本和要安装的保本包必须都要有。

用户相关

用户组

groupadd gygroup

修改用户组
chown -R root:root /etc

用户

useradd gy
passwd gy

或者

useradd gy -pgy

指定用户组:
useradd -g gygroup gy

修改密码
passwd gy
删除用户
userdel gy
userdel -r gy

显示当前用户名、用户的ID,以及所属群组的ID
id -un

权限

chmod u+rw test.txt
chmod -R 755 /home/test

登录信息

最近5条登录信息:
    last -n 5

https://blog.youkuaiyun.com/AnChenliang_1002/article/details/131466709

当前登录信息:
    w

断开用户pts/0连接:
    pkill -kill -t pts/0

history

设置时间:
    export HISTTIMEFORMAT='%F %T '
    
所有用户最后一次登录:
    lastlog
    
所有登录过的用户:
    cat /var/log/auth.log(或者secure) | grep -C1 user
    
设置history的日期:
    vim /etc/profile
    
    HISTTIMEFORMAT='%F %T '     //注意有个空格,为了显示时日期与命令之间有空格分割。
    HISTSIZE="3000"    //默认保留1000条。
    
    source /etc/profile
    
查看root命令:
    cat ~/.bash_history
    此文件记录所有历史命令(仅当用户注销时写入该文件)
    
清除当前历史记录:
    history -c

链接
https://blog.youkuaiyun.com/u013250861/article/details/127823693

禁用ip登录

禁止10.11.110.88登录
/etc/hosts.deny
ALL: 10.11.110.88
(此处需要加个换行)

linux语句

if判断

mHz=""
if [ -z "$mHz" ]; then
    echo "The variable 'mHz' is empty or has no value."
else
    echo "The variable 'mHz' is not empty."
fi

在上面的例子中,如果变量 mHz 的值为空,则显示消息 "The variable 'mHz' is empty or has no value."。否则,将显示消息 "The variable 'mHz' is not empty."。

循环

while
while true
do
done

for
count=`w|grep -E '10.*'|awk -F:" " '{print $2}'`
for num in $count;do
    pkill -kill -t ${num}
done

linux问题

登录相关

Host key verification failed
ssh-keygen -R 你需要访问的环境IP
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值