学习笔记|Linux

本文最后更新于:4 个月前

零、背景

1.Linux 和 windows 不同

  1. linux严格区分大小写

  2. 所有内容以文件形式保存,包括硬件

  3. 没有任何扩展名区分文件类型

    压缩包: .gz .bz2 .tar.bz2 .tg2

    二进制软件包: .rpm

    网页文件: .html .php

    脚本文件: .sh

    配置文件: .conf

  4. Window 下程序不能直接在linux中安装和运行

2.字符界面的优势

  1. 占用资源少
  2. 减少出错、被攻击的可能性

一、命令基本格式

1.登陆

[root@localhost~]#
  • root: 用户名

  • localhost: 主机名

  • ~: 表示当前位置在 ~

  • #: 表示当前用户是超级用户,普通用户是 $

2.格式

命令 【选项】【参数】

注意:

  1. 个别命令使用不遵循格式
  2. 当有多个选项时,可以写在一起
  3. 简化选项与完整选项(-a 等于 -all)

3.命令类型

  • 文件处理命令
  • 文件搜索命令
  • 帮助命令
  • 压缩和解压缩命令
  • 关机和重启命令
  • 其他常用命令

二、目录处理命令

1.常用目录名

系统目录结构备注
/根目录
/bin命令保存目录,Binary的缩写,存放普通用户可读取的命令,sbin存放超级用户能访问的命令
/boot启动目录,保存着启动相关的文件
/dev设备文件保存目录,Device(设备)的缩写,存放的是硬件、特殊命令
/etc配置文件保存目录,存放所有的系统管理所需要的配置文件和子目录
/home保存所有的用户主目录,一个用户一个目录。
/lib动态链接共享库保存目录,数据库
/usr系统软件资源目录,u是user,s是software,r是resource。目录中含有 bin,sbin
/mnt系统挂载目录。需要用户手动挂载。
/media用户临时挂载目录。系统可以识别设备并自动挂载。
/sys内存的挂载点,不能操作
/proc虚拟目录,是系统内存的映射。该目录的内容不在硬盘上,而在内存中。我们可以访问该目录来获取系统信息。
/tmp临时目录
/var系统相关文档内容

2.文件的颜色

白色普通文件
蓝色目录
绿色可执行文件
红色压缩文件
青色链接文件
黄色设备文件(block块、char字符、fifo管道)
灰色其他文件

3.查询目录中的内容 ls

存放在 /bin/ls。

ls【选项】【文件或目录】

ls -l /dev/
选项备注
-a显示所有文件、包括隐藏文件
-l显示详细信息【 ls -l 简写成 ll 】
-d查看目录属性
-h人性化显示文件大小
-i显示文件索引节点号(inode)
drwxr-xr-x   5 root1  root   160  9 19 17:10 java
  • drwxr-xr-xd rwx r-x r-x
    • d:表类型,-是文件,d是目录,l是软连接文件,另外有:块设备文件(b)、字符设备文件(c)、套接字文件(s)、管道文件(p)
    • rwx:前三个是 uers所有者
    • r-x:中间三个是 group所属组
    • r-x:后面三个是 other其他人
      • r是read,w是write,x是execute执行。
  • 5:引用计数,默认是 1,创建一个硬链接,加 1。
  • root1:所有者
  • root:所属组
  • 160:字节大小
  • 9 19 17:10 :修改时间为9月18日 17:10
  • java:文件名

4.建立目录 mkdir

mkdir【目录名】:make directories(目录)

# 创建一个叫 test 的目录
mkdir test

# 递归创建多层目录
mkdir -p test1/test2/test3

# 如果重名会报错。

5.切换所在目录 cd

cd【目录名】

简化操作备注
cd ~进入home目录
cd进入home目录
cd -进入上次目录
cd ..进入上级目录
.表示当前目录

相对路径:从当前目录开始

绝对路径:从根目录开始

6.查询目录位置 pwd

pwd:print working directory

7.删除空目录 rmdir

rmdir:remove empty directories

注:只能删除空目录,非空目录不能删除

8.删除文件或目录 rm

rm:remove

# 删除目录和目录中的文件
rm -r /temp

# 删除目录之前询问(加 -i)
rm -ri /temp

# 强制删除
rm -rf

# 删除temp目录下所有内容【加*】
rm -rf /temp/*

# 删除temp【不加*】
rm -rf /temp/

9.显示目录结构 tree

查看当前目录的一级目录结构:

tree . -L 1

三、文件处理命令

1.复制命令 cp

cp【选项】【原文件名或目录名】【目标目录】:copy

选项备注
-r递归复制,复制目录,不加 -r 复制文件
-p连带文件属性复制
-d若源文件是链接文件,则复制链接属性
-a相当于 -pdr 【所有都一样,包括时间】
# 复制aaa.cfg并改名成bbb.cfg
cp aaa.cfg /tmp/bbb.cfg

# 仅复制
cp aaa.cfg /tmp/

注意:拷贝文件时,

  • 如果存在 2.txt,则覆盖 2.txt 的内容;
  • 如果不存在 2.txt,拷贝并命名为 2.txt。
cp 1.txt 2.txt

注意:拷贝目录时,

  • 如果存在 tmp,则将 my_dir 拷贝一份,并放入 tmp 文件夹中;
  • 如果不存在 tmp,则将 my_dir 拷贝一份,并命名为 tmp。
cp -r my_dir tmp

2.剪切命令 mv

mv【源文件或目录】【目标目录】

# 将japan/剪切到/tmp目录下
mv japan/ /tmp/

# 将japan/剪切到/tmp/目录下,并改名为japan01
mv japan/ /tmp/japan01

# 改名
mv aaa.cfg bbb.cfg

3.创建文件 touch

  • 如果文件存在,修改文件修改时间。(不报错)
  • 如果文件不存在,创建文件。
touch 1.txt

4.查看文件 cat

当文件过长,在终端上无法全部显示。(因为终端上不能往上翻。)

cat small_file

5.查看文件 more

  • 回车键:往下翻一行
  • 空格键:往下翻一页
  • q键:退出

缺点:翻完不能返回上面。

more big_file

6.查看文件 less

  • 回车键(ctrl + n)(↓):往下翻一行
  • ctrl + p (↑):往上翻一行
  • 空格键(ctrl + f):往下翻一页
  • ctrl + b:往上翻一页
  • q键:退出
less big_file

7.文件前几行 head

# 默认显示文件前十行的内容
head big_file

# 加参数,自定义显示行数
head -5 big_file

8.文件后几行 tail

# 默认显示文件后十行的内容
tail big_file

# 加参数,自定义显示行数
tail -5 big_file

9.统计命令 wc

  • 统计输入的行数、单词数、字符数。
wc
# 输入待统计的文本,并按 ctrl + d 统计
  • 统计文件的行数、单词数、字符数。
wc hello.cc

10.查看二进制文件 od

-t:指定数据的显示格式。

参数含义
cASCII字符
d有符号的十进制数
f浮点数
o八进制数
u无符号十进制数
x十六进制
od -tx app

11.查看目录大小 du

# 查看当前目录下的所有目录的大小
du

# 查看目录 my_dir 的大小
du my_dir -h

-h:human-readable,print sizes in human readable format (e.g., 1K 234M 2G)

12.查看磁盘使用情况 df

df -h

13.修改文件权限 chmod

chmod:change file modes or Access Control Lists。

  • chmod 【who】【+|-|=】【mode】 【文件名】
# 给所有人增加执行权限
chmod a+x app
chmod +x app.  # 不指定who,就是所有人

# 给其他人减少读权限
chmod o-r my_txt

# 覆盖所有人的权限,为只读
chmod a=r my_txt
who含义
a所有人
u文件所有者
g文件所属组
o其他人
  • chmod 【+|-|空】【数字】 【文件名】
# 覆盖式更改所有人的权限
chmod 765 my_txt
# 7-- rwx --文件所有者
# 6-- rw  --文件所属组
# 5-- rx  --其他人

# 给 其他人 减少执行权限
chmod -001 my_txt

# 给 所有人 减少执行权限
chmod -1 my_txt
数字权限
4r
2w
1x

PS:目录必须有执行权限,不然打不开。

14.修改文件所有者和所属组 chown、chgrp

chown: - change file owner and group

chgrp: - change group ownership

文件所有者不一定在文件所属组中。

  • chown 【新的所有者】 【文件名】
# 将 my_txt 的文件所有者更改为 new_user
chown new_user my_txt
  • chown 【新的所有者】:【新的所属组】 【文件名】
# 将 my_txt 的文件所有者更改为 new_user,文件所属组更改为 new_group
chown new_user:new_group my_txt
  • chgrp 【新的所属组】 【文件名】
chgrp new_group my_txt

四、链接命令

ln【选项】【源文件】【目标文件】

命令备注
ln创建硬链接
ln -s创建软链接
  • 硬链接特点

相当于备份功能,源文件和硬连接文件都指向内存上的同一个储存块。

当源文件被删,硬链接文件依然可以访问内存上的储存块。

当源文件和所有硬链接文件都被删除,这块内存才会被释放。

  1. 拥有相同的 i节点和储存block块,可以看成是同一个文件。
  2. 只能通过 i节点识别。
  3. 不能跨分区。
  4. 不能针对目录使用。
  • 软链接特点
  1. 类似windows快捷方式,源文件删除,软链接文件无法访问。
  2. 软链接拥有自己的 i节点和block块,数据块存的是原文件的 i节点。
  3. 软链接权限由原链接控制它。
  4. 创建软连接时,要使用源文件的绝对路径,否则移动软连接,将找不到文件。

PS:软链接文件的大小为 源文件的路径 的整个字符串的字节大小。

ln -s my_link /home/my
# 则 my_link 的文件大小为 8

五、搜索命令

1.文件搜索命令 locate

locate 【文件名】

在后台数据库中按文件名搜索,搜索速度更快(数据库不实时更新,一天更新一次)。

/var/lib/mlocate/mlocate.db 是 locate 命令搜索的数据库。(也可能是 slocate.db,不同版本不同。)

命令需要安装并更新数据库 mlocate.db:

yum install mlocate  # 注意是 mlocate
updatedb

使用:

# 查找 hello.cc 文件
lacate hello.cc
updatadb    # 强制更新命令。比如新创建的文件需要更新后才能搜索到。

配置文件 \etc\update.conf (解决问题:为什么不搜索 /tmp 目录?):

# 是否开启搜索限制

PRUNE_BIND_MOUNTS = "yes"

# 搜索时,不搜索文件系统
PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fuse.sshfs fusectl gfs gfs2 gpfs hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs fuse.glusterfs ceph fuse.ceph"

# 搜索时,不搜素文件类型
PRUNENAMES = ".git .hg .svn"

# 搜索时,不搜索的路径
PRUNEPATHS = "/afs /media /mnt /net /sfs /tmp /udev /var/cache/ccache /var/lib/yum/yumdb /var/spool/cups /var/spool/squid /var/tmp /var/lib/ceph"

2.命令搜索命令 whereis、which

which 可以查找别名,whereis 不可以。

(1)whereis 【命令名】

搜素命令所在路径、及帮助文档所在的位置。

# 查找 nginx 命令的路径。
whereis nginx
选项备注
-b只查找可执行命令
-m只查找帮助文件

(2)which 【命令名】

查找命令所在路径、及别名。

# 查找 ls 命令,会显示别名。
[root@localhost /]# which ls
alias ls='ls --color=auto'
	/usr/bin/ls

(3)$PATH

whereiswhich 命令在环境变量 $PATH 中搜索。

# 查看当前的环境变量,由冒号分割。
[root@localhost etc]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

3.文件搜索命令 find

避免大范围搜索,会非常耗费系统资源。若负载过大,容易宕机。

(1)find 【搜索范围】【搜索条件】

# 在 / 目录下,寻找名称为 install.log 的文件。
find / -name "install.log"

# 在 / 目录下,寻找名称为 install.lo? 的文件。? 代表该字符不确定,可能是 g,可能是 k。
find / -name "install.log[gk]"

# 在 / 目录下,寻找所有者为 root 的文件
find / -user root
通配符备注
*匹配任意内容
?匹配任意一个字符
[]匹配任意一个中括号内的字符
搜索条件备注
-name名称
-iname名称(不区分大小写)
-user所有者
-nouser没有所有者 —> 垃圾文件

(2)find 【搜索范围】【时间】

# 查找 10天 前修改的日志文件。
find /var/log/ -mtime +10
时间选项备注
-1010内的修改文件
1010天当天修改文件
+1010天前修改文件
搜索条件备注
-atime文件访问时间
-ctime改变文件属性的时间
-mtime修改文件内容的时间

(3)find 【搜索范围】【大小】

# 查找当前目录下,文件大小 小于 25KB 的文件。
find . -size -25k
大小(不可以是小数)(小k 和 大M)备注
-2k< 2k 的文件
2k== 2k 的文件
+2k> 2k 的文件
-20M< 20M 的文件

(4)find 【搜索范围】【 i 节点】

# 查找 / 目录下 i 节点是 262422 的文件。
find / -inum 262422

(5)find【搜索范围】【多个条件】

# 查找 /etc 目录下,大于 20k 小于 50k 的文件。
find /etc -size +20k -a -size -50k
逻辑备注
-a与and
-o或or

(6)find 【搜索范围】【条件】-exec 【命令2】{} ;

把搜索到的结果,交给 命令2 执行。

⚠️注意:{} 和 \ 之间有空格;结尾有分号。

# 查找 <10k 的文件,并用 ls -lah 命令显示详细信息。 
find . -size -10k -exec ls -lah {} \;

(7)find 【搜索范围】 【文件类型】

# 搜索当前文件下的普通文件
find . -type f
搜索条件含义
-type类型
字母含义
f文件
d目录
l软连接文件
b块设备文件
c字符设备文件
s套接字文件
p管道文件

4.字符串搜索命令 grep

在文件中匹配符合条件的字符串。

grep 【选项】字符串 文件名

# 查找 spin_lock.cc 文件中的包含 字符串“#include” 的行。
grep "#include" spin_lock.cc 

# 结果如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
选项备注
-i忽略大小写
-v排除指定字符

(1)位置限定匹配

  • 匹配行开头。
yum list installed | grep ^a
grep ^a 1.txt
  • 匹配行结尾。
yum list installed | grep a$
  • 匹配单词开头。
yum list installed | grep "\<maria"  # 匹配以 db 开头的单词所在的行,例如mariadb,注意要有双引号
  • 匹配单词结尾。
yum list installed | grep "db\>"     # 匹配以 db 结尾的单词所在的行,例如mariadb,注意要有双引号
  • 匹配单词。
yum list installed | grep "mariadb"  # 只能匹配完整的单词 mariadb,例如:可以匹配 mariadb-server,不能匹配 mariadbbb-server

(2)字符匹配

  • . 匹配任意一个字符。
yum list installed | grep .um  # um 前面必须有一个字符。
  • [mn] 匹配 [] 里的任意一个字符。
➜  ~ yum list installed | grep "[mn]aria"   # 注意双引号
mariadb.x86_64                        1:5.5.65-1.el7                   @base    
mariadb-libs.x86_64                   1:5.5.65-1.el7                   @anaconda
mariadb-server.x86_64                 1:5.5.65-1.el7                   @base
  • [^yd] 匹配除 [] 中字符的其他任一字符。
yum list installed | grep "[^yd]um"     # 注意双引号
numactl-libs.x86_64                   2.0.12-5.el7                     @anaconda
perl-Data-Dumper.x86_64               2.145-3.el7                      @base
  • \w 【小写w】匹配文字和数字字符,也就是 [A-Za-z0-9]。
grep "\w" 1.txt  # 必须有双引号
  • \W 【大写W】匹配非文字和数字字符,”\w” 的反置形式。
grep "\W" 1.txt  # 必须有双引号

(3)次数限定匹配

  • * *前面的字符可以重复 0 次或者 多次。
grep "a*b"   # 表示 a 可以出现多次或者0次
  • x\{m\} 匹配 字符 x重复 m 次 的行。
➜  ~ yum list installed | grep "0\{3\}"   # 查找重复 3 次 0 的行。
iwl1000-firmware.noarch  
iwl2000-firmware.noarch   
iwl5000-firmware.noarch    
iwl6000-firmware.noarch  
iwl6000g2a-firmware.noarch   
iwl6000g2b-firmware.noarch
  • x\{m,\} 匹配 字符 x 重复 m 次或者 m 次*以上*** 的行。[m, +∞)
grep "0\{2,\}" 1.txt   # 查找 0 重复 2 次以上的行。
  • x\{m, n\} 匹配 字符 x 重复 m 次或者 m 次以上,不超过 n 次 的行。 [m, n]
grep "0\{2,3\}" 1.txt  # 查找 重复次数在 [2, 3] 之间的行。

六、帮助命令

1.man

manual

获取指令命令的帮助

man ls
  • /-d 定位到选项为 -d 的位置。
  • n 向下翻。
  • man 的级别 1~9。
级别内容
1查看命令的帮助
2查看别内核调用的函数的帮助
3查看函数和函数库的帮助
4查看特殊文件的帮助
5查看配置文件的帮助
6查看游戏的帮助
7查看其他杂项的帮助
8查看系统管理员可用命令的帮助
9查看内核相关文件的帮助

2.help

  • 【外部命令】–help
ls --help
  • help 【内部命令】
help cd

PS:如何判断是否是 shell 的内部命令?

  • tpye 查看命令是内部命令还是外部命令
type ls

3.info

超详细的帮助文档

选项备注
-回车进入子帮助页面(带*号标记)
-u进入上一层页面
-n进入下一个帮助小节
-p进入上一个帮助小节
-q退出

七、压缩与解压缩命令

常用的压缩格式:zip、gz、bz2、tar.gz、tar.bz2。

总结表:

zip

.zip

选项含义
-r压缩目录
-d指定压缩位置

gzip

.gz

选项含义
-r压缩目录下的文件
-c将源文件写入压缩包,保留源文件
-d解压缩

bzip2

.bz2

选项含义
-k压缩之后,保留源文件
-d解压缩

tar

.tar、.tar.gz、.tar.bz2

选项含义
-c(小写)压缩
-C(大写)指定解压缩位置
-v显示过程
-f指定压缩文件
-x解压缩
-t只查看内容,不解压
无选项压缩成 .tar 格式
-z压缩成 .tar.gz 格式
-j压缩成 .tar.bz2 格式

1.zip

(1)zip 【压缩后文件名】【源文件】

zip 001.zip 001

(2)zip -r 【压缩后的文件名】【源目录】

(3)unzip 【压缩文件】

解压缩。

unzip 001.zip

(4)unzip -d 【解压缩的路径】 【压缩文件】

unzip -d /my_dir 001.zip

2.gzip

(1)gzip 【源文件】

压缩为 .gz 格式的文件,源文件消失。

gzip 001.txt

(2)gzip -c 【源文件】> 【压缩文件】

压缩为 .gz 格式的文件,源文件保留。

gzip -c 001.txt > 001.gz

说明:

-c:是将文件打印出来。

-c abc > abc.gz
# 是将打印出来的内容,写入 abc.gz 的压缩包

(3)gzip -r 【源目录】

压缩目录下所有文件,不压缩目录。

(4)gzip -d 【压缩文件】

解压缩文件,不保留源文件。

gzip -d abc.gz

(5)gunzip -d 【压缩文件】

解压缩文件,不保留源文件。

# 加不加 -d 均可解压缩。
gunzip abc.gz
gunzip -d abc.gz

(6)gunzip -r 【含有 .gz压缩文件 的目录】

解压缩 abc 目录中的压缩文件,不保留源文件。

gunzip -r abc

3.bzip2

(1)bzip2 【源文件】

压缩为 .bz2 格式文件,不保留源文件。

bzip2 abc

(2)bzip2 -k 【源文件】

压缩为 .bz2 格式文件,保留源文件。

k:keep

bzip2 -k abc

(3)bzip2 -d 【压缩文件】

解压缩,-k保留源压缩文件。

bzip2 -d abc.bz2
# -k 保留源压缩文件
bzip2 -d -k abc.bz2

(4)bunzip2 【压缩文件】

bunzip2 abc.bz2

4.tar

(1)tar -cvf 【打包后的文件名】 【源文件】

压缩为 .tar 格式的文件,源文件保留。

tar -cvf abc.tar abc
选项含义
-c(小写)创建(打包)
-v显示提示信息
-f指定打包后的文件名

(2)tar -xvf 【压缩文件】-C /tmp/

解压缩,源压缩文件保留。

# 解压 abc.tar 到 /tmp/ 目录下。
tar -xvf abc.tar -C /tmp/
选项含义
-x释放(解打包)
-C(大写)指定解压缩的位置

(3)tar -zcvf 【打包后的文件名】 【源文件】

压缩为 .tar.gz 格式的文件,源文件保留。

tar -zcvf abc.tar.gz abc
选项含义
-z压缩成 .tar.gz 格式

(4)tar -zxvf 【压缩文件】

解压缩,源压缩文件保留。

tar -zxvf abc.tar.gz

(5)tar -jcvf 【打包后的文件名】 【源文件】

压缩为 .tar.bz2 格式的文件,源文件保留。

tar -jcvf abc.tar.bz2 abc
选项含义
-j压缩成 .tar.bz2 格式

(6)tar -jxvf 【压缩文件】

解压缩,源压缩文件保留。

tar -jxvf abc.tar.bz2

(7)tar -jcvf 【打包后的文件名(绝对路径)】【源文件1】【源文件2】

打包 多个文件指定位置的压缩包 中。

tar -jcvf /tmp/abc.tar.bz2 abc_1 abc_2

(8)tar -jtvf 【源压缩文件】

只查看压缩包内容,不解压缩。

tar -jtvf abc.tar.bz2
选项含义
-t只查看压缩包内容,不解压缩。

八、停止、关机、重启

停止机器:停止所有的 CPU 功能,但是仍然保持通电,使系统处于底层维护状态。

关闭机器:关闭电源。

1.shoudown

shoudown 【选项】时间

选项含义
-c取消前一个关机/重启命令
-h关机
-r重启
-H停止机器
-p关闭机器

PS:如果使用了时间参数,系统关机前 5 分钟,会创建 /run/nologin 文件。以确保没有人可以再登录。

# 立即重启
shutdown -r now

# 一分钟后重启
shutdown -r

# 一分钟后关机
shutdown -h

# 05:30 自动重启
shutdown -r 05:30

# 05:30 自动重启, 加 & 表示后台运行
shutdown -r 05:30 &

# 取消前一个关机/重启命令
shutdown -c

# 停止机器
shutdown -H now

2.poweroff

会发送一个 ACPI 信号来通知系统关机(关闭电源)。

ACPI:Advanced Configuration and Power Management Interface

选项含义
–halt停止机器
–reboot关机
# 立即关机,关闭电源
poweroff

# 停止机器
poweroff --halt

# 重启机器
poweroff --reboot

3.halt

选项含义
-p关机
–reboot重启
# 立即关机
halt -p

# 停止机器
halt

#重启
halt --reboot

4.init0

init进程,它是一个由内核启动的用户级进程。

init 命令在 sbin 目录下。

# 立即关机
init 0

# 重启
init 6

Linux 操作系统自从开始启动至启动完毕需要经历几个不同的阶段,这几个阶段就叫做 runlevel。

runlevel 可以认为是系统状态,进入每个 runlevel 都需要启动或关闭相应的一系列服务(services),这些服务(services)以初始化脚本的方式放置于目录/etc/rc.d/rc?.d/或者/etc/rc?.d下面(?代表runlevel的对应序号)。

选项含义
0关机
1单用户,有且仅有一个 root 用户登陆。
2不完全多用户,不能使用NFS(Net File System)
3完全多用户
4未分配
5图形界面
6重启

5.runlevel

查看用户系统级别。

runlevel
# 1 3

表明最初的运行模式是1,而现在的运行模式是3。

6.logout

退出登陆。

九、设备文件名与挂载

1.磁盘种类

设备文件名含义
sdSCSI Device(SSD硬盘、u盘)
hdHard Disk 硬盘
fdFloppy Disk 软盘

2.设备文件名

  • 硬盘最多四块主分区,从 sda5 开始,只能是逻辑分区。
  • 硬盘名称是a、b、c…进行编号。
硬盘编号名称分区
硬盘1sda主分区:sda1、sda2、sda3、sda4
扩展分区:sda5、sda6、sda7…
硬盘2sdb主分区:sdb1、sdb2、sdb3、sdb4
扩展分区:sdb5、sdb6、sdb7…
硬盘3sdc

3.fdisk

查看所有设备文件

fdisk -l

4.mount

装载命令

(1)查询挂载

mount
# 末尾几行会显示 「设备名」on 「挂载点」type 「文件系统类型」
# /dev/sdb1 on /mnt/udisk type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)

(2)依据配置文件 /etc/fstab 的内容,自动挂载

mount -a

(3)挂载命令格式

mount 【-t 文件系统】【-o 特殊选项】【设备文件名】【挂载点名】

选项含义
-t文件系统:指定挂载类型,ext3、ext4、iso9660
-o特殊选项:指定挂载额外选项
特殊选项含义
exec/noexec是否允许执行
rw/ro读写/只读
remount重新挂载
  • 挂载光盘

(1)建立挂载点

手动挂载时,挂载点应在 /mnt/ 下的某个文件夹(自己创建即可)。

mkdir /mnt/cdrom/

(2)挂载

mount -t iso9660 /dev/cdrom /mnt/cdrom

-t iso9660:文件系统

/dev/cdrom 或者 dev/cdorm:光驱设备名,/dev/cdrom/dev/sr0 的软连接。

/mnt/cdrom:挂载点

(3)简化挂载

mount /dev/sr0 /mnt/cdrom
  • 挂载U盘

(1)查看U盘设备文件名

fdisk -l

(2)建立挂载点

mkdir /mnt/usb

(3)挂载

mount -t vfat /dev/sdb1 /mnt/usb/

-t vfat:Fat32 格式。

/dev/sdb1fdisk -l命令查询到的U盘设备文件名。

/mnt/usb/:U盘挂载点

5.umount

卸载命令

umount 【设备文件名或者挂载点】

先退出光盘/U盘所在位置,再卸载光盘/U盘。

# 卸载光盘(以下两种写法均可)
umount /dev/sr0  # 设备文件
umount /mnt/cdrom  # 挂载点

十、用户管理

1.w、who、whoami

w、who:查看登录用户信息

whoami:查看当前用户

w
# 04:13:04 up  1:04,  1 user,  load average: 0.00, 0.01, 0.04
# USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
# root     pts/0    gateway          03:33    0.00s  0.32s  0.03s w
字段含义
USERs登录的用户名
TTY登陆的终端
FROM从哪个IP地址登陆
LOGIN@登录时间
IDLE用户闲置时间
JCPU和该终端连接的所有进程占用的时间
这个时间不包括过去的后台作业所占用的时间
PCPU当前进程所占用的时间
WHAT当前正在运行的命令
who
# root     tty1         2020-12-21 14:52
# root     pts/0        2020-12-12 03:33 (gateway)

root:用户名

pts/0、tty1:登陆终端

  • tty1tty1 ~ tty6 文字终端;tty7 桌面终端。

  • pts/0:设备终端(黑窗口)

2020-12-12 03:33:登陆时间

(gateway):登陆来源IP地址

2.last

查询当前登录和过去登录的用户信息

last 命令默认读取 /var/log/wtmp 文件数据。

last
# root  pts/0  172.16.103.1  Tue Sep 15 02:42 - 02:47  (00:04)

root:登录名

pts/0:登录终端

172.16.103.1:登录IP

Tue Sep 15 02:42 - 02:47:登录时间 - 退出时间

(00:04):在线时间

3.lastlog

查看所有用户最后一次登录时间。

lastlog 命令默认读取 /var/log/lastlog 文件内容。

lastlog
# 用户名    端口     来自    最后登陆时间
# root     pts/1           六 12月 12 07:37:38 +0800 2020

4.用户增删改

(1)添加用户

useradd new_user_name

# 创建用户 user_name,并加入到用户组 group_name。
useradd -g group_name user_name

(2)查看用户权限

id user_name

(3)更改密码

passwd user_name
passwd  #更改当前登录的用户密码

(4)删除用户

# 保存 user_name 的 home 目录
userdel user_name

# 不保存 user_name 的 home 目录
userdel -r user_name

(5)增加用户组

groupadd group_name

(6)更改用户组

# 将 user_name 的用户组更改为 group_name。
usermod -g group_name user_name

(7)查看所有用户和用户组

# 查看所有用户
lees /etc/password

# 查看所有用户组
less /etc/group

(8)切换用户

su user_name

# 切换用户的同时,将运行环境切换至 user_name 的 home 目录下。
su - user_name

十一、软件安装

1.安装 ifconfig

  • 发现没有 ifconfig 命令
  • yum install ifconfig 安装不上
  • yum search ifconfig 查看 ifconfig 在哪个安装包中。发现是 net-tools.x86_64
  • yum install net-tools.x86_64 发现安装不上
  • yum install net-tools
  • 安装成功!

十二、shell

shell:命令行解释器。

用户 ==> shell ==> 内核(硬件)

1.shell 分类

  • Bourne shell:主文件名为 sh。

  • C shell:主要在 BSD 版的 Unix 系统中使用,因语法与 C 语言相似而得名。

在语法上,Bourne 和 C 互不兼容。

  • Bourne 包括 sh、ksh、bash、psh、zsh。

  • C 家族包括 csh、tcsh。

2.查看 shell 类型

# $ 号是调用变量名。
echo $SHELL

# 查看主机上有多少种 shell。
vi /etc/shells
chsh -l

3.切换 shell 类型

# 改变当前设置为 /bin/zsh,更改完 shell 重启一下。
chsh -s /bin/zsh

十三、脚本

1.echo

echo 【选项】【输出内容】

选项-e:支持反斜线控制的字符转换。

字符转换含义
\a输出警告音
\b退格键
\n换行符
\r回车键
\t水平制表符
\v垂直制表
\0nnn将 nnn 转化为八进制,输出ASCII码
\xnn将 nn 转化为十六进制,输出ASCII码
echo -e "\0141"  # 十进制141等于八进制97,对应ASCII码是 a
# a

echo -e "\x61"   # 十进制61等于十六进制97,对应ASCII码是 a
# a
代码颜色
30m
31m
32m绿
33m
34m
35m粉红
36m
37m
echo -e "\e[1;31m 好好好学习 \e[0m"

2.脚本格式

#!/bin/zsh
# This frist program!
echo -e "\e[1;31m 好好好学习 \e[0m"

#!/bin/zsh:表示 shell 类型,不是格式。

3.执行脚本

(1)赋予执行权限,直接运行。

chmod 755 hello.sh
./hello.sh

(2)通过 shell 调用执行脚本。

zsh hello.sh
# 或者 bash hello.sh

十四、shell 功能

1.alias

命令的临时别名

# 查看所有的别名
alias

# 让 vi 成为 vim 的别名。【vi='vim'不能有空格】
alias vi='vim'
  • 使临时别名永久生效
vim ~/.zshrc
#将 alias vi='vim'  写入环境变量配置文件
source ~/.zshrc   # 使配置文件生效
  • 临时删除别名

真正删除别名需要在 ~/.zshrc 中更改。

unalias 【别名】

unalias vi
  • 命令生效顺序

(1)自己写的脚本

(2)执行别名

(3)shell 的内部命令

(4)$PATH 环境变量中的目录中的命令

2.快捷键

方向键:

ctrl + p:up,方向上键

ctrl + n:next,方向下键

移动光标:

ctrl + f:front,光标向前移动

ctrl + b:back,光标向后移动

ctrl + a:光标移动到行首

ctrl + e:end,光标移动到行尾

删除:

ctrl + h:删除光标前面的字符

ctrl + d:删除光标后面的字符

ctrl + u:从光标处删到行首

其他:

ctrl + r:在历史命令中搜索

ctrl + z:把命令放入后台

crtl + L:清屏

3.history

(1)查看缓存命令

history

(2)清空缓存命令

history -c

(3)增加历史范围

vim /etc/profile
# 更改 HISTSIZE=1000

(4)重复执行上一条命令

!!

(5)重复执行最后一条以该字符串开头的命令

!a   # 重复执行最后一条以该 a 开头的命令

PS:ctrl + r:在历史命令中搜索

4.输出重定向

(1)标准输入输出

设备设备文件名文件描述符类型
键盘/dev/stdin0标准输入
显示器/dev/stdout1标准输出
显示器/dev/sdterr2标准错误输出

(2)输出重定向

  • 正确内容的重定向
# 将 ifconfig 的内容覆盖写入 test.log
ifconfig > test.log

# 将 ifconfig 的内容追加写入 test.log
ifconfig >> test.log
  • 报错信息的重定向

因为标准错误输出的文件描述符为 2。

注意:错误信息重定向 箭头两侧均没有空格。

# 将 iifconfig 的报错信息覆盖写入 err.log
iifconfig 2>err.log

# 将 iifconfig 的报错信息追加写入 err.log
iifconfig 2>>err.log
  • 无论命令正确错误,均写入文件。

注意:错误信息重定向 箭头两侧均没有空格。

# 如果命令正确,将输出内容覆盖写入 test.log
# 如果命令错误,将报错信息覆盖写入 test.log
ifconfig > test.log 2>&1
# 同上
ifconfig &> test.log

# 如果命令正确,将输出内容追加写入 test.log
# 如果命令错误,将报错信息追加写入 test.log
ifconfig > test.log 2>>&1
# 同上
ifconfig &>> test.log

特殊的例子:

/dev/null 该文件是个黑洞,将输出重定向至 /dev/null就是将其扔进黑洞。

ifconfig &> /dev/null
  • 如果命令正确,将 输出内容 写入 test.log,将 写入 err.log。

    如果命令错误,将 写入 test.log,将 报错信息 写入 err.log。

注意:如果是覆盖写入,当内容写入 test.log,err.log中的内容也会被清空。

# 覆盖
ifconfig > test.log 2>err.log

# 追加
ifconfig >> test.log 2>>err.log

5.输入重定向

举个例子,wc 命令,统计字符数,需要在键盘中输入字符进行统计。

我们可以使用输入重定向来替代我们的输入。

wc < test.log

6.多命令执行符

多命令执行符含义
命令1 ; 命令2先执行命令1,再执行命令2。
无论命令1是否报错,命令2均会执行。
命令1 && 命令2命令1正确执行,命令2才会执行。
`命令1

举个例子:

如果 cd .. 执行成功,才会执行 echo yes ,因为 echo yes 执行成功,所以不会执行 echo no

如果 cd .. 执行不成功,则不会执行 echo yes ,因为 echo yes 执行失败,所以会执行 echo no

cd .. && echo yes || echo no

7.管道符

命令1 | 命令2

命令1 的结果,作为命令2 的操作对象。

例子:查看系统中的所有网络链接

netstat -an | grep ESTABLISHED | wc -l

netstat -an:查看网络连接

grep ESTABLISHED:查找网络连接

wc -l:统计行号,一行一人

8.通配符

假设当前目录下有 abc1 abc2 abc3 abca abc_frist 这几个文件。

  • ?

匹配任意一个字符。

ls abc?
# abc1 abc2 abc3 abca

匹配0个或者任意多个任意字符 ==》匹配任意内容。

ls abc*
# abc1 abc2 abc3 abca abc_frist
  • []

匹配中括号中任意一个字符。

ls abc[012]       # 匹配一个字符,或0,或1,或2
# abc1 abc2
  • [ - ]

匹配一个范围中的一个字符。

ls abc[0 - 9]     # 匹配 0 到 9 之前任意一个数字
# abc1 abc2 abc3
  • [^]

逻辑非,表示匹配不是中括号内的一个字符。

ls abc[^0 - 9]     # 匹配不是 0 到 9 之前任意其他字符
# abca
  • ‘ ‘

单引号内容中特殊字符无特殊含义。

echo '$SHELL'
# $SHELL
  • “ “

双引号内容中特殊字符无特殊含义。$ ``` ` 除外。

$ :调用变量名


```sh
# 把 ls 执行的结果,传递给变量 aa
aa=‘ls’
aa=$(ls)

\ :转义字符

十五、进程管理

1.ps

  • ps -a
# 查看系统中的所有用户
ps -a

# 查看系统中的所有用户的详细信息
ps -u

# 查看没有终端的应用程序
ps -aux
ps -x
选项含义
-a查看所有用户
-u查看所以用户的详细信息
-x查看没有终端的应用程序

2.kill

  • Kill -l

查看所有信号

kill -l
# HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL PWR SYS
# 其中第九个是 KILL
  • kill -9 【进程号】、kill -KILL 【进程号】
kill -9 1234
kill -KILL 1234

3.env

查看当前进程的环境变量。

env | grep PATH

4.top

查看进程

top

十六、网络管理

1.ifconfig

查看网卡

ifconfig
# ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
#        inet 172.16.103.2  netmask【子网掩码】 255.255.255.0  broadcast【广播地址】 172.16.103.255
#         inet6 fe80::c9d7:f072:3f5c:4ba2  prefixlen 64  scopeid 0x20<link>
#         ether【MAC地址】 00:0c:29:ae:7e:cf  txqueuelen 1000  (Ethernet)
#         RX packets 17671  bytes 13958154 (13.3 MiB)
#         RX errors 0  dropped 0  overruns 0  frame 0
#         TX packets 7349  bytes 2691742 (2.5 MiB)
#         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
# 
# lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
#         inet 127.0.0.1  netmask 255.0.0.0
#         inet6 ::1  prefixlen 128  scopeid 0x10<host>
#         loop  txqueuelen 1000  (Local Loopback)
#         RX packets 0  bytes 0 (0.0 B)
#         RX errors 0  dropped 0  overruns 0  frame 0
#         TX packets 0  bytes 0 (0.0 B)
#         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

2.ping

测试连通性,使用的 ICMP 协议。

3.nslookup

显示域名对应的 IP。

nslookup aimtao.net
# Server:		172.16.103.1
# Address:	172.16.103.1#53
# 
# Non-authoritative answer:
# Name:	aimtao.net
# Address: 203.107.43.165

十七、FTP服务器

1.服务器端 vsftpd

  • 安装 vsftpd
yum install vsftpd
  • 修改配置文件
# 允许匿名用户登录
anonymous_enable=YES
# 允许本地用户登录
local_enable=YES
# 实名登录用户,拥有写权限
write_enable=YES
# 设置本地掩码为022
local_umask=022
# 匿名用户可以上传数据
anon_upload_enable=YES
# 匿名用户可以创建目录
anon_mkdir_write_enable=YES

dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES

# 打开监听
listen=yes
# 【重要】不支持 ipv6,一定要关闭 ipv6 监听。
#listen_ipv6=YES

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
  • 重启服务
service vsftpd restart
# Redirecting to /bin/systemctl restart vsftpd.service

PS:如果重启服务出现 Job for vsftpd.service failed because the control process exited with error code. See “systemctl status vsftpd.service” and “journalctl -xe” for details。由于 CentOS7 中 vsftp 的配置文件默认将 listen_ipv6=YES 这一行没有注释掉,而我们目前的网络环境还不支持 ipv6,从而导致出现错误无法启动,所以将这一行注释掉即可。

2.客户端 ftp

  • 安装客户端
yum install ftp
  • 实名用户登录

ftp + IP(server)

输入用户名(server)

输入密码

ftp 172.16.103.2
# Connected to 172.16.103.2 (172.16.103.2).
# 220 (vsFTPd 3.0.2)
# Name (172.16.103.2:root): my_name
# 331 Please specify the password.
# Password:
# 230 Login successful.
  • 匿名用户登录

ftp + IP(server)

输入匿名用户名 anonymous

密码:直接回车

【FTP 服务器端需要创建一个匿名用户的目录】

匿名用户默认主目录:/srv/ftp/

# vim etc/vsftpd/vsftpd.conf
# 加入 anon_root,指定家目录。
anon_root=/home/nice/My/

3.ftp操作

注意关注进行 ftp 登录时,客户端机器所在目录。

只能上传和下载文件,目录需要打包。

  • get
# 下载服务端当前目录下的 file_name
get file_name
  • put
# 上传客户端当前目录下的 file_name
put file_name
  • bye、quit、exit

退出

4.客户端lftp

  • 安装客户端
  • 比ftp更智能的地方:显示当前位置
# 服务端的操作
pwd
cd

# 客户端本地的操作local
lpwd
lcd
  • 实名登录
lftp username@172.16.103.2
# 回车输入密码
  • 匿名登录
lftp 172.16.103.2

5.lftp操作

操作含义
put上传文件
mput上传多个文件
get下载文件
mget下载多个文件
mirror下载整个目录及其子目录
mirror -R上传整个目录及其子目录

6.问题

  • ftp: connect: 没有到主机的路由

CentOS7的防火墙禁止了ftp客户端的访问, ftp 服务器关闭防火墙试试。

Centos7以上的发行版都试自带了firewalld防火墙的,firewalld去带了iptables防火墙。其原因是iptables的防火墙策略是交由内核层面的netfilter网络过滤器来处理的,而firewalld则是交由内核层面的nftables包过滤框架来处理。 相较于iptables防火墙而言,firewalld支持动态更新技术并加入了区域(zone)的概念。简单来说,区域就是firewalld预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。

# 关闭防火墙,不要使用 systemctl stop iptables
systemctl stop firewalld
  • 500 OOPS: vsftpd: refusing to run with writable root inside chroot()

    Login failed.

    421 Service not available, remote server has closed connection

从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误。

修改主目录写权限即可;若要上传文件,可上传到主目录下的其他目录。

chmod a-x my_ftp

7.scp

Super copy

  • 本地拷贝到远程服务器
# 将本地的 my_file 文件拷贝给 172.16.103.2 的 /root/ 目录下
scp my_file root@172.16.103.2:/root

# 将本地的 my_file 文件拷贝给 172.16.103.2 的 /root/ 目录下,并命名为 your_file
scp my_file root@172.16.103.2:/root/your_file
  • 远程服务器拷贝到本地
# 将 172.16.103.2 的 /root/your_file 拷贝到本地 /root 目录下。
scp root@172.16.103.2:/root/your_file /root
  • 拷贝目录
scp -r dir root@172.16.103.2:/root
选项含义
-r递归拷贝整个目录

十八、NFS服务器

1.服务端 nfs-utils

  • 安装 nfs-utils
yum install -y nfs-utils
  • 创建共享目录
mkdir /root/nfsroot
  • 修改配置文件
# vim /etc/exports
/root/nfsroot 172.16.*.*(rw,sync)  # 或者只读 (ro, sync)

rw:支持读写

sync:内存中的数据实时更新到磁盘上。

  • 重启服务
service nfs restart

2.客户端

  • 安装 nfs-utils
yum install -y nfs-utils
  • 挂载 nfs服务器
mount 172.16.103.2:/root/nfsroot /mnt

其他

9.Linux 版本

uname  -a

10.查看机器当前时间

date

11.清屏

clear
reset

快捷键:crtl + L


本博客所有文章均个人原创,除特别声明外均采用 CC BY-SA 4.0协议,转载请注明出处!

 目录

致敬李文亮及各路英雄好汉!