Linux常用命令

Awk&Sed&Grep

Grep常用法

1. 常用参数

-n      #显示出过滤出来的所在文件的行号
-v      #排除,取反
-c      #统计过滤出来的内容的总行数
-i      #过滤的时候忽略大小写  
-o      #只显示你要过滤的内容
-w      #精确匹配  只过滤你要过滤的单词,而不是包含这个单词的字符串
-x      #完全匹配字符串 
-r      #递归过滤  针对目录进行操作 
-A      #显示出你要过滤的内容及向下多少行的内容
-B      #显示出你要过滤的内容及向上多少行的内容
-C      #显示出你要过滤的内容向上向下各多少行
-R      #查找所有文件包含子目
-l      #列出文件内容符合指定的范本样式的文件名称
-e      #实现多个选项间的逻辑or关系,例如grep -e 'cat' -e 'dog' filename
-E      #支持扩展正则   ====  egrep
|       # 或者    扩展正则  
*       #前面的字符出现0次或者0次以上 
.*      #所有;表示匹配任意非空字符(1— N个非空字符)
^       #表示以指定字符开头
$       #表示以指定字符结尾
.       #表示匹配任意一个非空字符
?       #表示可以重复前面指定的字符1此或0次
.?      #表示匹配任意两个非空字符

2. 常用指令

  • grep不到内容;rc返回值为非零(echo $?)
  • 精确匹配: grep -w the 111.txt 或 grep <the> 111.txt
  • --color 指定颜色,默认值是--color=auto ; grep -w "1111" 1111.txt --color
  1. grep -Rw --exclude-dir =sys "keys" /etc ##在/etc目录下(排除sys目录)搜索内容包含单词keys
  2. grep -r --exclude-dir={proc,boot,sys} "gnu" /etc ##在系统中查找包含字符串gnu的文件,不包括proc,boot,和sys目录
  3. grep -rl --exclude=*.{png,jpg} linuxprobe ./ #当前工作目录中搜索字符串Linuxprobe,不包括以.png和.jpg结尾的文件
  4. grep -w "^[[:space:]]\{4\}\-$" ##查找空格开头,并且数量就是4个,以’-'结尾的行;横杠“-”字符比较特别, 所以当模式“-”开头时,需要转义符将其转义
  5. grep -e 'cat' -e 'dog' filename ##查找dog或者cat字符串
  6. cat 1111.txt | grep -x wg # -x 完全匹配字符串,与-w不一样,在于,-x匹配的字符串,前后都不能有其他字符,如果有,就匹配不到
  7. grep -Ev '^#|^$' filename ##grep过滤空白行和注释行
##找出当前路径下哪些文件包含ping字段,但是不显示内容,只列出文件名称
[root@k8s-master ansible]# grep -l -r "ping" ./

##过滤掉grep的自身的进程
[root@k8s-master ~]# ps -elf | grep [p]ing
4 S root      20850   2371  0  80   0 - 32139 poll_s 22:16 pts/0    00:00:00 ping -c 30 8.8.8.8

##过滤出ddd前面少于6个的空格的行
[root@k8s-master ~]# cat 1111 | grep "ddd$" | grep -E -v '\ {6,}ddd'
     ddd
[root@k8s-master ~]# cat 1111 
     ddd
        ddd
    dd
#打印字符串
[root@k8s-master ~]# grep -w "ddd" 1111 
     ddd
        ddd

#按整行匹配,前后都有空格也不行
[root@k8s-master ~]#  grep -x "ddd" 1111 
ddd

# -q:不会输出任何信息,如果命令运行成功返回0,失败则返回非0值
[root@k8s-master ~]# grep -q  "dd" 1111 
[root@k8s-master ~]# echo $?
0
[root@k8s-master ~]# grep -q  "ddddd" 1111 
[root@k8s-master ~]# echo $?
1

#将“a b”打印出来
[root@k8s-master bash]# grep -n 'a[[:space:]]b' 1111
4:a b
[root@k8s-master bash]# grep -n 'a[ \t]b' 1111
4:a b
#打印a和b中包含任意空格的
[root@k8s-master bash]#grep -n 'a[ \t]*b' 1111
4:a b
5:a  b

Sed常用法

sed全称是:Stream EDitor(流编辑器)
sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
模式空间(pattern space): sed处理文本内容行的一个临时缓冲区,模式空间中的内容会主动打印到标准输出,并自动清空模式空间

保持空间(hold space): sed处理文本内容行的另一个临时缓冲区,不同的是保持空间内容不会主动清空,也不会主动打印到标准输出,而是需要sed命令来进行处理

####模式空间与保持空间进行交互:使用高级命令h,H,g,G与模式空间进行交互
d : 删除模式空间的内容,开始下一个循环
D : 删除模式空间/n(换行符)前面的内容
h : 【复制】模式空间的内容至保持空间(会覆盖保持空间的原内容)
H : 把模式空间的内容【追加】至保持空间
g : 【复制】保持空间的内容至模式空间(会覆盖模式空间的原内容)
G : 把保持空间的内容【追加】至模式空间
x : 【交换】模式空间与保持空间的内容

1. 常用参数

选项参数:
-f : 直接将sed的操作写在一个文件内,-f filename则可以执行filename内的sed操作
-e :   #多个命令一起操作##sed -e 's/brown/green/;s/dog/cat/' sed.txt 
-r :   #支持扩展正则表达式
-i :   #直接修改文件内容,而不是输出到屏幕上

action的参数:
a : 新增。a的后面接字符,而这些字符会在新增到下一行
i : 插入。i的后面接字符,而这些字符会在新增到上一行
c : 替换。c的后面接字符,这些字符替换n1到n2的行
d : 删除。因为是删除,所以d后面通常不接任何东西
p : 打印。将匹配的数据打印出来。通常p会与选项-n一起使用; sed -n '3p' file
s : 替换。将文件原内容替换为新内容。举例:s/lod/new/g

^:     #行首
$:     #行尾
.:     #单个字符 
*:     #0个或者多个匹配 + 1个或者多个匹配
?:     #0个或者1个匹配
{m}:   #前面的匹配重复m次 
{m,n}: #前面的匹配重复m到n次

2. 常用指令
带 g —— 全部替代
无 g —— 只替代每行第一个

显示-n
  1. sed -n 'line_num,/pattern/' file_name ##获取指定行号到首次匹配模式行之间的内容
  2. sed -n '3,/root/p' /etc/passwd ##打印第3行到首次匹配root字符串之间的文本内容
  3. sed -n '/^root/{/bash/p}' /etc/passwd #同时匹配行首为root且包含bash字符串的行
  4. sed -n '/root/,+2p' /etc/passwd #提取从root的行,及其其后2行
  5. sed -n '/root/,+1p; /home/,+2p' /etc/passwd 提取root后面的1行,home后面的2行
  6. [root@k8s-master bash]# sed -n 'x;$p' ping.sh ##打印文本中倒数第二行内容
  7. [root@k8s-master bash]# sed -n '3,6p' /etc/passwd ##打印第3-6行内容
  8. [root@k8s-master bash]# sed -n '1p;4p' /etc/passwd ##打印第一行和第四行
  9. [root@k8s-master bash]# sed -n '/root/p' /etc/passwd ##打印匹配包含root行
  10. [root@k8s-master bash]# sed -n '/root$/p' /etc/passwd ##打印root结尾的行
  11. [root@k8s-master bash]# sed -n 'p' 2.sh ##打印文件所有内容
  12. [root@k8s-master bash]# sed -n '/^bin/p' /etc/passwd ##打印bin开头的行
  13. [root@k8s-master bash]# sed -n '$=' 2.sh ##打印该文件行数,一共多少行
  14. sed -n '/ip/I p' test.txt ## I忽略大小写打印ip所在行
  15. sed -n '/the/=' test.txt ##输出包含the的所在行的行号(= 用来输出行号)
##sed 打印匹配内容行号
[root@k8s-master bash]#  sed -n '/dd/=' 1111

###打印匹配sys开头行以及mem行中间内容
[root@k8s-master bash]# sed -n '/^sys/,/mem/p' 1111

###使用以下 sed 命令打印包含dd表达式的行以及它的下一行。
[root@k8s-master bash]# sed -n '/dd/{N;p;}' 1111
     ddd
        ddd
    dd
a b
新增-a

a:新增,当前行的新增到下一行
sed -i '$a 添加的内容' filename # 在最后一行行后添加字符串

删除-d
sed -i ##加-i是对文件真正的修改
  1. [root@k8s-master bash]# sed 'd' 2.sh ##删除所有内容
  2. [root@k8s-master bash]# sed '/echo/!d' 2.sh ##删除不包含echo的行
  3. [root@k8s-master bash]# sed '/^echo/d' 2.sh ##删除echo开头的行
  4. [root@k8s-master bash]# sed '$d' 2.sh #删除文件最后一行
  5. [root@k8s-master bash]# sed '/^$/d' 2.sh #删除文件所有空行
  6. [root@k8s-master bash]# sed '1,3{/dd/d;}' 1111 ##删除第1到3行中包含dd表达式的行
替换-s

sed 's/^/添加的头部&/g; s/$/&添加的尾部/g' 1.txt #同时执行两个替换规则,中间用分号分开

#注意这里的 " & " 符号, 如果没有 “&”, 就会直接将匹配到的字符串替换掉

  1. sed 's/^/str&/g' file_name  #在所有行首添加str字符串
  2. sed 's/$/&str/g' file_name #在所有行末尾添加str字符串
  3. sed '2s/Str_A/Str_B/g' file_name #替换第 2 行中的字符串(Str_A替换为Str_B)
  4. sed '$s/原字符串/替换字符串/g' #替换最后一行
  5. sed '2,5s/原字符串/替换字符串/g' #替换第 2 到 5 行
  6. sed '2,$s/原字符串/替换字符串/g' #替换第 2 到最后一行
  7. sed -i 's/"//g' test.txt ##去除双引号
  8. sed -i $'s/\'//g' test.txt ##去除单引号
  9. sed 's/root/ROOT/g' 2.sh ##将所有root都换成ROOT
  10. sed 's/root//g' 2.sh ##将所有root字符串删除(替换为空格)
  11. sed '4,7s/^/#/' 2.sh ##4-7行添加注释
  12. sed '4,7s/^#//' 2.sh ##4-7行解开注释
  13. sed -i "s/$hadoop_old/$hadoop_101_ip/g" /etc/hosts #带变量的更新,要用双引号
  14. sed -i "s/redmi/potato/2" test.txt#第三个“/”后,加参数2就是替换第2个
  15. sed 's/[\[,]//g' test.txt ##删除[和,
  16. sed 's/[{},]//g' test.txt ##删除{ }和,
[root@k8s-master bash]# sed 's/\(.*\)"/\1/'   #删除最后面的双引号

[root@k8s-master bash]# sed 's/,$//'   #删除最后面的逗号

[root@localhost ~]# sed 's/.*GeForce //g' a.txt  ##删除所有行中GeForce字符以及之前的内容

[root@localhost ~]# sed 's/.*\(GeFo.*\)/\1/g' a.txt ##删除所有行中GeForce字符之前的内容(不包含该字符)

[root@localhost ~]# sed 's/Ti -.*//g' a.txt  ##删除指定内容自身及以后所有的字符串内容

[root@k8s-master bash]# sed 's/^/"&/g' tmp.txt  #在每行行首添加双引号"
[root@k8s-master bash]# sed 's/$/",&/g' tmp.txt  #在每行行尾添加双引号和逗号

[root@k8s-master bash]#sed 's/^[ \t]*//g'  ##删除字符串行首空格(删除文件名首部空格)
[root@k8s-master bash]#sed 's/[ \t]*$//g'  ##删除字符串行尾空格(删除文件名尾部空格)
去除字符串中所有空格(去除字符串中所有空格)sed  's/[[:space:]]//g'
[root@5201351 ~]# sed 's/^ *//' 111.txt       //这样只能匹配空格开头    
[root@5201351 ~]# sed 's/^\s*//' 111.txt  //也可以这样写,除了空格还可以匹配制表符
[root@5201351 ~]# sed 's/^[[:space:]]*//' 111.txt   //也可以这样写,除了空格还可以匹配制表符
插入-i

插入,i的后面接字符,而这些字符会新增到上一行
sed -i '1i 添加的内容' filename # 在第一行前添加字符串
sed -i '$i 添加的内容' filename # 在最后一行行前添加字符串

Other Command
sed -i '/1111111:/c  \  11111111: 1'   2222.txt #将匹配到的内容替换为后面的,11111111: 1这前面是有两个空格的

[root@k8s-master bash]# sed '/echo/c 33echo22' 2.sh ##将echo所在的行,整行替换为33echo22
[root@k8s-master bash]# sed '3c AAAA' 2.sh ##将第三行整行替换为AAAA
[root@k8s-master bash]# sed '$r /etc/passwd' 2.sh ##将/etc/passwd中的所有内容追加到2.sh中
[root@k8s-master bash]# sed '3w 2.sh' /etc/passwd ##将/etc/passwd中的第3行内容写到2.sh(覆盖)

[root@k8s-master bash]# sed '1,3w 2.sh' /etc/passwd ##将/etc/passwd中的第1-3行内容写到2.sh(覆盖)
[root@k8s-master bash]# sed '/^#/!w 2.sh' /etc/inittab ##将/etc/inittab中的非#开头的内容写到sh中

###将1111中内容的2-5行写到2222.txt
[root@k8s-master bash]#sed -n '2,5 w 2222.txt' 1111
###w filename标志:将修改的内容存入filename文件中
[root@k8s-master bash]#sed '3s/dog/cat/w sed3.txt' sed2.txt 

###将每行的数据用“”引起来
[root@k8s-master bash]# sed 's/.*/"&"/' 1111

###将匹配到aaa的行内容中的etc替换为usr
[root@k8s-master bash]# sed '/aaa/s@/etc@/usr@g' file

###更改源文件,并生成一个file.bak文件,使用i参数同时指定bak文件
[root@k8s-master bash]# sed -i.bak 's/a/b/' file
[root@k8s-master bash]# sed -i.bak '1 d' passwd

查找目录中的py文件,删掉所有行级注释
[root@k8s-master bash]# find ./ -name "*.py" | xargs sed  -i.bak '/^[ ]*#/d'
查看第5-7行和10-13行
[root@k8s-master bash]# sed -n -e '5,7p' -e '10,13p' file

#####使用y参数进行大小写转换,将n和o都替换成大写的NO
[root@k8s-master bash]# sed 'y/no/NO/' test.txt

H复制到剪贴板---d删除---$G追加到行尾
[root@k8s-master bash]# sed '/the/{H;d};$G' test.txt 

将1-5行移动到17行后
[root@k8s-master bash]# sed '1,5{H;d};17G' test.txt 
将1-5行复制到10行后
[root@k8s-master bash]# sed '1,3{H;};10G' test.txt

将包含the的行另存为新文件
[root@k8s-master bash]# sed '/the/w out.file' test.txt 

Awk常用法

AWK 常用命令
1. 常用参数

[root@k8s-master bash]# awk '{a+=$1}END{print a}' ##q求第一列的和
[root@k8s-master bash]# awk -F "" '{for(i=1;i<=NF;++i) if($i=="root") ++sum}END{print sum}' test.c ##,先按空格分割,然后统计每行中root出现的次数
aarootbb root cc root ##这个结果是2
1、统计每行中d字符出现的次数
[root@k8s-master bash]#awk '{print gsub(/d/,"&")}' a.txt   ## 统计每行中d出现的次数
2、统计文件中t字符出现的总次数
[root@k8s-master bash]#awk -v RS="$?@" '{print gsub(/t/,"&")}' a.txt
3、使用awk将文件的前12列替换为空
[root@k8s-master bash]#awk '{for(i=1;i<=12;i++)$i="";print $0}' 111.txt
4、直接去除重复的不排序
  awk ' !x[$0]++' 111.txt
5、echo " A BC " | awk '$1=$1' 去除字符串前后的空格,而不是中间的空格
 awk '{for(i = 1; i <= NF; i++) if ($i ~/std/) printf("%s ", $i); printf("\n")}'

 awk '{if(NR % 2 == 0) {print $0} else {printf("%s\t",$0)}}' test.txt  ## 两行数据合成一行,4行数据变成2行,8行数据变成4行
 awk '{if(NR % 3 == 0) {print $0} else {printf("%s\t", $0)}}' test.txt | sed '$ s/$/\n/' ## 三行数据合成一行,6行数据变成2行,9行数据变成3行

cat 111.txt | awk '$=' ##打印最后一行行号
awk 单引号分割 语法如下:awk -F ''\'''

xargs

xargs(英文全拼: eXtended ARGuments)是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。
xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。
xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行
-p 当每次执行一个argument的时候询问一次用户。
-n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。
-t 表示先打印命令,然后再执行。
-i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。
-r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。
-s num 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数。
-L num 从标准输入一次读取 num 行送给 command 命令。
-l 同 -L。
-d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符。
-x exit的意思,主要是配合-s使用。。
-P 修改最大的进程数,默认是1,为0时候为as many as it can ,这个例子我没有想到,应该平时都用不到的吧。

$ echo -e "123\n456\n789" | xargs
123 456 789
$ echo -e "123\n456\n789" | xargs | sed 's/ /\n/g'  ##一行内容变成3行;把空格变成换行符
123
456
789
tr -d ' '|xargs | sed 's/ /','/g'  合成一行,按,分开
###6,6

多行输入单行输出:# cat test.txt | xargs
-n 选项多行输出:# cat test.txt | xargs -n3 每行输出3个参数
#echo “nameXnameXnameXname” | xargs -dX ##以x分隔
name name name name

echo “nameXnameXnameXname” | xargs -dX -n2
name name
name name
假如你有一个文件包含了很多你希望下载的 URL,你能够使用 xargs下载所有链接:
cat url-list.txt | xargs wget -c
echo {1…100} | xargs -p -n1 -Ii curl https://api.example.com/i
echo “one two three” | xargs mkdir

基础命令

shell 输入y或者yes

# 一次
echo yes|[命令] # 输入 yes
echo y|[命令] # 输入 y
# 多次
yes yes|[命令] # 输入 yes
yes y|[命令] # 输入 y

expr 数值计算

加法运算:+
减法运算:-
乘法运算:*
除法运算:/
求摸(取余)运算:%

result=`expr 2 + 3`
result=$(expr $no1 + 5)
$ expr 2 + 3
5

history

~/.bash_history  ##该文件存储已执行的命令
/etc/profile     ##存储一些变量,来配置history

history的命令是实时的,即刚执行的命令,使用history就能查到
bash_history文件中存放的命令不是实时的,需要退出当前终端,或者执行 history -w命令
同用户多终端执行命令,history命令只显示当前终端执行过的命令
-w   将目前history写入到bash_history
-c  将目前shell history中命令消除(暂时,退出终端后恢复);记录在.bash_history中的命令记录不会被该命令清除
-d n: 删除历史中指定的第n个命令
-p : 显示以指定字符串开头的历史命令
history -p "ls" ###显示以指定字符串开头的历史命令
记录history执行时间,history 默认不记录时间 
vim /etc/profile ,在文件尾部添加
export HISTTIMEFORMAT="%y-%m-%d %H:%M:%S "
HISTSIZE=1000  ##存储1000行
source /etc/profile  ##添加完之后执行
history | tail -n 20  ##查看最后20行命令
history | head -n 20  ##查看开始20行命令
history -c;history -w  ##清空执行命令的历史
history -n 10用于显示最近n条命令
设置vim 不记录命令 :set history=0

#####清空历史记录
history -w ;> /root/.bash_history;history -c;history -c;history -c;

head && tail

tail -n +3 f1:显示文档从第三行开始到结尾的文字
tail -n 3 f1 : 显示最后三行
head -n 3 f1:前三行
head -n -3 f1:显示除了后三行的所有内容

paste

paste 命令用于合并文件的列;每个文件以列对列的方式,一列列地加以合并

paste -s file             #合并指定文件的多行数据
paste -d '-'  指定合并的分割符;默认是空格;按列合并
paste -s 按行合并
paste -s file1 file2 每个文件作为一行
paste -d ',' file1 file2 ##按列合并,file1是1列,file2是1列,然后用逗号分割

!命令

!历史命令序号: 执行该序号所对应得命令
!!:执行上一个命令
如果想用某个命令的参数 ![命令名]:[参数号]
cp -rf dira dirb #将dira拷贝到dirb
cat !cp:2 等价于cat dira

Tar

tar -zxvf file.tar.gz -C output_folder ##解压文件到output_folder这个目录
tar -tvf file.tar.gz ##查看压缩包有哪些文件

zip filename.zip -r dir1 dir2 ##将dir1和dir2 目录压缩为filename.zip
unzip filename.zip ##解压至当前目录
unzip filename.zip -d specdir ##解压到指定目录specdir

Sort

-o <输出文件> 将排序后的结果存入指定的文件,可以将结果写入原文件
sort -r number.txt -o number.txt
-r 降序排列(默认是升序)
-t <分隔字符> 指定排序时所用的栏位分隔字符
#### -t 如果需要用空格作为分隔符,-t ’ ’ 和 -t " " 效果是一样的(引号中间,只能有1个空格!)
-k field1[,field2] 按指定的列进行排序
-u 排序后相同的行只显示一次(默认按整行进行比较)

SSH

ssh username@hostname/IP  ##连接到远程主机,默认的 SSH 端口(22),则可以省略 -p 参数
ssh -p port_number username@hostname  ##指定非默认端口号连接,port_number 是要连接的远程主机上的 SSH 服务所在的端口号
ssh username@hostname command  ##在连接中执行单个命令
####其中 file_name 是本地文件的路径,/remote/directory 是远程主机上您要复制文件的目标目录
scp file_name username@hostname:/remote/directory  ##复制本地文件到远程主机
####其中 remote/file_path 是远程主机上的文件路径,local_path 是本地计算机上的目标路径。
scp username@hostname:/remote/file_path local_path
ssh -v username@hostname  ##显示远程主机上可用 SSH 版本
rsync -a username@hostname:/remote/directory/ /local/directory/ ##使用 rsync 命令将远程主机上的目录同步到本地
scp -r local_directory username@hostname:/remote/directory  ##将本地计算机上的文件夹复制到远程主机

ssh 有一个非交互方式登录 StrictHostKeyChecking
主机公钥确认 StrictHostKeyChecking
StrictHostKeyChecking=no 最不安全的级别,当然也没有那么多烦人的提示了,相对安全的内网测试时建议使用。如果连接server的key在本地不存在,那么就自动添加到文件中(默认是known_hosts),并且给出一个警告。
StrictHostKeyChecking=ask 默认的级别,就是出现刚才的提示了。如果连接和key不匹配,给出提示,并拒绝登录。
StrictHostKeyChecking=yes 最安全的级别,如果连接与key不匹配,就拒绝连接,不会提示详细信息。

ssh -o StrictHostKeyChecking=no 或者写到直接写到ssh文件
# ~/.ssh/config 中添加如下信息
Host *
  StrictHostKeyChecking no

ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null 192.168.0.110或者在连之前先删除旧密钥ssh-keygen -R IP

SSH 公钥检查是一个重要的安全机制,可以防范中间人劫持等黑客攻击。但是在特定情况下,严格的 SSH 公钥检查会破坏一些依赖 SSH 协议的自动化任务,就需要一种手段能够绕过 SSH 的公钥检查。
首先看看什么是 SSH 公钥检查
SSH 连接远程主机时,会检查主机的公钥。如果是第一次该主机,会显示该主机的公钥摘要,提示用户是否信任该主机:
The authenticity of host '192.168.0.110 (192.168.0.110)' can't be established.
RSA key fingerprint is a3:ca:ad:95:a1:45:d2:57:3a:e9:e7:75:a8:4c:1f:9f.
Are you sure you want to continue connecting (yes/no)?
当选择接受,就会将该主机的公钥追加到文件 ~/.ssh/known_hosts 中。当再次连接该主机时,就不会再提示该问题了。 如果因为某种原因(服务器系统重装,服务器间IP地址交换,DHCP,虚拟机重建,中间人劫持),该IP地址的公钥改变了,当使用 SSH 连接的时候,会报错:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
e9:0c:36:89:7f:3c:07:71:09:5a:9f:28:8c:44:e9:05.
Please contact your system administrator.
Add correct host key in /home/jiangxin/.ssh/known_hosts to get rid of this message.
Offending key in /home/jiangxin/.ssh/known_hosts:81
RSA host key for 192.168.0.110 has changed and you have requested strict checking.
Host key verification failed.
上面的警告信息说的是:
服务器公钥已经改变,新的公钥的摘要是:e9:0c:36:89:7f:3c:07:71:09:5a:9f:28:8c:44:e9:05.
该服务器原来的公钥记录在文件 ~/.ssh/known_hosts 中第 81 行。
如果确认不是中间人劫持,需要连接到该服务器,怎么办呢?最简单的就是用 vi 打开 ~/.ssh/known_hosts 文件,定位到 81 行,将该行删除。之后就可以使用 ssh 连接了。
如何让连接新主机时,不进行公钥确认?
在首次连接服务器时,会弹出公钥确认的提示。这会导致某些自动化任务,由于初次连接服务器而导致自动化任务中断。或者由于  ~/.ssh/known_hosts 文件内容清空,导致自动化任务中断。 SSH 客户端的 StrictHostKeyChecking 配置指令,可以实现当第一次连接服务器时,自动接受新的公钥。只需要修改 /etc/ssh/ssh_config 文件,包含下列语句:
Host *
 StrictHostKeyChecking no
或者在 ssh 命令行中用 -o 参数
$ ssh  -o StrictHostKeyChecking=no  192.168.0.110

如何防止远程主机公钥改变导致 SSH 连接失败:

当确认中间人劫持攻击风险比较小的情况下,才可以使用下面的方法,禁用 SSH 远程主机的公钥检查。 SSH 客户端提供一个 UserKnownHostsFile 配置,允许指定不同的 known_hosts 文件。那么将 known_hosts 指向不同的文件,不就不会造成公钥冲突导致的中断了么?
$ ssh -o UserKnownHostsFile=/dev/null 192.168.0.110
The authenticity of host '192.168.0.110 (192.168.0.110)' can't be established.
RSA key fingerprint is e9:0c:36:89:7f:3c:07:71:09:5a:9f:28:8c:44:e9:05.
Are you sure you want to continue connecting (yes/no)?
看,提示信息由公钥改变中断警告,变成了首次连接的提示。 和之前提到的 StrictHostKeyChecking 配置配合使用,则不再有任何警告出现了:
$ ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null 192.168.0.110
Warning: Permanently added '192.168.0.110' (RSA) to the list of known hosts.
jiangxin@192.168.0.110's password:

免密登录:

ssh-keygen是为ssh生成、管理和转换认证密钥的工具,它支持rsa和dsa两种认证密钥,默认rsa加密。
使用ssh-keygen生成公钥和私钥文件(默认在 ~/.ssh 目录,id_rsa.pub文件是公钥文件,另一个id_rsa是私钥文件)。
然后使用ssh-copy-id把生成的公钥拷贝到你要远程免密登录的目标服务器上

ssh-keygen
ssh-copy-id root@test

需要免密登录的用户
/etc/ssh/sshd_config

ssh-keygen -t rsa -f ~/.ssh/id_rsa -N '' ##生成密钥对

ssh-keyscan 192.168.1.1 ##显示主机192.168.1.1的公钥,默认密钥类型是rsa;可以通过-t 指定密钥类型rsa或者dsa;

执行上面文件,会输出以下内容,但是不会增加到know_hosts中
# 192.168.1.1:22 SSH-2.0-OpenSSH_7.4p1
# 192.168.1.1:22 SSH-2.0-OpenSSH_7.4p1
192.168.1.1 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDOmNCdrE4/h1XzRJu6dAX8pmIxVhFwvaaJ40O5S6aB2sTfGdkCnqoigHwlvBlLPyzeKI7udIaqez7XDgqCa9TjInJs9Rlgm9L1fvLJQ2TfmYWXwmTbyt0ub7GiC2tGDiHmKXGS24pu7DftAtumAN55tXYOeQ5PFV8WysKmBD5Vfcv/Wpxbcqs9ktpmhorPsR8gk+dN/xCa36kz8rhf3GF5sdSpDJLMADAdn1Ft69qqcDveEYxHkL1ZL3uKEChgNNuKdvyRNoFYABzM8O8gopif2mehU7NyG1CIeYKIMGM5Uk9ek70H6JtchY7N1nsddqb66BK7RA3o8vCfnwXlNJCD
# 160.31.40.1:22 SSH-2.0-OpenSSH_7.4p1

#######将200.27-200.33的主机的密钥信息写入到~/.ssh/known_hosts中
for host in 192.168.200.{27..33} node{1..7};do
  ssh-keyscan $host >>~/.ssh/known_hosts 2>/dev/null
done

ssh-copy-id:
ssh-copy-id命令 可以把本地主机的公钥复制到远程主机的authorized_keys文件上,ssh-copy-id命令也会给远程主机的用户主目录(home)和~/.ssh, 和~/.ssh/authorized_keys设置合适的权限

# sshpass -p选项指定的是密码,,将本地主机公钥复制到200.27-33主机上
for host in 192.168.200.{27..33} node{1..7};do
  sshpass -p'123456' ssh-copy-id root@$host &>/dev/null
done

-i:指定公钥文件
ssh-copy-id user@server
ssh-copy-id -i ~/.ssh/id_rsa.pub user@server  ##将指定文件复制到远程主机user@server上

Systemd

$ systemctl enable service  # 设置加入自启动
$ systemctl disable service   ##设定指定服务开机关闭
$ systemctl is-enabled service # 查看是否加入自启动
$ systemctl start httpd  ## 开启服务
$ systemctl status httpd  ## 查看服务状态
$ systemctl stop httpd.service  ##停止服务
$ systemctl restart httpd.service  ##重启服务
$ systemctl cat sshd.service   ##查看服务配置文件
$ systemctl list-units     ##列出当前系统服务的状态
$ systemctl list-unit-files ##列出服务的开机状态
修改配置文件之后:
# 重新加载配置文件
$ systemctl daemon-reload
# 重启相关服务
$ systemctl restart foobar
systemctl reload sshd 重新加载sshd服务的配置文件
systemctl list-units 列出当前所有运行单元
systemctl list-dependencies sshd 查看sshd服务所依赖的unit
systemd-analyze blame | head -5 查看每个服务的启动耗时,并打印top5
systemd-analyze critical-chain 打印最耗时的一条启动链,后面若加指定的服务,则打印该服务的启动链
systemctl list-unit-files 列出所有可用单元
systemctl --failed ##列出所有失败单元
systemctl list-unit-files --type=service ##列出所有服务(开启或禁用)



Service&&chkconfig

查看当前所有服务:service --status-all
开启当前服务:service 服务名 start
关闭当前服务:service 服务名 stop
重启当前服务:service 服务名 restart
查看当前服务状态:service 服务名 status
chkconfig --list      #列出所有的系统服务
chkconfig --list mysql  ##查看mysql的开机自启情况
chkconfig httpd on ##开机自启
chkconfig network off  ##关闭开机自启
# 或
chkconfig --level 2345 network off


journalctl

查询和操作由systemd进程管理的日志

journalctl --help 
journalctl  ##查看所有日志
journalctl -r   ##按时间倒序查看所有日志
journalctl -n 10  ##查看最新的10条日志
journalctl -f    ##实时查看新添加的日志条目
journalctl -u nginx  ##根据服务名称过滤
journalctl _PID=2001  ##根据进程ID过滤
journalctl --since="2021-07-01" --until="2021-07-31 03:00"
journactl --since "2020-10-20 18:12:12"
journactl --since "20 min ago"
journactl --since yesterday
journactl --since ""  --until ""
sudo journalctl --vacuum-time=1s  ##清空所有日志
journalctl --vacuum-size=1   ##清除超过特定大小的日志
journalctl --disk-usage   ##查看日志占用空间大小
可以采用暴力方式直接删除日志文件
sudo systemctl stop systemd-journald
sudo rm -rf /var/log/journal/*
sudo systemctl start systemd-journald

sysctl

在内核运行时动态地修改内核的运行参数,可用的内核参数在目录/proc/sys中

sysctl:
-a all 查看所有内核参数变量和值
-w write 修改内核参数
-p 从配置文件“/etc/sysctl.conf”加载内核参数设置

1.屏蔽别人 ping 你的主机(布尔型用 1 来表示‘yes‘,用 0 来表示‘no‘)
sysctl -a | grep icmp
  net.ipv4.icmp_echo_ignore_all = 0
sysctl -w net.ipv4.icmp_echo_ignore_all=1
sysctl -p

2.开启内核路由转发功能
sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

fs.aio-max-nr = 65536	# io读写参数
fs.file-max = 6553600	# 最大打开文件数
kernel.shmall = 18446744073692774399	# 共享内存参数
kernel.shmmax = 18446744073692774399	# 共享内存参数最大值
kernel.shmmni = 4096	# 共享内存参数最小值
kernel.sem = 250 32000 32 128#
net.ipv4.ip_local_port_range = 32768    60999	# 本机允许对外的端口映射范围
net.core.rmem_default = 262144	# 接收套接字缓冲区大小的默认值(以字节为单位)
net.core.rmem_max = 4194304		# 接收套接字缓冲区大小的最大值(以字节为单位)
net.core.wmem_default = 262144	# 发送套接字缓冲区大小的最大值(以字节为单位)。
net.core.wmem_max = 1048586		# 用来限制监听(LISTEN)队列最大数据包的数量,超过这个数量就会导致链接超时或者触发重传机制
net.ipv4.tcp_tw_recycle = 1 #启用timewait快速回收。和下面这个是一对
net.ipv4.tcp_tw_reuse = 1 #开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接。这对于服务器来说很有意义,因为服务器上总会有大量TIME-WAIT状态的连接。

pstree

安装pstree : yum -y install psmisc

pstree -p pid 显示某个进程的进程树

lsof

查看哪些进程打开了哪些文件,哪些文件由哪些进程打开
[root@hadoop101 ~]# yum install lsof -y
[root@hadoop101 ~]# lsof -v
[root@hadoop101 ~]# lsof -i:22 #查看22端口运行情况
[root@hadoop101 ~]# lsof -a -u root -d txt # 指定进程打开的文件类型为txt
[root@hadoop101 ~]# lsof file_name # 显示关于某个文件的信息
[root@hadoop101 ~]#
[root@hadoop101 ~]# ls -ld /proc//fd/ | grep deleted ##查看未释放的文件
lsof | grep /var/log/messages 查看是否有进程打开这个文件
lsof -p PID 查看该进程打开的内容
lsof -c mysql 查看mysql 查看了哪些内容
[root@hadoop101 hadoop]# lsof /var/log/messages
lsof+文件路径: 查看文件被哪个进程占用

恢复删除的文件:
rm -rf 11.txt
lsof | grep 11.txt ##找到进程id
cat /proc/进程id/fd/3 #里面就是删除的内容
在这里插入图片描述
FD文件描述符列表:
cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
mem:memory-mapped file(内存映射文件);
mmap:memory-mapped device(内存映射设备);
pd:parent directory(父目录);
rtd:root directory(跟目录);
tr:kernel trace file (OpenBSD)(内核跟踪文件);
0:表示标准输出
1:表示标准输入
2:表示标准错误

time

将基础时间变成时间戳:time1=$(date +%s -d '2023-12-04 18:18:18')
将要增加的时间变为秒:time2=$((1*60*60+20*60))
两个时间相加减:
time1=$(($time1+$time2))
time1=$(date +%Y-%m-%d\ %H:%M:%S -d "1970-01-01 UTC $time1 seconds");
echo $time1
1990-01-01 02:21:01
#如果是分钟,则可以把 seconds换成minutes,天则可以换成 days ,星期换成weeks,月换成months,年换成years


两个时间差多少s
同样转成时间戳,然后计算天,时,分,秒
time1=$(($(date +%s -d '2023-12-04 18:18:18') - $(date +%s -d '2023-12-04 17:59:47')))
echo $time1
####涉及变量
run_time=$((`date +%s -d "$end_time"`-`date +%s -d "$start_time"`))

tcpdump

-i: 指定监听的网络接口;网口编号数字或者网口别名
-vv: 输出详细的报文信息
-D 是显示所有的可跟踪的接口;用于-i后面指定网络接口用
-n 来关闭dns反向解析功能,-nn是关闭反向查询功能并以数字格式显示ip地址端口号,和url地址
-t是不显示时间戳,-tt显示时间戳,-ttt显示请求和响应的时间的时间差
-e 用来显示源,目标ip的mac地址

tcpdump -i eth0 -vnn host 192.168.0.1 ##抓取包含192.168.0.1的数据包
tcpdump -i eth0 -vnn net 192.168.1.0/24 ##抓取包含192.168.1.0/24网段的数据包
tcpdump -i eth0 -vnn port 22    ##抓取包含端口22的数据包
tcpdump -i eth0 -vnn icmp/arp   ##抓取icmp/arp协议的数据包
tcpdump -i eth0 -vnn src host 192.168.0.1  ##抓取源ip是192.168.0.1数据包
tcpdump -i eth0 -vnn dst host 192.168.0.1  ##抓取目的ip是192.168.0.1数据包
tcpdump -i eth0 -vnn src port 22  ##抓取源端口是22的数据包
tcpdump -i eth0 -vnn src host 192.168.0.1 and dst port 22 ##抓取源ip是192.168.0.1且目的ip是22的数据包
tcpdump -i eth0 -vnn src host 10.10.10.122 or port 22 ##抓取源ip是10.10.10.122或者包含端口是22的数据包
tcpdump -i eth0 -vnn src host 10.10.10.122 and not port 22  ##抓取源ip是10.10.10.122且端口不是22的数据包
tcpdump –i eth0 -vnn -w /tmp/1111 -c 100  ##抓取的数据包记录存到/tmp/1111文件中,共抓取100个数据包
tcpdump –i eth0 -vnn -r /tmp/111 tcp ##从/tmp/111记录中读取tcp协议的数据包
tcpdump –i eth0 -vnn -r /tmp/fil1 host 10.10.10.58 ##从/tmp/fill记录中读取包含10.10.10.58的数据包
tcpdump  -i  eth0  -nne   icmp

Arp层格式就是请求和应答:
Request arp who-has 目的ip tell 源ip地址
Reply arp reply 目的地址 is-at 请求目的mac地址

Tcp的Flag的介绍:

    S (SYN), F (FIN), P (PUSH), R (RST), U (URG), W (ECN CWR), E (ECN-Echo) or `.' (ACK), or `none' ,有的是组合,S.就是[syn+ack],R.就是[reset+ack],p.就是[push+ack]

Vim

一、同一个文件的复制(冒号模式下)
1.:1,100y复制第一行到第100行的内容
2.:200定位到第200行
3. p将复制的内容贴至201行
或者
输入:进入命令模式,输入1,2 co 2即从1-2行的数据复制到从3行开始的位置
二、vi编辑器从一个文件复制到另一个文件
1.先打开这两个文件:vi 1 2
2.set number 显示行号
3.:100,200y(复制100行~200行的内容)
4.:n 切换到第二个文件(冒号输入n按 回车)
5.p(粘贴即可),将光标移到需要复制的地方,按下P按钮即可。或者:600(切换到第600行),再按下p进行粘贴。

:set ff?  #查看当前文件是dos格式还是unix格式
:set ff=unix  # 强制切换为unix格式

:echo expand('%:p') ##显示文件的绝对路径和文件名
:echo expand('%:t') ##显示文件名字
% 代表当前文件
:t 代表只获取文件名(不包括路径)

vi filename    //打开或新建文件,并将光标置于第一行首;filename可以是相对路径,也可以是绝对路径
vi +n filename :打开文件,并将光标置于第n行首
vi + filename :打开文件,并将光标置于最后一行首
vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename

按 w:光标跳到下个word的开头。[常用]
按 e:光标跳到下个word的字尾。
按 b:光标回到上个word的开头。
按 $:移到光标所在行的行尾。[常用]
按 ^:移到该行第一个非空白的字符。
按 0:移到该行的开头位置。[常用]/word】 在文件中查找内容为word的字符串(向下查找)
【?word】 在文件中查找内容为word的字符串(向上查找)
【[n]】 表示重复查找动作,即查找下一个
【[N]】 反向查找下一个

x:每按一次删除光标所在位置的后面一个字符。[超常用]
#x:例如,6x 表删除光标所在位置的后面6个字符。[常用]
X:大字的X,每按一次删除光标所在位置的前面一个字符。
#X:例如,20X 表删除光标所在位置的前面20个字符。
dd:删除光标所在行。[超常用]
#dd:例如,6dd表删除从光标所在的该行往下数6行之文字。[常用]


:s/str1/str2/     //用字符串 str2 替换行中首次出现的字符串 str1
:s/str1/str2/g     //用字符串 str2 替换行中所有出现的字符串 str1
:.,$ s/str1/str2/g     //用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1
:1,$ s/str1/str2/g     //用字符串 str2 替换正文中所有出现的字符串 str1
:n,$s/tomcatlog/javalog/     //替换第 n 行开始到最后一行中每一行的第一个 tomcatlog 为 javalog 
:n,$s/tomcatlog/javalog/g    //替换第 n 行开始到最后一行中每一行所有 tomcatlog 为 javalog 

echo

  1. 把结果信息写到标准错误 stderr中:echo “errormsg” >&2
  2. 把结果信息写到标准输出 stdout中: echo “infomsg” >&1
单引号:引号里面的内容会原封不动的显示出来(很简单,不做解释)
双引号:里面的特殊符号会被解析,变量也会被替换(\ 符号、空格会被解析): hostname=`hostname -f`;echo "$hosname"
反引号:用于显示命令执行结果: `cmd`
[root@k8s-master python3-test]# echo -n "" >test.txt
[root@k8s-master python3-test]# cat test.txt
[root@k8s-master python3-test]# 
#这样清空文件,不会有空行,否则会有如下:
[root@k8s-master python3-test]# echo > test.txt 
[root@k8s-master python3-test]# cat test.txt

[root@k8s-master python3-test]# 
##echo -n 不换行输出
$ echo -n "123";echo 456
123456
$ echo  "123";echo 456 ####echo 默认会自动换行
123
456

echo -e是处理特殊字符串的,如果不加-e,当遇到\n等特殊字符时,会当初一般字符处理

$ echo -e '\n123'

123
$ echo -e '456\n123'
456
123
$ echo '456\n123'   ##当初一般字符进行了处理
456\n123

Find

find基础用法

$ find ../ -type f -name "*.py" -exec printf "Text file:%s\n" {} \; ##格式化输出
Text file:../Common/11.py


find . -type f -name  "*.swp" -delete #选项-delete可以用来删除find查找的匹配文件
find /home/CS -path "*/jisuanji/*" -print ##打印/jisuanji/相关的路径
#选项-path的参数可以使用通配符来匹配文件路径,-print指明打印出匹配的文件名(路径)
如果想匹配多个条件中的一个,可以采用OR条件操作:
find . \( -name "*.txt" -o -name "*.pdf" \) -print
##在当前路径下查找.txt或者.sh结尾的的文件
[root@k8s-master ~]# find ./ -type f -name "*.txt" -o -name "*.sh"     #-o是或的意思
##在当前路径下查找不是.txt的文件
[root@k8s-master ~]# find ./ ! -name ".txt"
##在当前路径下查找ansbile的目录
[root@k8s-master ~]# find ./ -type d -name "ansible"  
##在当前路径下查找ansbile_ping.yml的文件
[root@k8s-master ~]# find ./ -type f -name "ansible_ping.yml" 
find --maxdepth+层数  按最大层数查找
     --mindepth+层数  按最小层数查找
[root@k8s-master ~]# find ./ -maxdepth 2 -type f -name "ansible_ping.yml"
./ansible/ansible_ping.yml
[root@k8s-master ~]# find ./ -maxdepth 3 -type f -name "ansible_ping.yml"
./ansible/ansible_ping.yml
[root@k8s-master ~]# find ./ -maxdepth 1 -type f -name "ansible_ping.yml"
[root@k8s-master ~]# 
##找出所有文件是大于10M,小于1G的
[root@k8s-master ~]# find ./ -type f -size +10M -size -1G 
##找出所有文件权限是644的
[root@k8s-master ~]# find ./ -type f -perm 644 

访问时间atime: 最后一次查看文件内容的时间
修改时间mtime: 最后一次修改文件内容的时间
更改时间戳ctime: 最后一次更改元数据的时间(权限、位置、文件类型)

[root@k8s-master ~]# stat ansible/ansible_ping.yml 
  File: ‘ansible/ansible_ping.yml’
  Size: 552       	Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d	Inode: 535534      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2022-05-09 11:47:04.031550156 +0800
Modify: 2022-05-07 12:02:42.260603606 +0800
Change: 2022-05-07 12:02:42.264603607 +0800

find与exec结合

exec与xargs功能一样,只不过用法不一样;意思就是找到文件后,需要做啥
{} \ 这两个字符间要有空格
{} 是用于查找结果后的占位符
-exec 后面必须是分号(;)结尾,\是用于转义,转义后是分号

##查看当前目录中所有yml文件中是不是包含ping字段
####这种打印的都是内容,不会将文件路径列出来
[root@k8s-master ~]# find ./ -name "*.yml" -exec grep -in "ping" {} \;
[root@k8s-master ~]# find ./ -name "*.yml" -exec grep -r "ping" {} \;
##把当前路径下所有yml文件列出来
[root@k8s-master ~]# find ./ -name "*.yml" -exec ls {} \;
[root@k8s-master ~]# find ./ -name "*.yml" 
##查看当前目录中所有yml文件中是不是包含ping字段
####这种打印的都是内容和文件路径
[root@k8s-master ~]# find ./ -name "*.yml" |xargs grep -in "ping"

[root@k8s-master ~]# find ./ -path "*PlayBook*/*.yml" ##匹配目录中包含PlayBook的目录的yml文件
[root@k8s-master ~]#find ./ -name "*.txt"  ## 显示相对路径
[root@k8s-master ~]#find $PWD -name "*.txt"    ## 输出绝对路径
[root@k8s-master ~]#find ./ -name "*.txt" -exec readlink -f {} \;  ## 输出绝对路径
[root@k8s-master ~]#find ./ -name "*.txt" | xargs readlink -f ## 输出绝对路径
[root@k8s-master ~]#find ./ -name "*.txt" -exec realpath {} \;

[root@k8s-master ~]#find $(pwd) -name "*.txt"   ## 输出绝对路径
[root@k8s-master ~]# find -type d -empty  ##查找空目录
[root@k8s-master ~]# find -type f -empty
[root@pc1 test1]# readlink -f a.txt     ## readlink输出原始文件
find . -path ./venv -prune -o -path ./build -prune -o -name "*.py" -print  ##查找当前目录下的 *.py, 排除掉 ./venv 和 ./build 目录;方法一
find . ! -path './build/*' ! -path '*/venv/*' -name "*.py"  ##查找当前目录下的 *.py, 排除掉 ./venv 和 ./build 目录;方法二

# 排除目录下所有以html结尾的文件
find . -type f ! -name "*.html"
# 排除多种文件类型
find . -type f ! -name "*.html" -type  f ! -name "*.php" -type  f ! -name "*.log"

find . -type f \( -name "*.txt" -o -name "*.py" \) | xargs wc -l | awk '{ total += $1 } END { print total }' ##当前目录及子目录下所有.txt和.py文件的行数总和

注:带-exec参数时必须以;结尾,否则会提示“find: 遗漏“-exec”的参数”。

locate

根据文件名,去查文件的路径

[root@k8s-master ~]# yum -y install mlocate
[root@k8s-master ~]# updatedb
[root@k8s-master ~]# locate ansible_ping.yml
/root/ansible/ansible_ping.yml

Other Command

$ cat /dev/null >111.txt
$ ll 111.txt 清空文件,文件大小为 0
-rw-r–r-- 1 4096 0 Jun 8 09:49 111.txt
$ echo “” >>111.txt 会自动换行
$ ll 111.txt -h 清空文件,文件大小不为 0
-rw-r–r-- 1 4096 1 Jun 8 09:51 111.txt
$ echo -n " " >> 111.txt 不自动换行 (等于输入了一个空格)
sort 和 uniq 一起用,和 sort -u 效果是一样的
使用 sort -u 的话,我们就丢失了文件原有的行的顺序了
直接去除重复的,不排序: awk ’ !x[$0]++’ file3

$ readlink -f 111.txt ##可以查看该文件的绝对路径是啥,带文件名
/root/11/222/333/111.txt

windows转Linux格式

#####将CRLF转化为LF
方式一:
cat -A 111.txt  ##把windows 上的文件复制到linux 上时,文件末尾会出现 ^M
find . -type f -exec dos2unix {} \; ##将文件夹下的所有文件进行修改
find . -type f -name "*.yml" -exec dos2unix {} \; ##将文件夹下的所有文件yml进行修改
dos2unix 文件名8 ##对单个文件进行转换命令

方式二:
vim 文件,执行set ff查看,设置为unix:set ff=unix



检查端口是否通

方法一:
ssh -v -p port root@ip
#出现Connection refused表示端口关闭;
#出现Connection established表示端口开启;
#出现No route to host表示IP错误

方法二:
telnet ip port
#出现Connection refused表示端口关闭;
#出现Connected to ip表示端口开启;
#出现No route to host表示IP错误或者iptables限制

方法三:
curl -v ip:port
#出现Connection refused表示端口关闭;
#出现Connected to ip(ip) port(#0)表示端口开启;
#出现No route to host表示IP错误或者iptables限制

端口打开的情况

$ telnet 101.199.97.65 62715
Trying 101.199.97.65...
Connected to 101.199.97.65.
Escape character is '^]'.  ###要想退出按ctrl+],此时再运行quit才会真正退出

或者指定退出符号
telnet -e p 101.199.97.65 62715   #使用p字符指定退出


echo "" | telnet 101.199.97.65 62715 ##输出结果后立即退出

创建临时文件

dd if=/dev/zero of=test.log bs=1M count=500  ##在当前目录下创建一个大小为500M的文件test.log

dd if=/dev/zero of=test.zip bs=1G count=3   ##创建一个大小为3G的文件
命令参数说明:
if:指定输入文件名或者设备名,如果省略,则表示从标准输入读取
/dev/zero:一个特殊的字符设备文件,当我们使用或读取它的时候,它会提供无限连续不断的空数据流
of:指定输出文件名或者设备名,如果省略,则表示写到标准输出
bs:块大小,单位可以是K、M、G
count:块数量 bs * count = 文件大小

进程

defunct进程(僵尸进程):一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程
ps -A -ostat,ppid,pid,cmd | grep -e ‘[Zz]’
ps -A | grep defunct
模拟僵尸进程

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, sys, time
#产生子进程
pid = os.fork()
if pid == 0:
    #子进程退出
    sys.exit(0)
#父进程休息300秒
time.sleep(300)

iptables

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值