Linux常用命令总结

一、文件管理

1.1 打包与解压文件

# tar 打包和压缩
tar -cvf xxx.tar xxx.xxx      #将文件打成一个tar包,不压缩
tar -zcvf xxx.tar.gz xxx      #打包成tar.gz格式压缩包
tar -jcvf xxx.tar.bz2 xxx     #打包成tar.bz2格式压缩包
# tar 解压
tar zxvf xxx.tar.gz         #解压tar.gz格式压缩包
tar jxvf xxx.tar.bz2        #解压tar.bz2格式的压缩包
tar xvf xxx.tar.[gz/bz2]    #两种解压的便捷写法
# 参数
	-z:通过 gzip 指令处理文件
	-j:通过 bzip2 指令处理文件
	-c:创建归档文件,也就是打包
	-x:从归档文件中还原文件,也就是解压
	-v:显示操作过程
	-f:指定压缩文件

# zip 压缩和解压
zip -q -r xxx.zip xxx   # 压缩成zip格式
unzip xxx.zip           # 解压zip格式的压缩包
# 参数
	-q:不显示指令执行过程
	-r:递归处理

1.2 文件/目录创建链接

文件名是一个指向原始文件inode的指针,所以多个指针可以指向同一个原始文件inode。软链接,相当于给文件名创建了一个快捷方式,删除文件名快捷方式则无效;硬链接,相当于创建了一个新的文件名(指针),删除旧文件名不影响新文件名。

ln [OPTION] <目录/文件> <LINK_NAME>
# OPTION
	-s	创建软链接(如果不带 -s 参数,默认创建硬链接)
	-f	强制创建文件或目录的链接,即原来有则删除
	-i	覆盖前先询问
	-v	显示创建链接的过程
# 举例
	#在当前目录下创建../bit.lua文件的软链接,链接名为bit_link
	ln -s ../bit.lua ./bit_link
	#在当前目录下创建./delve-debian/debian/目录的软链接,链接名为DEBIAN
	ln -sf delve-debian/debian/ ./DEBIAN

1.3 查找相关(find、grep、which、whereis、locate)

1.3.1 find 查找文件或者目录

find 是个很强大的搜寻指令,但时间花用的很大,因为 find 是直接搜寻硬盘。如果可以,更推荐使用whereislocate指令代替搜索。

#语法
find <指定目录> <指定条件> <指定动作>
# 在根目录下查找文件名以.txt结尾的文件
find / -name '*.txt'
# 在根目录下查找文件名以abc开头的文件,并显示详情
find / -name 'abc*' -ls
# 在当前目录中搜索过去10分钟更新的普通文件,如果不加-type f参数,则搜索普通文件+特殊文件+目录
find . -type f -mmin -10
find ./delve -mmin -10 -name "*.go" #10分钟内修改的.go文件
	-type  根据文件类型查找:f表示文件,d表示目录,l表示软链接
	-amin  访问时间
	-cmin  文件属性被更改
	-mtime 指定时间(以天为单位)内文件被修改过,modify
	-mmin  指定时间(以分钟为单位)内文件被修改过,modify
#查找当前目录下i节点为400342的文件或目录
find . -inum 400342
	-inum 根据i节点查找
#在当前目录下查找大于100M的文件,-n表示小于,n表示等于;1数据块==512字节==0.5KB,也就是1KB等于2数据块,100MB==102400KB==204800数据块
find . -size +204800
#组合搜索,当前目录查找大于100M且过去十分钟更新的普通文件的文件
find . -size +204800 -a -type f -mmin -10
	- a 表示两个条件同时满足(and)
	- o 表示两个条件满足任意一个即可(or)

#---统计源码的行数---#
#去空行
find . "(" -name "*.c" -or -name "*.h" -or -name "*.lua" ")" -print | xargs grep -v "^$"|wc -l
#含空行
find . "(" -name "*.c" -or -name "*.h" -or -name "*.lua" ")" -print | xargs wc -l
#也可以用cloc工具统计源码行数
cloc <path>

1.3.2 grep 查找匹配 pattern 的内容

#语法
grep [选项] pattern [文件名]

#在当前路径下的所有文件中查找字符串gcc所在位置
grep -rn 'gcc' .
	--color=auto 对匹配到的文本着色显示
	-a :将 binary 文件以 text 文件的方式搜寻数据
	-r 递归读取每个目录下的文件
	-w 完全匹配字符串,相当于 grep "\<string\>"
	-v 反向选择,亦即显示出没有 'gcc' 内容的那一行!
	-i 忽略字符大小写
	-n 显示匹配的行号
	-c 计算找到 'gcc' 的次数
	-o 仅显示匹配到的字符串
	-e 实现多个选项间的逻辑or关系	# grep –e ‘cat’ -e ‘dog’ file
	-q 静默模式,不输出任何信息
	-E 使用ERE,相当于egrep
	-F 相当于fgrep,不支持正则表达式

# 在ls的结果中搜索以a开头的文件或目录
ls | grep '^a'

pattern常用的匹配模式如下:

\       #反义字符,如"\"\""表示匹配""
[ - ]   #匹配一个范围,[0-9a-zA-Z]匹配所有数字和字母
*       #所有字符,长度可为0
+       #前面的字符出现了一次或者多次,"g\+"匹配具有一个或连续多个字符g的单词
^       #匹配行的开始 如:'^grep'匹配所有以grep开头的行
$       #匹配行的结束 如:'grep$'匹配所有以grep结尾的行
.       #匹配一个非换行符的字符,如:'gr.p'匹配gr后接一个任意字符,然后是p
*       #匹配零个或多个先前字符,如:'*grep'匹配所有一个或多个空格后紧跟grep的行
.*      #一起用代表任意字符
[]      #匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep
[^]     #匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行
\(..\)  #标记匹配字符,如'\(love\)',love被标记为1
\<      #到匹配正则表达式的行开始,如:'\<grep'匹配包含以grep开头的单词的行
\>      #到匹配正则表达式的行结束,如'grep\>'匹配包含以grep结尾的单词的行
\w      #匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p
\W      #\w的反置形式,匹配一个或多个非单词字符,如点号句号等
\b      #单词锁定符,如: '\bgrep\b'只匹配grep
x\{m\}  #重复字符x,m次,如:'g\{5\}'匹配包含5个g的行
x\{m,\} #重复字符x,至少m次,如:'g\{5,\}'匹配至少有5个g的行
x\{m,n\}    #重复字符x,至少m次,不多于n次,如:'g\{5,10\}'匹配5--10个g的行

1.3.3 which、whereis、locate搜索文件名

which 命令的作用是,在 PATH 变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用 which 命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。

当我们在执行一个指令的时候,比如ls,系统会依照 PATH 的设定去每个 PATH 定义的目录下搜寻文件名为 ls 的可执行文件,如果在 PATH 定义的目录中含有多个文件名为 ls 的可执行文件,那么先搜寻到的同名指令先被执行!

which -a cc		# -a:将所有在PATH目录中找到的文件均列出,而不止第一个找到的文件
/usr/bin/cc
/bin/cc
which cc
/usr/bin/cc

whereis 在一些特定的目录中寻找文件文件名,主要是针对 /bin /sbin 底下的执行档, 以及 /usr/share/man 底下的 man page 文件,跟几个比较特定的目录来处理,所以速度要快的多。

whereis [-bmsu] 文件或目录名
    -l :可以列出 whereis 会去查询的几个主要目录而已
    -b :只找 binary 格式的文件
    -m :只找在说明文件 manual 路径下的文件
    -s :只找 source 来源文件
    -u :搜寻不在上述三个项目当中的其他特殊文件

whereis which
which: /usr/bin/which /usr/share/man/man1/which.1.gz

locate 寻找的数据是由已建立的数据库 /var/lib/mlocate/ 里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据。而数据库的建立默认是在每天执行一次 (每个 distribution 都不同,CentOS 7.x 是每天更新数据库一次!),所以当你新建立起来的文件, 却还在数据库更新之前搜寻该文件,那么 locate 会告诉你找不到。但是可以手动更新数据库,直接输入updatedb就可以了! updatedb 指令会去读取 /etc/updatedb.conf 这个配置文件的设定,然后再去硬盘里面进行搜寻文件名的动作, 最后就更新整个数据库文件!因为 updatedb 会去搜寻硬盘,所以当你执行updatedb 时,可能会等待数分钟的时间喔!

locate [-ir] keyword
    -i :忽略大小写的差异
    -c :不输出档名,仅计算找到的文件数量
    -l :仅输出几行的意思,例如输出五行则是 -l 5
    -S :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等
    -r :后面可接正规表示法的显示方式

1.4 修改文件权限和属性

用到了三个命令:chgrp更改文件属组;chown更改文件属主,也可以同时更改文件属组;chmod更改文件9个属性。

chgrp [-R] 属组名 文件名
	-R : 进行递归(recursive)的持续变更,以及连同次目录下的所有文件都会变更

chown [–R] 属主名 文件名
chown [-R] 属主名:属组名 文件名
chown bin install.log  #将install.log的拥有者改为bin这个用户

chmod 754 test.sh				#-rwxr-xr--
    user = rwx = 4+2+1 = 7
    group = r-x = 4+1 = 5
    others = r-- = 4
chmod u=rwx, g+r, o-w test.sh

1.5 文本操作(cut、awk、sed、sort)

文本操作可以参考shell中总结的一些命令,互相结合使用:重导向与管线命令

1.5.1 cut 剪贴指定文本

cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b-c-f 标志之一。

cut OPTION... range [FILE]...
# OPTION
	-b:以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志
	-c:以字符为单位进行分割
	-d:自定义分隔符,默认为制表符
	-f:与-d一起使用,指定显示哪个区域
	-n:取消分割多字节字符,仅和 -b 标志一起使用
	--complement:补足被选择的字节、字符或字段,即反选
# range
	N:只选中第N个字节、字符、字段
	N-:从第N个字节、字符、字段到结尾
	N-M:从第N个字节、字符、字段到第M个(包括M在内)字节、字符、字段
	-M:从第1个字节、字符、字段到第M个(包括M在内)字节、字符、字段
# eg
cut -b 2 tmp.txt			# 选择tmp.txt中每一行的第2个字节的内容,成列输出,加上--complement则是反向选择
cut -c 3- tmp.txt			# 每一行的第3个字符到行尾所有的内容
cut -f 1-2 tmp.txt			# 以tab分割每一行的内容,选择第1到第2个被分割的内容
cut -d ' ' -f -2 tmp.txt	# 以空格分割每一行内容,选择行首到第2个被分割的内容

1.5.2 awk 格式化指定文本

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。这个工具使用比较复杂,以下是部分内容总结,更详细的可参考:Linux awk 命令

awk [选项参数] 'script' var=value [FILE]
awk [选项参数] -f scriptfile var=value [FILE]
# 选项参数
    -F fs: 指定文本分隔符 (默认是空格符),fs是一个字符串或者是一个正则表达式
    -f scripfile:从脚本文件中读取awk命令
    -v var=value:赋值一个用户定义变量
# script
    # awk运行处理规则的执行流程
        1. BEGIN{}	: 最开始执行
        2. //		: 正则,先执行正则,再执行循环
        3. {}		: 循环体
        4. END{}	: 最后执行
    # 内置变量
        $n:当前记录的第n个字段,字段间由FS分隔
        $0:完整的输入记录
        NF:当前记录的总字段数
        NR:已经处理过的(所有文件)总记录数目,或者说行号
        FNR: 当前输入文件的记录数目
        length:当前记录的长度
        RS: 记录分隔符
        FS:指定文本内容分隔符(默认是空格)
        OFS: 输出字段分隔符变量(默认是空格)
        IGNORECASE:如果为真,则进行忽略大小写的匹配
        FILENAME: 当前输入文件的名字
    # 运算符
        赋值:= += -= *= /= %= ^= **=
        算数运算:+ - * / % ++ -- 
        关系逻辑:< <= > >= != == ?: && || !
        连接符:空格
        求幂:^ ***
        字段引用:$
        数组成员:in
		正则匹配(包含):~
		正则匹配(不包含)!~
    # awk中的函数
	    print	: 打印
	    printf	: 格式化打印
	    %s		: 字符串
	    %d		: 数字
	    -		: 左对齐
	    +		: 右对齐
	    15		: 至少占用15字符
# eg:
awk -F':' '{printf "%+20s\n", $NF}' /etc/passwd		# :为字段分隔符,输出文件每一行的最后一个字段,右对齐,至少占20个字符
awk 'BEGIN{FS=":"}{print $1,$NF}' /etc/passwd		# :为分隔符,输出文件每一行的第一个和最后一个字段
awk -F: 'BEGIN{OFS=" --- "}{print $1,$NF}' /etc/passwd	# :为分隔符,输出第一个和最后一个字段,字段之间用“ --- ”连接

awk -F: '$NF ~ /bash/{print $0}' /etc/passwd    # 输出最后一个字段包含bash的行
awk -F: '$NF !~ /bash/{print $0}' /etc/passwd   # 输出最后一个字段不包含bash的行

awk -F: '$4 > $3{print $0}' /etc/passwd     # 输出属组ID大于属主ID的行
awk -F: '{if($3>$4){print "$3:",$3}else{print "$4:",$4}}' /etc/passwd   # 条件控制:if(){}else if(){}else{}

awk -F: '{for(i=1;i<=10;i++){print $0, i}}' /etc/passwd     # 对每一行内容多执行循环
awk -F: '{i=1; while(i<10){print $0, i++}}' /etc/passwd     # 同上,且都循环10次

# 将当前目录下所有匹配的.patch文件按要求改名,省得一个个去改。
# 改前:0001-cmd-internal-obj-loong64-recheck-jump-offset-boundar.patch
# 改后:0068-cmd-internal-obj-loong64-recheck-jump-offset-boundar.patch
ls 00*.patch | awk -F'-' '{old=$0;gsub($1,0 0 $1+67); print "mv " old " " $0}' | sh

1.5.3 sed

1.5.4 sort 对文本内容排序

sort命令可以针对文本文件的内容,按行进行排序。在排序的时候以指定分隔符对文本文件进行内容分列,对指定列进行升序或降序排列,并且在排序的同时可以指定是否忽略大小写。

sort [OPTION]... [FILE]...
sort [-bcdfhnru][-t<分隔字符>]-k field1[,field2]][输入文件][[-o<输出文件>]	# 常用写法,不唯一
# OPTION
	-b:忽略每行前面开始的空格字符,空格数量不固定时,该选项几乎是必须要使用的
	-c:选项检查文件是否已经排好序
	-d:按字典序升序排列,空行在前(默认);
	-f:忽略大小写进行排列,例如 A 与 a 视为编码相同
	-h:使用易读性数字(例如:2K、1G)
	-M:以月份的名字来排序,例如 JAN, DEC 等等的排序方法
	-k:按行中的某个字段排序:字段间默认使用空格隔开,默认-k 1
	-n:使用『纯数字』升序进行排序(默认是以文字型态来排序的)
	-o<输出文件>:将排序后的结果存入指定的文件
	-r:降序,以相反的顺序来排序
	-u:意味着是唯一的(unique),相同的数据中,仅出现一行代表
	-t<分割字符>:指定分隔符,默认的分隔符为空白字符和非空白字符之间的空字符
# eg:
sort -bnr -t ":" -k 3 /etc/passwd    # 以:分隔,对第3个字段按照数值降序排列
sort -bf -t ":" /etc/passwd -o 1.txt   # 以:分隔,对第1个字段按照字典顺序、忽略大小写排序,结果输入1.txt文件

二、磁盘管理

2.1 磁盘与分区

# 查看磁盘和磁盘的分区
lsblk	#列出系统上的所有磁盘列表
# 选项与参数:
	-d :仅列出磁盘本身,并不会列出该磁盘的分区数据
	-f :同时列出该磁盘内的文件系统名称
	-i :使用 ASCII 的线段输出,不要使用复杂的编码 (再某些环境下很有用)
	-m :同时输出该装置在 /dev 底下的权限数据 (rwx 的数据)
	-p :列出该装置的完整文件名!而不是仅列出最后的名字而已。
	-t :列出该磁盘装置的详细数据,包括磁盘队列机制、预读写的数据量大小等
# 输出信息
	NAME:就是装置的文件名啰!会省略 /dev 等前导目录!
	MAJ:MIN:其实核心认识的装置都是透过这两个代码来熟悉的!分别是主要:次要装置代码!
	RM:是否为可卸除装置 (removable device),如光盘、USB 磁盘等等
	SIZE:当然就是容量啰!
	RO:是否为只读装置的意思
	TYPE:是磁盘 (disk)、分区槽 (partition) 还是只读存储器 (rom) 等输出
	MOUTPOINT:就是前一章谈到的挂载点!

三、系统管理

3.1 查看系统资源

3.1 .1 设备信息

date        # 查看系统时间
cal         # 查看日历,cal [[[day] month] year]

env         # 查看环境变量资源 
hostname    # 查看计算机名
arch        # 查看架构信息

uname [-asrmpi]
	-a :所有系统相关的信息,包括底下的数据都会被列出来
	-s :系统内核名称
	-r :内核的版本
	-m :本系统的硬件名称,例如 i686 或 x86_64 等
	-p :CPU 的类型,与 -m 类似,只是显示的是 CPU 的类型
	-i :硬件的平台 (ix86)

lspci -tv   # 罗列 PCI 设备 
lsusb -tv   # 显示 USB 设备 
lscpu       # Linux查看cpu相关信息,包括型号、主频、内核信息等
lsblk       # 列出系统上的所有磁盘列表

3.1 .2 Cache信息

$ ls /sys/devices/system/cpu/cpu0/cache/
index0  index1  index2  index3  uevent

$ tree /sys/devices/system/cpu/cpu0/cache/
/sys/devices/system/cpu/cpu0/cache/
├── index0						// L1 cache
│   ├── coherency_line_size		// cache line (cache block) size
│   ├── level					// cache level
│   ├── number_of_sets			// set的数量,set是共享相同index cache的集合
│   ├── shared_cpu_list			// 被哪些 cpu processor 共享,id 列表
│   ├── shared_cpu_map
│   ├── size					// cache size
│   ├── type					// Instruction or Data cache
│   ├── uevent
│   └── ways_of_associativity	// 多少路关联
├── index1
        ...

// 如下公式成立:
number_of_sets * coherency_line_size * ways_of_associativity = size

3.2 添加/切换/删除/修改用户

# 添加新的用户
useradd [选项] 用户名
	-c comment 指定一段注释性描述
	-d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录
	-g 用户组 指定用户所属的用户组
	-G 用户组,用户组 指定用户所属的附加组
	-s Shell文件 指定用户的登录Shell
	-u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号
useradd –d /home/sam -m sam	#创建了一个用户sam,并为sam产生一个主目录 /home/sam

# 切换用户
su [选项] 用户名
	- 当前用户不仅切换为指定用户的身份,同时所用的工作环境也切换为此用户的环境(包括 PATH 变量、MAIL 变量等),使用 - 选项可省略用户名,默认会切换为 root 用户。
	-c 仅切换用户执行一次命令,执行后自动切换回来,该选项后通常会带有要执行的命令
	-p 表示切换为指定用户的身份,但不改变当前的工作环境(不使用切换用户的配置文件)

# 删除用户
userdel [选项] 用户名
	-r 作用是把用户的主目录一起删除
userdel -r sam	#删除sam,把/home/sam目录一并删除

# 修改用户
# 修改用户账号就是根据实际情况更改用户的有关属性,如用户号、主目录、用户组、登录Shell等
usermod [选项] 用户名
usermod -s /bin/ksh -d /home/z –g developer sam	#将用户sam的登录Shell修改为ksh,主目录改为/home/z,用户组改为developer


# 用户密码管理
passwd [选项] 用户名
	-l 锁定口令,即禁用账号
	-u 口令解锁
	-d 使账号无口令
	-f 强迫用户下次登录时修改口令
# 普通用户修改自己的密码
$ passwd 
Old password:****** 
New password:******* 
Re-enter new password:*******
# root用户修改普通用户的密码
$ passwd sam 
New password:******* 
Re-enter new password:*******

3.3 普通用户 sudo 执行

1.切换到root用户下
2.添加sudo文件的写权限,命令是:chmod u+w /etc/sudoers
3.编辑sudoers文件,命令是:vim /etc/sudoers
	找到 root ALL=(ALL) ALL,在下面添加 youuser ALL=(ALL) ALL
	ps:可以在sudoers中添加下面内容
	youuser	ALL=(ALL)	ALL	#允许用户youuser执行sudo命令(需要输入密码)
	%youuser	ALL=(ALL)	ALL	#允许用户组youuser里面的用户执行sudo命令(需要输入密码)
	youuser	ALL=(ALL)	NOPASSWD: ALL	#允许用户youuser执行sudo命令,并且在执行的时候不输入密码
	%youuser	ALL=(ALL)	NOPASSWD: ALL	#允许用户组youuser里面的用户执行sudo命令,并且在执行的时候不输入密码
4.撤销sudoers文件写权限,命令:chmod u-w /etc/sudoers

3.4 使用 apt 管理软件包

apt是一个应用管理工具,类似于电脑上安装的应用中心这类软件。区别就是,应用中心这类软件的软件列表是你进入软件中心的时候,实时从金山服务拉取列表。而apt是本地存了一份软件包信息的列表,比如软件大小、版本号、依赖等,仓库源中的应用更新以后,apt需要手动更新软件包信息。

源配置文件:/etc/apt/sources.list,以下是常用操作总结。

# 搜索查看
apt search <search_term>    #可以找到包含search_term的所有包。
apt show <package_name>     #查看package的内容,可以在安装或删除软件包之前查看有关软件包的更多信息
apt list --upgradable       #查看已安装且可升级的版本
apt list --installed        #查看系统上所有已安装的软件包
apt list --all-versions     #查看可用于系统的所有软件包

# 更新升级
sudo apt update     #更新本地存放的软件包信息的列表,而不会更新包本身
    #命中(Hit):包版本与之前的版本没有变化
    #忽略(Ign):包被忽略。要么是包版本太新,它甚至懒得检查,要么在检索文件时出错,但错误微不足道,因此被忽略
    #获取(Get):有一个新版本可用。它将下载有关版本的信息(而不是包本身)
sudo apt upgrade    #升级所有可以更新的软件包
sudo apt full-upgrade   #升级所有可以更新的软件包,并将旧的软件包删除

sudo apt update && sudo apt upgrade -y      #比较快速的升级常用命令

# 安装升级
sudo apt install <package_name>                             # 安装指定的软件命令
sudo apt install <package_1> <package_2> <package_3>        # 安装多个软件包
    #如果在已安装的软件包上运行 apt install,这将只查看数据列表
    #如果找到更新的版本,它会将已安装的软件包升级到较新的软件包,否则啥也不做
sudo apt install <package_name> --only-upgrade      #只想升级软件包但不想安装它(如果尚未安装)
sudo apt install <package_name>=<version_number>    #安装特定版本的应用程序
    #默认情况下,将为应用程序安装存储库中可用的最新版本。但是如果不想安装最新版本,可以指定版本号
    #这需要知道要安装的确切版本号

# 删除已安装的软件包
sudo apt remove <package_name>      #只是删除包的二进制文件,它留下了残留的配置文件
sudo apt purge <package_name>       #删除与包相关的所有内容,包括配置文件
sudo apt autoremove         #清理系统
    #安装软件时会自动安装一些满足依赖关系的库和包,如果软件包被删除,
    #这些自动安装的库和包虽然没有用,但仍会保留在系统中,可以使用此命令清除掉

3.5 内核日志

3.5.1 系统日志

/var/log目录下有很多的日志文件,每个日志文件的功能参考:https://blog.51cto.com/h2appy/781281

/var/log/messages:是主要的系统日志文件,包含了系统所有的日志信息,如mail、cron、daemon、kern和dmesg等内容也记录在其中。

# 清空日志并重启
cat /dev/null > /var/log/messages
or 
cp /dev/null /var/log/messages
reboot

# 定位问题时,一般通过进程号或者关键字来模糊查找日志内容

3.5.2 printk 函数

printk 函数可以在内核源码中用来记录日志信息,只能在内核源码范围内使用,用法类似于 printf 函数。printk 会将信息记录到 ring butter 中,并调用控制台驱动来将信息输出。通常用法如下:

printk(KERN_INFO "Message: %s\n", arg);

其中 KERN_INFO 是日志级别(级别分为 0~7,数值越大,表示级别越低,对应的消息越不重要):

#define KERN_EMERG      KERN_SOH "0"   /* system is unusable */
#define KERN_ALERT      KERN_SOH "1"   /* action must be taken immediately */
#define KERN_CRIT       KERN_SOH "2"   /* critical conditions */
#define KERN_ERR        KERN_SOH "3"   /* error conditions */
#define KERN_WARNING    KERN_SOH "4"   /* warning conditions */
#define KERN_NOTICE     KERN_SOH "5"   /* normal but significant condition */
#define KERN_INFO       KERN_SOH "6"   /* informational */
#define KERN_DEBUG      KERN_SOH "7"   /* debug-level messages */

/proc/sys/kernel/printk文件中可查看当前环境(控制台和ring butter)的日志级别。如果代码中printk函数的KERN_INFO级别高于环境的日志级别,则printk内容会输出到相应位置,即环境的日志级别越小,输出的日志内容越多。

$ cat /proc/sys/kernel/printk
4        4        1        7

# 四个数值表示 console, default, minimum 和 boot-time-default 的日志级别
	# 控制台日志级别:优先级高于该值的消息将被打印至控制台;
	# 默认的消息日志级别:将用该优先级来打印没有优先级的消息(即 printk 没有指定消息级别);
	# 最低的控制台日志级别:控制台日志级别可被设置的最小值(最高优先级);
	# 默认的控制台日志级别:控制台日志级别的缺省值。

要改变当前输出级别,在 /proc/sys/kernel/printk 中写入所需的级别。通过两种方式:

  • 直接往文件里面写;
  • 通过dmesg -n <级别>命令。
# 要打印所有的消息到控制台上
$ echo 8 > /proc/sys/kernel/printk
$ dmesg -n 8

# 屏蔽掉所有的内核 printk 打印,只需要把第一个数值调到最小值1或者0
echo 1       4       1      7 > /proc/sys/kernel/printk
echo 1 > /proc/sys/kernel/printk # 表示只修改第一个值
$ dmesg -n 1
$ dmesg -n emerg

# dmesg -n支持的日志级别与 KERN_INFO 对应:
  emerg - 0
  alert - 1
   crit - 2
    err - 3
   warn - 4
 notice - 5
   info - 6
  debug - 7

3.5.3 dmesg命令

dmesg 可以查看 kernel 的 ring buffer信息。

用法:
 dmesg [选项]

选项:
 -C, --clear                 清除内核环形缓冲区(ring butter)
 -c, --read-clear            读取并清除所有消息
 -D, --console-off           禁止向终端打印消息
 -E, --console-on            启用向终端打印消息
 -F, --file <文件>           用 文件 代替内核日志缓冲区
 -f, --facility <列表>       将输出限制为定义的设施
 -H, --human                 易读格式输出
 -k, --kernel                显示内核消息
 -L, --color[=<时机>]        彩色显示消息(auto, always 或 never)
                               默认启用颜色
 -l, --level <列表>          限制输出级别
 -n, --console-level <级别>  设置打印到终端的消息级别
 -P, --nopager               不将输出通过管道传递给分页程序
 -p, --force-prefix          force timestamp output on each line of multi-line messages
 -r, --raw                   打印原生消息缓冲区
 -S, --syslog                强制使用 syslog(2) 而非 /dev/kmsg
 -s, --buffer-size <大小>    查询内核环形缓冲区所用的缓冲区大小
 -u, --userspace             显示用户空间消息
 -w, --follow                等待新消息
 -x, --decode                将设施和级别解码为可读的字符串
 -d, --show-delta            显示打印消息之间的时间差
 -e, --reltime               以易读格式显示本地时间和时间差
 -T, --ctime                 显示易读的时间戳(可能不准确!)
 -t, --notime                不显示任何消息的时间戳
     --time-format <格式>    以指定格式显示时间戳:
                               [delta|reltime|ctime|notime|iso]

四、网络管理

五、常用工具

5.1 SSH 使用总结

SSH 的架构是服务器/客户端模式,两端运行的软件是不一样的。OpenSSH 的客户端软件是ssh,服务器软件是sshd。SSH 的全局工作目录是/etc/ssh/,用户工作目录在~/.ssh/,优先级高于全局配置文件。以下是目录中的一些文件:

  • config:客户端配置文件。开始可能没有config文件,我们需要自己新建一个config文件。在使用ssh连接服务器时,经常要输入一些不同的主机地址和密码,使用config文件可以很好的解决这个问题。
    # 在config中添加以下内容后,就可以使用"ssh 23"登录目标主机了
    Host 23	# 23只是个别名
            HostName 10.123.1.23
            Port 10010	# 默认的port可以不用加这个
            user user_name
    
  • id_rsa:用于 SSH 协议版本2 的 RSA 私钥。服务器上经过rsa算法生成的私钥。与公钥是一对的密钥对,用于连接其他服务器用。
  • id_rsa.pub:用于SSH 协议版本2 的 RSA 公钥。服务器上经过rsa算法生成的公钥。与私钥是一对的密钥对,用于连接其他服务器用。将主机A的id_rsa.pub内容copy到B主机的authorized_keys文件中,这样A主机就能不通过密码连接到B主机。
  • known_hosts:ssh会把你每个你访问过计算机的公钥(public key)都记录在该文件中。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击,移除你目标机器的公钥就不会再警告:ssh-keygen -f "~/.ssh/known_hosts" -R "xxx.xxx.xx.11"
  • authorized_keys:实现真正无密码连接,即为授权文件,当把master的公钥添加到authorized_keys文件中后,下次连接直接输入ssh master即可,不需要再次输入密码。(我们本地可以自动生成公钥,将公钥输入到该文件中,本地就可无密码连接到该服务器,分布式集群时也会用到。)
  • sshd_config:服务器的配置文件,只在目录/etc/ssh/下面有。

以下只是简单的常用总结,更详细内容参考SSH教程

1)SSH 客户端

如果机器A要通过SSH控制其他机器,则要安装SSH客户端。连接SSH服务器的常用命令:

sudo apt install openssh-client     # 安装客户端

# 连接服务器
ssh alias	# 可使用别名快捷登录,在config中加入一下配置即可
			# Host alias
			# 		HostName ip_addr
			# 		user name
			# 		Port port,默认22
ssh user@host            # 登录服务器,服务器和客户端处于同一局域网
ssh -l user host         # -l 参数指定远程登录的用户名
ssh -p port user@host    # -p 指定连接服务器端口,ssh默认连接服务器的22端口
ssh user@host command    # 登录成功后,立刻执行command命令

# 传送文件
scp -r SourceDir user@host:/directory               	# 将本机的目录拷贝到远程主机
scp user@host:directory/SourceFile TargetDir        	# 从远程主机复制文件到本地
scp user@host:directory/SourceFile user@host:/directory # 两个远程系统之间的复制
	-r:以递归方式复制目录
	-P:指定服务器端口,默认22
	-p:保留修改时间(modification time)、访问时间(access time)、文件状态(mode)等原始文件的信息
	-v:显示详细的输出

2)SSH 密钥登录

密钥(key)是一个非常大的数字,通过加密算法得到。对称加密只需要一个密钥,非对称加密需要两个密钥成对使用,分为公钥(public key)和私钥(private key)。

私钥是密钥对所有者持有,不可公布,公钥是密钥对持有者公布给他人的。它们的关系是,公钥和私钥是一一对应的,每一个私钥都有且仅有一个对应的公钥,反之亦然。

如果数据使用公钥加密,那么只有使用对应的私钥才能解密,其他密钥都不行;反过来,如果使用私钥加密(这个过程一般称为“签名”),也只有使用对应的公钥解密。

ssh-keygen # 生成密钥对
	-t:指定密钥的加密算法,一般会选择 DSA 算法或 RSA(默认)算法
	-b:指定密钥的二进制位数,这个参数值越大,密钥就越不容易破解。至少应该是1024,更安全一些可以设为2048或者更高
	-C:可以为密钥文件指定新的注释,格式为username@host
	-f:指定生成的私钥文件
	-F:检查某个主机名是否在known_hosts文件里面
	-R:将指定的主机公钥指纹移出known_hosts文件
# eg:
ssh-keygen -t rsa -C "youremail@example.com" # 生成一个RSA 加密算法的密钥对,并且给出了用户名和主机名
ssh-keygen -F xxx.xxx.0.11	# 检查xxx.xxx.0.11是否在known_hosts中

# 手动上传密钥
# 一般来说.ssh文件夹的权限为700,私钥为600,公钥为644。
cat ~/.ssh/id_rsa.pub | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
chmod 644 ~/.ssh/authorized_keys	# 只有文件所有者才能写

# 自动上传密钥
ssh-copy-id -i key_file user@host

3)SSH 服务器

如果机器A打算被其他机器通过SSH链接,则要安装SSH 服务器,以下是常用命令:

sudo apt install openssh-server		# 安装服务器

sudo systemctl start sshd.service   # 启动,也可用sshd命令
sudo systemctl stop sshd.service    # 停止
sudo systemctl restart sshd.service # 重启
sudo systemctl enable sshd.service  # 让 sshd 在计算机下次启动时自动运行
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yelvens

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值