linux系统基础命令常用命令汇总

基础命令

awk

参数

NR当前行数
NF当前列数
$n$0当前整行 ,$1表示第一列,$2表示第二列
F明确分隔符
RS记录分隔符,默认记录分隔符为\n
FS列分隔符,于-F功能类似
OFS与FS对应,指定print函数输出时的列分隔符,默认空格
ORS与RS对应,指定print函数输出时的记录分隔符,默认\n
  • 查取
#取出2023-10-16到2023-10-21时间所有日志 $0表示整个文本数据
[root@localhost ~]# awk '/2023-10-16/,/2023-10-19/ {print $0}' 1.txt 
2023-10-16 123  456 789 异常
2023-10-17 223  456 789 异常
2023-10-18 323  456555 789 
2023-10-19 4236  456 78966 异常
#取出2023-10-16到2023-10-21时间包含异常的日志 ~表示 匹配正则表达式操作
[root@localhost ~]# awk '/2023-10-16/,/2023-10-21/ {if ($0 ~ /异常/) print}' 1.txt 
2023-10-16 123  456 789 异常
2023-10-17 223  456 789 异常
2023-10-19 4236  456 78966 异常
2023-10-20 5236  4566 789 异常
#查看文件有多少行
[root@wj ~]# awk 'END{print NR}' 1.log 
6
  • 删除
#删除空行
awk 'NF' input.txt > output.txt  # NF 表示非空行
#删除第一行
df -h | awk 'NR>1 {print }'  或者NR!=1
#删除第一个
[root@wj-7 ~]# echo a123456 | awk '{print substr($1,2)}' 
123456
#删除前两个
[root@localhost ~]# echo a123456 | awk '{print substr($1,3)}' 
23456
  • 合并文件
[root@localhost ~]# more 1.txt 
123
[root@localhost ~]# more 2.txt 
456
[root@localhost ~]# awk '{print $0}' 1.txt 2.txt > 3.txt
[root@localhost ~]# more 3.txt 
123
456
  • 取某列
#F以:为分隔符,取第三列 值等于0的
[root@localhost ~]# awk -F: '$3==0' /etc/passwd
root:x:0:0:root:/root:/bin/bash
#取第一列和第三列
awk '{print $1,$3}'
  • 取文件名
[root@localhost ~]# echo http.zip | awk -F "." '{print $1}'
http
  • 修改某个值
[root@wj ~]# echo "wo shi wang"|gawk '{$3="haha"; print $0}'
wo shi haha
  • 添加拼接
[root@wj ~]# eco "123" | awk '{print "hah" $NF}'hah123

计算

简单计算

#计算2*4
[root@localhost ~]# awk 'BEGIN{print 2*4}'
8

混合运算

#求奇数的和以及偶数和
[root@wj ~]# seq 100 |awk 'BEGIN{print "100以内奇数和","100以内偶数和" } NR%2==1{JiShuHe+=$0} NR%2==0{OuShuHe+=$0}  END{print JiShuHe,OuShuHe}'
结果是:
100以内奇数和 100以内偶数和
2500 2550


引用shell变量变量 -v

[root@localhost ~]# s=:
[root@localhost ~]# awk -v FS=$s '{print$1FS$3}' /etc/passwd
root:0
bin:1
daemon:2
adm:3

输出格式

以;格式输出
[root@wj ~]# awk -F: -v OFS=";" '{print $1,$3}' /etc/passwd 
root;0 bin;1 daemon;2 

RS输入记录

[root@wj ~]# cat test.txt 
a,b,c;
1,2,3;
x,y, zzz;
aaa,b bb,ccc vvv;
bbb 
[root@wj ~]# awk -F"," -v RS=";" '{print $2}' test.txt 
b 2 y b bb 

分列输出

[root@wj ~]# echo -n '1,2,3|4,5,6|7,8,9'| awk 'BEGIN{RS="|";FS=","} {print $1,$2,$3}'
1 2 3
4 5 6
7 8 9

b

cat

#写入内容
cat > output.txt <<EOF
this is test eof
this is test eof2
EOF

#追加内容
cat >>2.txt <<EOF
456
789
EOF

#等特殊字符$时,须利用转义字符 \
cat > file <<EOF
export ORACLE_SID=yqpt 
export PATH=\$PATH:\$ORACLE_HOME/bin  
EOF

#显示行号
cat -n 1.txt

crontab定时任务

服务启停

systemctl start/stop/reload/status  crond

参数解释

第1列表示分钟0~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

特殊 符号 含义
*    表示任意时间都可以
-    表示取值范围
/ 每过多少个数字
,散列数字

相关命令

查看当前的crontab 任务
crontab -l

添加crontab任务
crontab -e

删除所有的crontab 任务
crontab  -r

查看其他用户/编辑 crontab 任务
只有root 用户才可以使用
crontab -u username -l # 查看
crontab -u username -e # 编辑

示例说明

实例1:每1分钟执行一次myCommand
* * * * * myCommand

实例2:每小时的第3和第15分钟执行
3,15 * * * * myCommand

实例3:在上午8点到11点的第3和第15分钟执行
3,15 8-11 * * * myCommand

实例4:每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2  *  * myCommand

实例5:每周一上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 myCommand

实例6:每晚的21:30重启smb
30 21 * * * /etc/init.d/smb restart

实例7:每月1、10、22日的4 : 45重启smb
45 4 1,10,22 * * /etc/init.d/smb restart

实例8:每周六、周日的1 : 10重启smb
10 1 * * 6,0 /etc/init.d/smb restart

实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb
0,30 18-23 * * * /etc/init.d/smb restart

实例10:每星期六的晚上11 : 00 pm重启smb
0 23 * * 6 /etc/init.d/smb restart

实例11:每一小时重启smb
0 */1 * * * /etc/init.d/smb restart

实例12:晚上11点到早上7点之间,每隔一小时重启smb
0 23-7/1 * * * /etc/init.d/smb restart

示例13:每天8点和16点执行一次
0 8,16 * * *

示例14:每天03点 执行
00 03 * * * sh /root/back/bf.sh

cut

cut是一个很有用的 Linux 命令,当我们要截取文件的指定部分并打印到标准输出,当文本区域以及文件本身很大时,这个命令很有用。

#截取文件的前10列
cut -c1-10 txt_linuxmi

#截取该文件中的第二,第五和第七列
cut -d;-f2 -f5 -f7 txt_linuxmi

curl

参数解释:

参数全称 / 说明功能描述
-s--silent静音模式,不输出任何内容
-S--show-error显示错误信息(通常与静音模式配合使用,仅在出错时输出)
-L无特定全称跟踪 URL 重定向,自动跟随跳转的链接
-o无特定全称(小写字母 “欧”)重命名下载的文件,指定保存的文件名
-C无特定全称(大写字母 “西”)断点续传,支持从上次中断的位置继续下载

默认使用查看网页源代码

[root@wj ~]# curl wangjian.run

使用HTTP认证

curl -u username:password http://protected.site

只下载文件

#-O 是大写的欧
curl -O https://repo.mysql.com/mysql80-community-release-el7-7.noarch.rpm

下载文件并重新命名且支持断点续传

#-o 小写的欧,可以重新定义文件名
curl -Co /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo

测试网站速度

curl -s -w \
     '\nLookup time:\t%{time_namelookup}\nConnect time:\t%{time_connect}\nAppCon time:\t%{time_appconnect}\nRedirect time:\t%{time_redirect}\nPreXfer time:\t%{time_pretransfer}\nStartXfer time:\t%{time_starttransfer}\n\nTotal time:\t%{time_total}\n' \
     -o /dev/null wangjian.run

执行的结果如下:
Lookup time:    0.012
Connect time:   0.031
AppCon time:    0.000
Redirect time:  0.000
PreXfer time:   0.031
StartXfer time: 0.852

Total time:     0.912

批量下载图片

从站点当前页面下载所有 PNG 文件(使用GNU grep)

curl https://example.com | \
grep --only-matching 'src="[^"]*.[png]"' | \
cut -d\" -f2 | \
while read i; do curl https://example.com/"${i}" \
-o "${i##*/}"; done

curl wangjian.run | \
grep --only-matching 'src="[^"]*.[png]"' | \
cut -d\" -f2 | \
while read i; do curl wangjian.run/"${i}" \
-o "${i##*/}"; done

发送 GET 请求

curl https://api.example.com/data

发送 POST 请求

curl -X POST -d "param1=value1&param2=value2" https://api.example.com/post

自定义请求头

有些 API 需要特定的请求头,如 Authorization

curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
https://api.example.com/protected

保存和发送 Cookie

如果网站需要登录,你可以用 curl 先获取并保存 Cookie:

curl -c cookies.txt -d "username=admin&password=123456" \
https://example.com/login

然后再使用这些 Cookie 访问其他页面:

curl -b cookies.txt https://example.com/dashboard

以 JSON 格式发送请求

API 调试时,往往需要以JSON格式提交数据,你可以这样做

curl -X POST https://api.example.com/data \
     -H "Content-Type: application/json" \
     -d '{"name":"张三","age":28}'

监控网站是否正常

[root@localhost ~]# curl -s -o /dev/null -w "%{http_code}" https://wangjian.run | grep 200
200

测试 API 响应时间

curl -w "Total time: %{time_total}s\n" -o /dev/null -s \
https://api.example.com/test

e

find

#删除两天之前的
find ./ -name 1.txt +2 -exec rm -rf {} \;   

#删除三天之前的文件,其实就是保留最近4天的时间
find /root/back/ -name "*" -type f -mtime +3 -delete

#查找后,只显示最后两个
[root@wj 20211007]# find /var/log/ *.log | tail -2

#只打印第一级目录
find . -maxdepth 1 -name "*.sh

grep

不看注释和空行

[root@wj 1]# grep -v '#' 1.log -n #-n 可以显示行号
4:123
5:235
#不看注释和空行
[root@wj ~]# cat nginx-ln.conf | grep -v "#" | grep -v "^$"

或查询

grep 'pattern1\|pattern2' filename  方式1
grep -E 'pattern1|pattern2' filename  方式2
egrep 'pattern1|pattern2' filename  方式3
grep -e pattern1 -e pattern2 filename  方式4

且查询

方式1
grep -E 'pattern1.*pattern2' filename  
grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename  
第一个例子如下:(其中两个pattern的顺序是指定的)
第二个例子:(两个pattern的顺序不是固定的,可以是乱序的)
方式2
grep -E 'pattern1' filename | grep -E 'pattern2'

Grep NOT操作

使用选项 grep -v

使用 grep -v 可以实现 NOT 操作。 -v 选项用来实现反选匹配的( invert match)。如,可匹配得到除下指定pattern外的所有lines。

grep -v 'pattern1' filename

head

#取第一行
head -n1  



history

#清除所有历史记录
[root@wj ~]# history -c

iptables

  • 解释说明

iptables 使用三个不同的链来允许或阻止流量:输入(input)、输出(output)和转发(forward)

  1. 输入(input) —— 此链用于控制传入连接的行为
  2. 输出(output) —— 此链用于传出连接
  3. 转发(forward) —— 这条链用于传入的连接,这些连接实际上不是在本地传递的,比如路由和 NATing
链名流量方向常见用途
输入 INPUT进入本地主机的流量控制外部对本地服务的访问(如开放 SSH、Web 服务)
转发 FORWARD经过本地主机的转发流量管理局域网内设备间的互访、配置路由器防火墙策略
输出 OUTPUT从本地主机发出的流量限制本地程序的出站行为(如禁止访问特定网站)
  • 相关参数
-L:列出当前链(chain)中的所有规则
-n:以数字形式显示 IP 地址和端口号,而不是尝试解析主机名和服务名
--line-number:显示规则的行号,这对于后续删除或修改特定规则非常有用
-A 表示在链的末尾添加规则
#解释说明:
-A:在规则链的末尾加入新规则,input output forward
-p:指定协议可以是tcp、udp、icmp中的一个或 者全部all
-m state --stats:NEW表示包为新的连接  ESTABLISHED:已经联机成功的联机状态 
--dport:22 要通过的端口
-j:ACCEPT 接受 DROP 拒绝

#删除限制(本质就是删除记录)
iptables -t filter -D INPUT 1  #删除input的第1条规则

Chain:显示防火墙的链(INPUT、FORWARD、OUTPUT 等)
policy:显示链的默认策略(ACCEPT 或 DROP)
num:规则的行号,通过 --line-number 参数添加
target:匹配规则后执行的操作(ACCEPT、DROP、REJECT 等)
prot:协议类型(all、tcp、udp、icmp 等)
opt:选项,通常为空
source:源 IP 地址或网段
destination:目标 IP 地址或网段
  • 安装 iptables
yum install -y iptables-services
  • 启停服务
systemctl enable iptables
systemctl stop iptables    
systemctl start iptables
systemctl status iptables

systemctl restart iptables
systemctl disable iptables 
  • 默认配置文件解释
[root@localhost sysconfig]# cat /etc/sysconfig/iptables
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]  #该规则表示INPUT表默认策略是ACCEPT
:FORWARD ACCEPT [0:0] #该规则表示FORWARD表默认策略是ACCEPT
:OUTPUT ACCEPT [0:0] #该规则表示OUTPUT表默认策略是ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #对于已经建立连接的数据,是允许访问的
-A INPUT -p icmp -j ACCEPT #允许icmp协议的访问,主要就是ping
-A INPUT -i lo -j ACCEPT #接受本地的所有请求
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT #允许22端口被外部访问
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
# 上面两条的意思是在INPUT表和FORWARD表中拒绝所有其他不符合上述任何一条规则的数据包。并且发送一条host prohibited的消息给被拒绝的主机。
COMMIT
  • 查看当前规则
#查看当前信息 iptables -L  或者 iptables -L -nv 或者 iptables -L -nv --line-number
[root@localhost ~]# iptables -L -n --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination  
  • 添加指定IP可以访问8080端口
重要提醒:如果要指定IP能访问某个端口,必须先执行需要通过的IP,最后在执行drop。
#添加指定IP可以访问8080端口 
[root@localhost ~]# iptables -A INPUT -p tcp -s 192.168.62.130 --dport 8080 -j ACCEPT
[root@localhost bin]# iptables -L -n --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  192.168.62.130       0.0.0.0/0            tcp dpt:8080
2    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8080

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination   
  • 启动端口对所有人开放
#以下端口对所有人开放,外部都可以访问到
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT
  • 禁止8080对任何人访问(必须放在最后一行,最后执行)
[root@localhost ~]# iptables -A INPUT -p tcp --dport 8080 -j DROP
  • 在第二行添加数据
#在第二行添加数据
[root@localhost bin]# iptables -I INPUT 2 -p tcp -s 192.168.62.131 --dport 8080 -j ACCEPT 
[root@localhost bin]# iptables -L -n --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  192.168.62.130       0.0.0.0/0            tcp dpt:8080
2    ACCEPT     tcp  --  192.168.62.131       0.0.0.0/0            tcp dpt:8080
3    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8080

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination 
  • 删除规则
iptables -D INPUT 5  # 删除 INPUT 链中的第 5 条规则
  • 清空所有的防火墙规则
#清空所有的防火墙规则(无任何限制,随意进出)
iptables -F 
  • 网络知识
123.0.0.1到123.255.255.254  简写:123.0.0.0/8 
123.45.0.1到123.45.255.254  简写:124.45.0.0/16
123.45.6.1到123.45.6.254    简写:123.45.6.0/24

mail邮件邮箱

安装

yum install mailx -y

发送邮件

发送邮件
命令格式:echo '邮件内容' | mail -s '主题' <收件人>
内容直接用echo写出来
echo "内容123" |mailx -s "标题测试" root

使用文件进行邮件发送
mail -s "Hello from jsdig.com by file" admin@jsdig.com < mail.txt

配置个人邮箱

[root@localhost ~]# vim /etc/mail.rc
将下面配置添加到文件尾部
set smtp=smtp.163.com # 邮箱服务器地址
set smtp-auth=login # 认证方式:采用用户名和密码登录方式
set smtp-auth-user=xxx@163.com # 用户名
set smtp-auth-password=xxx # 密码(邮箱授权码)
set from=xxx@163.com # 绑定发件人

发送一个测试下
[root@localhost ~]# echo 'hello world!' | mail -s '你好' xxx@qq.com

journalctl日志

检索 systemd 日志,是 CentOS 7 才有的工具。

查看某个服务的日志

[root@wj ~]# journalctl -xeu sshd.service

journalctl 不带参数从旧到新

journalctl -r 从新到旧

journalctl -f 实时日志

journalctl –since 1 hour ago 查看1小时前到现在的日志

journalctl –since “2016-08-04 20:00:00” –until “2016-08-04 20:15:00” 查看8月4日晚上的日志

k

lsof 端口占用

查看某个端口是被哪个服务使用

[root@wj ~]# lsof -i:22
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    1000 root    3u  IPv4  21050      0t0  TCP *:ssh (LISTEN)
sshd    1000 root    4u  IPv6  21059      0t0  TCP *:ssh (LISTEN)
sshd    1592 root    3u  IPv4  22675      0t0  TCP wj:ssh->192.168.15.1:54887 (ESTABLISHED)

more

空格 显示下一屏
回车 显示下一行
b 显示上一屏
f 显示下一屏
q 退出

nslookup网络工具

nslookup 是一个用于查询域名系统(DNS)的命令行工具,它能够帮助用户诊断网络问题和解析域名或IP地址。

[root@rudder ~]# nslookup baidu.com
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
Name:   baidu.com
Address: 123.125.114.144
Name:   baidu.com
Address: 220.181.111.85
Name:   baidu.com
Address: 220.181.111.86

具体来说,nslookup 可以执行以下操作:

  1. 查询域名对应的IP地址:输入域名后,nslookup 会返回该域名的IPv4和/或IPv6地址。
  2. 查询IP地址对应的域名:输入IP地址后,nslookup 会尝试查找与之相关联的域名。
  3. 指定DNS服务器进行查询:用户可以选择特定的DNS服务器来进行查询,以获取不同服务器的解析结果。
  4. 查看不同类型的DNS记录:例如A记录、MX记录、CNAME记录等,以了解域名指向的具体信息。
  5. 诊断DNS问题:当网络连接出现问题时,使用nslookup 可以帮助确定问题是出在本地计算机还是DNS服务器上。

nslookup 支持交互模式和非交互模式两种使用方式:

  1. 非交互模式:直接在命令行中输入完整的命令和参数,如nslookup www.example.com,然后得到查询结果。
  2. 交互模式:先运行nslookup命令进入交互界面,然后可以逐步输入命令进行查询。

此外,除了命令行版本,还有基于网页的nslookup工具,如Nslookup.io,它允许用户在浏览器中选择不同的DNS服务器并查看各种类型的DNS记录。

总的来说,nslookup 是一个非常有用的工具,无论是网络管理员还是普通用户,都可以通过它来获取域名解析的相关信息,帮助解决网络连接问题。

o

pgrep

#查找名为ssh的进程
pgrep ssh
#查找包含字符串nginx的进程
pgrep -f nginx
#查找用户www-data运行的所有进程
pgrep -u www-data
#查找名为crond的最老进程的PID
pgrep -o crond

pkill杀死进程

pkill 命令:是ps命令和kill命令的结合,用来杀死指定进程

#杀死所有nginx的进程
pkill nginx 

ping

参数解释

  • -c ping的次数
  • -i 每次ping的间隔时间
  • -w 每次ping的等待时间,如果超过这个时间就不ping了

指定次数,时间,等待的时间

# Linux/macOS,发送5次请求
ping -c 5 8.8.8.8  
# Windows,发送5次请求
ping -n 5 www.google.com  

q

rpm

查看系统安装时间

[root@wj ~]# rpm -qi basesystem 
Name        : basesystem
Version     : 10.0
Release     : 7.el7.centos
Architecture: noarch
Install Date: 2024年01月24日 星期三 09时50分18秒   #系统安装时间
Group       : System Environment/Base
Size        : 0
License     : Public Domain
Signature   : RSA/SHA256, 2014年07月04日 星期五 08时46分57秒, Key ID 24c6a8a7f4a80eb5
Source RPM  : basesystem-10.0-7.el7.centos.src.rpm
Build Date  : 2014年06月27日 星期五 18时37分10秒
Build Host  : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
Summary     : The skeleton package which defines a simple CentOS Linux system
Description :
Basesystem defines the components of a basic CentOS Linux
system (for example, the package installation order to use during
bootstrapping). Basesystem should be in every installation of a system,
and it should never be removed.

rsync同步备份

[root@wj ~]# yum -y install rsync
[root@wj ~]# rsync -av /home/  /backupdata/  #将/home/下面的文件,备份到/backupdata/

SELinux

查看selinu是否关闭

[root@wj ~]# sestatus
SELinux status:                 disabled

ssh

端口测试

  • 通的输出结果如下:
[root@centos7-1 ~]# ssh -vp 80 192.168.6.130 
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 58: Applying options for *
debug1: Connecting to 192.168.6.130 [192.168.6.130] port 80.
debug1: Connection established.   #连接建立,代表是通的,主要看这个
debug1: permanently_set_uid: 0/0
debug1: key_load_public: No such file or directory
debug1: identity file /root/.ssh/id_rsa type -1
debug1: key_load_public: No such file or directory
  • 不通的输出如下:
[root@centos7-1 ~]# ssh -vp 8080 192.168.6.130 
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 58: Applying options for *
debug1: Connecting to 192.168.6.130 [192.168.6.130] port 8080.
debug1: connect to address 192.168.6.130 port 8080: Connection refused
ssh: connect to host 192.168.6.130 port 8080: Connection refused   #连接拒绝 主要看这个

远程连接

#默认22端口 可以不用写-p,默认连接root用户
ssh -p 10022 106.14.95.216   
#指定用户登录
ssh -p 22 weblogic@192.168.0.1

ss端口查看

查看已启动的端口

[root@wj ~]# ss -tlwn

tail

查看最后一行信息

tail -n 1 file.txt

tar

参数解释:

-c	建立新的备份文件
-C	切换到指定的目录
-d	对比备份文件内和文件系统上的文件的差异
-x	解压缩归档文件
-v	显示指令执行过程
-f	指定归档文件的文件名
-t	查看归档文件内容
-j	通过 bzip2 指令处理备份文件
-z	通过 gzip 指令处理备份文件
-r	向现有存档文件追加或更新文件或目录
-v	显示指令执行过程
-W	验证归档文件
--totals	备份文件建立后,列出文件大小
--delete	从备份文件中删除指定的文件
--wildcards	在 unix tar 命令中指定匹配模式

只打包不压缩tar

#打包
tar -cvf archive.tar /home/cyberpunk/testdir/
#解包
tar -xvf Archive.tar -C /home/cyberpunk/testdir/

压缩的 tar.gz 归档文件 gzip

#打包
tar -cvzf compressedArchive.tar.gz /home/cyberpunk/testdir

#解包
tar -xvf Archive.tar.gz

生成压缩率更高的 tar.bz2 文件

tar 的 bz2 压缩,可以创建比 gzip 文件小的归档。Bz2 模式执行归档压缩和解压所需的时间比 gzip 模式多。
通常,这个时间差可以忽略不计,但如果文件非常大,或者是文件数量非常多,那么时间差就会非常大。

#打包
tar -cvfj Archive.tar.bz2 /home/cyberpunk/testdir
tar -jcvf mysql.`date +%Y-%m-%d`.tar.bz2 /var/lib/mysql #备份mysql

#解包
tar -xvf Archive.tar.bz2

从 tar 归档文件中提取单个文件

tar --extract --file=archive.tar file1.txt

从 tar 归档文件中提取多个文件

tar -xvf Archive.tar "file 1" "file 2"

使用通配符提取文件组

# tar -xvf Archive.tar --wildcards *.txt'

/home/cyberpunk/testdir/file1.txt
/home/cyberpunk/testdir/file2.txt
/home/cyberpunk/testdir/file3.txt

添加文件或目录到 tar 存档中

#要向现有的 tar 文件中添加文件或目录,可以使用 r 选项。
#例如,我们将 xyz.txt 文件和 php 目录添加到现有的 tecmint-14-09-12.tar 归档文件中。
tar -rvf Archive.tar xyz.txt  #add file
or
tar -rvf Archive.tar php      # add directory

tcpdump抓包

yum -y install tcpdump
yum -y install pv

网速测试

[root@wj ~]# tcpdump -i ens32 -w - | pv -bert >/dev/null
tcpdump: listening on ens32, link-type EN10MB (Ethernet), capture size 262144 bytes
66MiB 0:00:14 [23.9kiB/s]  #66表示总传输数据量,23.9kiB/s表示接口的网速
3269 packets captured
3272 packets received by filter
0 packets dropped by kernel

抓取所有的包

#-s 0 代表不限制包大小 ,0是数字0
#-w 代表输出文件
[root@wj ~]# tcpdump -s 0 -w out.pcap

IP过滤
默认网卡是eth0 如果不是这个需要指定网卡此方式收发都显示信息比较多
tcpdump -i ens32 host 192.168.67.131
如果只想看收,或者发 ,只需用dst 或者src即可 (dst目地  src源地址) 
tcpdump -i ens32 dst/src XXX   
网段过滤
tcpdump -i ens32 192.168.67.0/24
tcpdump -i ens32 192.168.67
端口过滤
tcpdump -i ens32 port 80
tcpdump -i ens32 dst port 80
多个端口
tcpdump -i ens32 port 80 or prot 22 
tcpdump -i ens32 port 80 or 22
端口范围
tcpdump -i ens32 portrange 8000-8080
tcpdump -i ens32 dst/src portrange 8000-8080
常用协议可直接写协议名称
tcpdump -i ens32 port http
tcpdump icmp(ping的协议) 
监听所有网卡
tcpdump -i any 
-w输出保持到文件中,可以保存为cap或者pacp格式,方便wireshark工具打开
tcpdump -i ens32 port http -w 1.pcap
抓取字段解释说明
这里以我随便抓取的一个 tcp 包为例来看一下
21:26:49.013621 IP 172.20.20.1.15605 &gt; 172.20.20.2.5920: Flags [P.], seq 49:97, ack 106048, win 4723, length 48
从上面的输出来看,可以总结出:
第一列:时分秒毫秒 21:26:49.013621
第二列:网络协议 IP
第三列:发送方的ip地址+端口号,其中172.20.20.1是 ip,而15605 是端口号
第四列:箭头 &gt;, 表示数据流向
第五列:接收方的ip地址+端口号,其中 172.20.20.2 是 ip,而5920 是端口号
第六列:冒号
第七列:数据包内容,包括Flags 标识符,seq 号,ack 号,win 窗口,数据长度 length,其中 [P.] 表示 PUSH 标志位为 1,更多标识符见下面
Flags 标识符
使用 tcpdump 抓包后,会遇到的 TCP 报文 Flags,有以下几种:
[S] : SYN(开始连接)
[P] : PSH(推送数据)
[F] : FIN (结束连接)
[R] : RST(重置连接)
[.] : 没有 Flag (意思是除上面四种类型外的其他情况,有可能是 ACK 也有可能是 URG
-a:尝试将网络和广播地址转换成名称;
-A:以ASCII格式打印输出
tcpdump -A -r tt.cap
tcpdump -A |grep baidu
-c&lt;数据包数目&gt;:收到指定20个数据包数目后,就停止进行倾倒操作;
tcpdump -c 20 -w tt.cap
-C: 指定一个1M的交换文件,-W 最多写3个文件,名字为abc0 abc1 abc2 默认从0开始
如果超过3个就循环的覆盖安装
tcpdump -C 1 -W 3 -w abc
-d:把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出;
-dd:把编译过的数据包编码转换成C语言的格式,并倾倒到标准输出;
-ddd:把编译过的数据包编码转换成十进制数字的格式,并倾倒到标准输出;
-D:显示所有可用的网络列表
[root@localhost ~]# tcpdump -D
1.virbr0
2.nflog (Linux netfilter log (NFLOG) interface)
3.nfqueue (Linux netfilter queue (NFQUEUE) interface)
4.ens32
5.any (Pseudo-device that captures on all interfaces)
6.lo [Loopback]
-e:在每列倾倒资料上显示连接层级的文件头,也会显示源和目的MAC地址
-f:用数字显示网际网络地址;
-F&lt;表达文件&gt;:指定内含表达方式的文件;
适合表达式长期维护
more fileter_rule
tcp port 80
tcpdump -F filter_rule
-i&lt;网络界面&gt;:使用指定的网络截面送出数据包;默认是第一块网卡
-l:使用标准输出列的缓冲区,在实时查看时,同时可以保存到文件
tcpdump -l | tee dat
tcpdump -l &gt; dat &amp; tail -f dat
-L:列出网络接口的已知数据链路
[root@localhost ~]# tcpdump -L
Data link types for virbr0 (use option -y to set):
  EN10MB (Ethernet)
  DOCSIS (DOCSIS) (printing not supported)
-n:不把主机的网络地址转换成名字;直接显示IP,避免执行DNS lookups 的过程,速度会快很多。
tcpdump -n 
-nn:不把协议和端口转化为名字,
tcpdump -nn
-N:不列出host的域名地方;将会打印nic 而不是nic.ddn.mil
-O:不将数据包编码最佳化;
-p:不让网络界面进入混杂模式;
-q :简洁输出打印
-Q: 选择入方向还是出方向的数据包可选in out inout
tcpdump -Q in
tcpdump -Q out
tcpdump -Q inout
-r&lt;数据包文件&gt;:从指定的文件读取数据包数据;
-s&lt;数据包大小&gt;:设置每个数据包的大小;
默认是262144bytes
tcpdump -s 50  超出50字节就会被截断
-S:用绝对而非相对数值列出TCP关联数;
-t:在每列倾倒资料上不显示时间;
-tt:在每列倾倒资料上显示未经格式化的时间戳记;
-ttt:输出每两行打印的时间间隔
-tttt:在每行的时间戳之前添加打印日期,此种方式输出的时间最直观
-T&lt;数据包类型&gt;:强制将表达方式所指定的数据包转译成设置的数据包类型;
-v:详细显示指令执行过程;
-vv:更详细显示指令执行过程;
-vvv:更加详细的显示
-x:用十六进制和ascii字码列出数据包资料;
tcpdump -X -r tt.cap
-r 读取数据,然后分析,也可以使用过滤分析。不用wireshark
tcpdump -r 1.log

tracert/traceroute 网络排查

默认使用

tracert wangjian.run  # Windows
traceroute wangjian.run  # Linux/macOS

#-d:该参数的作用是在追踪路由的过程中,不进行 IP 地址到域名的反向解析。这样做能加快命令的执行速度,
#因为不需要等待 DNS 解析的结果。
#-h 30:-h 后面跟着的数字代表最大跳数,这里设置为 30,意味着该命令最多会经过 30 个路由器来尝试找到目标地址。
tracert -d -h 30 wangjian.run

过程说明

Tracing route to wangjian.run [1.1.1.1]
over a maximum of 30 hops:
  1     1 ms     1 ms     1 ms   192.168.1.1       # 第1跳(网关)说明你的电脑到路由器的局域网连接非常健康。
  2     5 ms     4 ms     3 ms   10.0.0.1          # 第2跳(运营商路由器)说明你的宽带出口也是正常的
  3    32 ms    30 ms    28 ms   202.103.44.1      # 第3跳(运营商核心路由器)说明你的宽带出口也是正常的
                                                   # 第4跳 之后就是运营商骨干网
  ......中间如果有不通的,也有可能是禁止ping 了
  10   45 ms    43 ms    41 ms   1.1.1.1           # 目标服务器

ulimit

列出所有限制

[root@wj ~]# ulimit -a
core file size          (blocks, -c) 0  #0代表没有限制,每个文件的最大容量
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited #可建立的单一文件的大小
pending signals                 (-i) 7621
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024 #可同时开启的文件数量
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 7621
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

修改同时开启的文件数量

cp /etc/security/limits.conf /etc/security/limits.conf.bak
vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

修改完成后重新登陆即可。注销再次登陆即可

限制仅能建立10兆以下的文件

[root@wj ~]# ulimit -f 10240
[root@wj ~]# ulimit -a | grep 'file size'
core file size          (blocks, -c) 0
file size               (blocks, -f) 10240
[root@wj ~]# dd if=/dev/zero of=123 bs=1M count=20
文件大小超出限制
[root@wj ~]# dd if=/dev/zero of=123 bs=1M count=10
记录了10+0 的读入
记录了10+0 的写出
10485760字节(10 MB)已复制,0.0193712 秒,541 MB/秒
[root@wj ~]# ll -h
总用量 105M
-rw-r--r--   1 root root  519 2月   6 23:04 -
drwxr-xr-x   2 root root 4.0K 2月   6 23:26 1
-rw-r--r--   1 root root  10M 3月  10 23:27 123

想要解除,需要注销再次登陆即可

wget

#默认直接下载
wget http://tel.mirrors.163.com/centos/6.4/isos/x86_64/CentOS-6.4-x86_64-bin-DVD1.iso 

#综合应用 -b:后台下载 -c:支持断点下载
wget -bc http://192.168.1.10/abc.zip
备注:如果切换到后台下载了需要使用tail -f wget-log 查看进度情况

#下载重命名
wget -O wordpress.zip http://192.168.1.10/abc.zip 

#获取远程文件内容,不用保存到本地,以标准输出
wget -O- http://example.com/file.txt 
wget -O- http://xx.bashcommand.com/test.sh | sh #目前验证有问题

#下载指定格式文件
wget -r -A.pdf http://192.168.1.10/  

#下载整站到本地的download文件夹
wget --mirror -p --convert-links -P /root/download http://192.168.1.10/     
 
#指定目录下载
wget -P /home/download http://tel.mirrors.163.com/centos/6.4/isos/x86_64/CentOS-6.4-x86_64-bin-DVD1.iso    

#限定最大下载字节数
wget -Q 1M http://tel.mirrors.163.com/centos/6.4/isos/x86_64/CentOS-6.4-x86_64-bin-DVD1.iso    

#下载 http://tel.mirrors.163.com/centos/6.4/os/x86_64/ 目录中的所有文件
wget -r -np -nd http://tel.mirrors.163.com/centos/6.4/os/x86_64/   

#限速
wget --limit-rate=300k http://192.168.1.10/abc.zip    

伪装代理名称下载
wget --user-agent="Mozilla/5.0 (Windows NT 6.1; en-US) Chrome/10.0.648.204 Safari/534.16" http://192.168.1.10/abc.zip

#测试下载链接 正常会返回200
wget --spider wangjian.run    

#重试次数,默认20次
wget --tries=40 http://192.168.1.10/abc.zip    

#文件太大,存成多个小文件
wget -i http://192.168.1.10/abc.zip   

#下载FTP服务器的文件
wget --ftp-user=USERNAME --ftp-password=PASSWORD ftp://192.168.1.10/   

whereis

是一个命令行工具,用于查找文件或目录的位置。

[root@wj ~]# whereis python
python: /usr/bin/python /usr/bin/python2.7 /usr/lib/python2.7 /usr/lib64/python2.7 /etc/python /usr/include/python2.7 /usr/share/man/man1/python.1.gz

xargs

用于将标准输入数据转换为命令行参数,与find命令的-exec选项不同,xargs命令可以每次只获取一部分文件而不是全部,并且只为一个进程提供参数,避免因参数过长导致的溢出错误。特别是需要执行类似kill、rm等命令时。

#查找某个进程并杀死
ps -aux|grep mysql | grep -v grep | awk '{print $2}' | xargs kill -9

#查找文件并删除
find /root/ -type f -name "*.txt" | xargs rm -rf

#把前面的结果,当做后面的参数,xargs后面默认是echo
[root@localhost ~]# echo "123" | xargs
123
[root@localhost ~]# echo "123" | xargs echo
123

#-n 1  一次打印一个,默认以空格当做分隔符
[root@localhost ~]# echo "123 456 789" | xargs -n 1
123
456
789

#-d 自定分隔符
[root@localhost ~]# echo -n "123456789" | xargs -d "2"
1 3456789

#-n  不输出换行
[root@localhost ~]# echo -n "123#456#789" | xargs -d "#"
123 456 789

#-p 确认是否要执行,先预览执行的结果 确认全部
[root@localhost ~]# echo -n "123456789" | xargs -d "2" -p
echo 1 3456789 ?...y
1 3456789
# -p -n 1 一次确认一个 
[root@localhost ~]# echo -n "123456789" | xargs -d "2" -p -n 1
echo 1 ?...y
1
echo 3456789 ?...y
3456789

#-t 把每次的执行结果打印出来
[root@localhost ~]# echo -n "123456789" | xargs -d "2" -t -n 1
echo 1 
1
echo 3456789 
3456789

#把管道之前的结果,保存给一个{} ,当做第二个括号的结果
[root@localhost ~]# echo -n "123456789" | xargs -I {} echo {}
123456789

#-r 空参数,不输出
[root@localhost ~]# echo | xargs echo 

[root@localhost ~]# echo | xargs -r echo 
[root@localhost ~]# 

#输出为一行
[root@localhost ~]# cat 2.txt
123
abc
789
\a \n
[root@localhost ~]# cat 2.txt | xargs echo
123 abc 789 a n
#每行显示2个
[root@localhost ~]# cat 2.txt | xargs -n 2 echo
123 abc
789 a
n

#批量创建文件
[root@localhost 2]# cat 2.txt | xargs touch
[root@localhost 2]# ls
123  2.txt  789  a  abc  n

#批量删除文件
[root@localhost 2]# cat 2.txt
123
abc
789
\a \n
[root@localhost 2]# cat 2.txt | xargs touch
[root@localhost 2]# ls
123  2.txt  789  a  abc  n
[root@localhost 2]# cat 2.txt | xargs rm
[root@localhost 2]# ls
2.txt
#是否确认删除 -p,全部确认
[root@localhost 2]# cat 2.txt | xargs -p rm
rm 123 abc 789 a n ?...y
[root@localhost 2]# ls
2.txt
#是否确认删除 -n,一个一个的确认
[root@localhost 2]# cat 2.txt | xargs -p -n 1 rm
rm 123 ?...y
rm abc ?...y
rm 789 ?...y
rm a ?...y
rm n ?...y
[root@localhost 2]# ls
2.txt

yum(dnf)

常用命令

#查找软件
yum search 包名

#只下载包不安装
mkdir -p /root/mysql
yum -y install --downloadonly --downloaddir=/root/mysql/ mysql-community-server
#下载 docker-ce 的更新包到 docker 目录下
yum update docker-ce --downloadonly --downloaddir=/root/docker
下载所有系统/软件更新相关的包
yum update --downloadonly --downloaddir=/root/packages/centos/7/x86_64/updates

中文英文设置

#临时修改英文
export LANG=en_US.utf-8
#临时修改中文
export LANG=zh_CN.utf-8

#centos8 修改方式
#修改英文
echo "export LC_ALL=en_US.UTF-8" >> /etc/profile 

安装桌面

安装桌面或者软件组 先把语言临时设置为英文
#查看当前桌面
systemctl get-default

#6版本
yum -y groupinstall "GNOME Desktop"  

#7版本
yum -y groupinstall "Server with GUI"

系统桌面切换

#命令行启动系统
systemctl set-default multi-user.target

#桌面启动系统
systemctl set-default graphical.target

光盘挂载

mount -t iso9660 /dev/sr0 /mnt
mount /dev/sr0 /mnt  

卸载光盘

umount /dev/sr0  

本地IOS挂载

mount -o loop /root/wj/rhel-server-6.8-x86_64-dvd.iso /mnt

开机自启

注意:7.x版本需要给/etc/rc.d/rc.local 加执行权限

echo "mount -o loop /root/rhel-server-7.9-x86_64-dvd.iso /mnt" >> /etc/rc.local
chmod a+x /etc/rc.local

挂载U盘

linux默认是不支持NTFS文件系统的
fdisk -l  查看U盘设备文件名
mkdir /mnt/usb
mount -t vfat /dev/sdb1 /mnt/usb   sdb1是U盘的名称

配置文件说明

相关配置参数说明
[rhel] ---要有或者[InstallMedia]  仓库名称
name=Red 随便写   仓库描述
baseurl=file:///media/RHEL-6.8 Server.x86_64   media是挂载的目录
baseurl=ftp://192. 168. 0. 6/pub/Server   ftp的配置
enabled=1 --是否启用仓库  1代表启用
gpgcheck=0 ---是否检查包的签名  0代表不检查
##6和7版本
cat > wj.repo <<EOF
[wj] 
name=wj 
baseurl=file:///mnt 
enabled=1 
gpgcheck=0
EOF

#8版本
[BaseOS] 
name=wj 
baseurl=file:///mnt/BaseOS/ 
enabled=1 
gpgcheck=0 
[AppStream] 
name=wj 
baseurl=file:///mnt/AppStream/ 
enabled=1 
gpgcheck=0

yum源更换

sed -i s/mirror.centos.org/vault.centos.org/g /etc/yum.repos.d/*.repo
sed -i s/^#.*baseurl=http/baseurl=http/g /etc/yum.repos.d/*.repo
sed -i s/^mirrorlist=http/#mirrorlist=http/g /etc/yum.repos.d/*.repo

小案例

取文件名

file=ffmpeg-7.0.2.zip
base="${file%.*}"
echo $base
ffmpeg-7.0.2

语法:${变量%模式}

含义:从变量值的末尾开始,删除最短的能匹配模式的字符串,返回剩下的部分。

模式:.* 表示“一个点 + 任意字符”

取文件后缀

file=ffmpeg-7.0.2.zip
ext="${file##*.}"
echo $ext
zip

语法:${变量##模式}

含义:从变量值的开头开始,删除最长的能匹配 模式的字符串,返回剩下的部分。

模式:*. 表示“任意字符 + 一个点”,尽可能长的匹配直到最后一个点

为什么用 ##(两个#)而不是 #(一个#),如果只有一个#,结果就是0.2.zip,文件只有一个点,
所以 ## 和 # 结果相同,但用 ## 更安全,确保只取最后一个点之后的内容。

© 版权声明
THE END
点赞0 分享