Linux
一、基础
01- 执行环境准备
常见的有三种:
1、云主机 (阿里云腾讯云)
2、无数据的PC(不推荐多系统混跑)
3、虚拟机(推荐) (在windows/mac上安装虚拟机) (可以随时让虚拟机停下来)
02- linux的版本分类
02.1 内核版本
版本号 由 主版本号、次版本号、末版本号 组成
如 5.0.15
(次版本号是奇数为开发版,偶数为稳定版)
https://www.kernel.org
02.2 发行版本
开源的,经常见到的发行版本有5种
02.2.1 RedHat Enterprise Linux
软件经过专业人员测试,有部分要收费
02.2.2 Fedora
通过组建社区来免费提供操作系统,没有专业测试,不稳定
02.2.3 CentOS
基于RedHat Enterprise 源代码编译的, 免费
(结合上面两个操作系统)
02.2.4 Debian
为linux定制了华丽的界面
02.2.5 Ubuntu
为linux定制了华丽的界面
02.3 内核和发行版本的区别:
内核版本安装完成后没有用户界面和软件,是提供硬件抽象层、硬盘以及文件系统控制的核心程序
(linux核心只有内核部分,安装完后,用户界面/软件都没有。内核是系统的心脏,是linux中最基层的代码)
发行版本是在内核的基础上加入了用户界面和各种软件的支持
(linux发行版,就是在内核的基础上,加入用户界面,各种软件的支持。比如CentOS、小红帽等等。在内核的基础上,开发不同应用程序,组成的一个完整的操作系统)
03- 虚拟机安装
推荐 安装VirtualBox虚拟机
,然后在虚拟机中安装linux系统
04- 启动linux
登录的shell(终端)
图形终端
命令行终端
远程终端(SSH、VNC)
二、系统操作
05- 帮助命令
05.1 man 帮助
man + 命令名称
man ls
05.2 help 帮助
1、首先用type来检测命令是内部还是外部命令
type + 命令名称
如果显示 xx is a shell builtin
, 这说明是内部命令
如果显示 xx is aliased to ls --color=auto
, 这说明是外部命令
比如
type cd
cd is a shell builtin
说明 cd 是 内部 命令
type ls
ls is aliased to `ls --color=auto'
说明 ls 是 外部 命令
05.2.1 内部命令
help + 命令名称
help cd
05.2.2 外部命令
命令名称 --help
ls --help
05.3 info 帮助
info 命令名称
info ls
linux基本操作命令是命令行
06- ls命令
06.1 -r
r(reverse) 意为逆向(配合-l使用)
06.2 -rt
ls -l -r `默认是按照文件名逆向显示的`
ls -l -r -t `按照时间逆向显示`
06.3 -R
06.4 -a
ls -R 递归显示文件以及文件夹
ls -a 显示隐藏文件
07- cp
cp -v 显示复制的进度条
cp -p 复制时保留原有时间
cp -a 复制时保留原有所有属性 时间 属组属主 权限
08- 文本查看命令
08.1 cat
08.2 head
08.3 tail
cat 文件名 # 显示文件内容
head -行数 文件名 # head -5 fileA 显示文件前5行内容
tail -行数 文件名 # tail -5 fileA 显示文件最后5行内容
tail -f 文件名 # 当文件内容发生变化,同步更新 比如会实时刷新的日志文件
08.4 wc
wc -l 文件名 # 用来 查看文件行数
09- 打包压缩 和 解压缩
09.1 打包压缩
压缩---> 打包+压缩
打包
是指将一大堆文件或目录变成一个总的文件
压缩
则是将一个大的文件通过一些压缩算法变成一个小文件
09.1.1 先打包,后压缩
1). 打包命令 cvf
将dirA 打包为 dirA.tar
tar -cvf dirA.tar dirA
2). 压缩 分两种 gzip 或 bzip
gzip xxx.tar
gzip dirA.tar
09.1.2 直接打包并压缩
将dirA 压缩为dirA.tgz (tar.gz是tgz的简称)
tar -czvf dirA.tgz dirA/
tar -czvf dirA.tar.gz dirA/
将两个文件夹压缩成一个tgz
tar -czvf dirAB.tgz dirA/ dirB/
bzip打包压缩
tar -cjvf dirA.tbz2 dirA
tar -cjvf dirA.tar.bz2 dirA
09.2 解压缩
解包
tar -xvf dirB.tar -C ./dir # -C 后面的./dir为 执行解的包放的位置
解压缩
tar -xzvf dirB.tgz -C ./B
tar -xjvf dirB.tar.bz2 ./B
10- 文本编译器vi
vim 是一个同vi向上兼容的文本编辑器
10.1 正常模式 normal mode
10.2 插入模式 insert mode
有以下从正常模式到插入模式的 进入方式
i # 光标处的前一个字符进入
I # 光标处的当行某个字符前进入
a # 光标处的下一个字符进入
A # 光标处的当行末尾字符后进入
o # 光标处的下一行进入
O # 光标处的上一行进入
10.3 命令模式 command mode
10.3.1 复制
yy 复制当前行
5yy 复制从当前开始的5行
y$ 复制该行中从当前光标开始到结尾的字符
10.3.2 删除
dd 删除当前行
5dd 删除从当前开始的5行
d$ 删除该行中从当前光标开始到结尾的字符
x 删除光标所在的字符
r 按r后输入要替代的字符
10.3.3 光标移动
g 移动到文本第一行
G 移动到文本最后一行
^ 移动到当前行最开头
$ 移动到当前行最末尾
10.4 可视模式 visual mode
10.4.1 v 字符可视模式
以字符来选择
10.4.2 V 行可视模式
以行来选择
10.4.2 ctrl V 块可视模式
选的是上下对齐的块
适用于删除或增加一整块字符
1. 删除
按ctrl v
键盘上下左右选择要删的字符块
按 d
被选中的字符块就被删掉了
2. 增加
ctrl v
键盘上下移动光标 选择要添加字符块的行
按 I (也就是shift i)(光标指向被选字符块的首行首字符)
输入要增加的字符 (比如 output:)
按两次esc
被选中的字符块的每行前面就会加上刚才新增的字符
11- 用户和用户组管理及密码管理
11.1 用户
新建用户 useradd
删除用户 userdel
修改用户密码 passwd
修改用户属性 usermod
-
usermod -d /new/work/directory username
将username用户的家目录改为 /new/work/directory -
chage
更改用户密码过期信息 -
id username
查看用户的 uid gid group
11.2 用户组
usermod -g 用户组1 用户1
将 用户1 的 组 改为 用户组1
su -
当前用户为root, 但要临时切换到普通用户下测试某功能,测试完成后恢复到原来的root用户
12- su
su 命令用来做 root和普通用户的相互切换
切换用户
切换到root : su 后面 可加 可不加 root
切换到tester : su 后面 必须加 tester
tester是举的一个普通用户的例子
12.1 普通用户 切换到 root
12.1.1 su
$ pwd 查看当前目录为 /home/tester
$ su 输入root用户密码
显示
# pwd # 井号说明已经进入root用户了, 查看当前目录为 /home/tester
用 su 切换到了root 身份,但shell环境仍然是普通用户的shell
工作目录仍然是普通用户的工作目录
12.1.2 su -
$ pwd 查看当前目录为 /home/tester
$ su - 输入密码
显示
# pwd # 井号说明已经进入root用户了, 查看当前目录为 /root
用 su - 切换到了root 身份,shell环境也切换到root的shell
工作目录变成了root的工作目录
12.2 root 切换到 普通用户tester
12.2.1 su
12.2.2 su -
# pwd # 井号说明当前是root用户, 查看当前目录为 /root
# su tester shell环境仍然是root, 查看当前目录为 /root
# su - tester shell环境也切换到普通用户, 查看当前目录为 /home/tester
13- sudo
sudo 将某些只有root用户可以执行的命令授权给普通用户,普通用户就可以在不知道root密码时执行root指定的命令
sudo 是 以自己的身份执行其他用户的指令, 如以普通用户身份执行root用户的指令
比如 只有root用户才能执行关机操作,但如果希望普通用户也可以执行关机,两种方法
方法一: 告诉普通用户root的密码(不安全,不推荐)
方法二: 使用sudo 命令(推荐)
使用sudo 命令的操作方法
- 首先在root下配置哪些命令可以被哪些用户执行
root用户下 执行visudo
添加如下内容 来 赋予 普通用户1 的shutdown 命令
普通用户1 ALL=/sbin/shutdown
- 执行sudo 命令来 做被配置的root下的shutdown 命令
sudo shutdown -h
14- 文件与目录权限的表示方法
0 123 456 789 xxxx xxxxxx xxxxxxxx
类型 <–权限–> 大小 时间 文件名
14.1 类型
- 普通文件
d 目录
b 块特殊文件
c 字符特殊文件
l 符号链接
f 命名管道
s 套接字文件
14.2 权限
-rw-r-xr--. 1 tester tester 11 Jul 6 17:19 test.sh
权限一共占9个位数,所以用了1-9来表示位数
123 456 789
abc def ghi
权限
abc 文件属主的权限(用户的权限)
def 文件属组的权限(用户组的权限)
ghi 其他用户的权限(其他人的权限)
14.2.1 对于文件
r 读 r=4
w 写 w=2
x 执行 r=1
-rw-r-xr–. 1 tester tester 11 Jul 6 17:19 test.sh
即表示
属主权限为rw- ,数字表示为6, 属主有读和写权限
属组权限为r-x ,数字表示为5, 属组有读和执行权限
属主权限为r-- ,数字表示为4, 其他用户有读权限
notes
对于test.sh 文件,表示属主没有执行权限,属组有执行权限
经测试,属主不能执行
14.2.2 对于目录
x 进入目录
rx 显示目录内的文件名
wx 修改目录内的文件名
14.2 chmod
原文件 -rw-r-xr–. 1 tester tester 11 Jul 6 17:19 test.sh
chmod 修改文件、目录 权限
可以对权限进行 增加 减少 或 直接设置
用字符表示方法
u 对属主设置
g 对属组设置
o 对其他设置
> 对属主 增加执行权限 chmod u+x test.sh
> 对属组 减少执行权限 chmod g-x test.sh
> 对其他 设置为执行权限 chmod o=x test.sh
> 对属主 属组 其他 都增加读取权限 chmod a+r test.sh
> 对属主 属组 其他 都增加读写执行权限 chmod a+r+w+x test.sh
> 用数字表示方法 为所有属性 都增加读写执行权限 chmod 777 test.sh
14.3 chown
chown 来 修改属主(owner)、属组(group)
Examples:
chown root /u Change the owner of /u to "root". 将/u的 属主 更改为“root”
chown :staff /u Change the group of /u to "staff". 将/u的 属组 更改为“staff”
chown root:staff /u Likewise, but also change its group to "staff". 将/u的 属主 更改为“root”, 也将其属组更改为“staff”
chown -hR root /u Change the owner of /u and subfiles to "root". 将/u和子文件的 属主更改为“root”
三、Shell
15- 什么是shell
shell是命令解释器,用于解释用户对操作系统的操作
shell把用户执行的命令翻译给内核, 内核根据命令执行的结果,再把结果反馈给用户
CentOS 7 默认使用的shell是bash
16- 执行脚本的不同方式
有一个内容如下的文件 /home_local/tester/testMethods.sh
来检测不同的执行方式的异同
#!/bin/sh
pwd
cd /home
16.1 bash filename.sh
在当前的终端上产生一个bash的子进程, 在子进程里执行脚本,执行完成后回到父进程
使用这种方式执行, 发现虽然没有执行权限, 但也可以执行
脚本中显示cd到了/home目录, 但是执行完成后又回到了原来的目录
执行
bash testMethods.sh
结果
/home_local/tester
/home
查看 pwd
/home_local/tester
16.2 ./filename.sh
产生子进程
,用#! (Sha-Bang)来解释脚本
使用这种方式执行, 没有执行权限时是不能执行的
脚本中显示cd到了/home目录, 但是执行完成后又回到了原来的目录
先给脚本添加可执行的权限
chmod 777 testMethods.sh
执行
./testMethods.sh
结果
/home_local/tester
/home
查看 pwd
/home_local/tester
16.3 source ./filename.sh
在当前的进程中执行
虽然没有执行权限, 但也可以执行
脚本中显示cd到了/home目录, 最终当前目录是/home
会对当前环境造成影响
执行
source ./testMethods.sh
结果
/home_local/tester
/home
查看 pwd
/home
16.4 . filename.sh
在当前的进程中执行
虽然没有执行权限, 但也可以执行
脚本中显示cd到了/home目录, 最终当前目录是/home
会对当前环境造成影响
执行
. testMethods.sh
结果
/home_local/tester
/home
查看 pwd
/home
17- 管道
管道:用于进程通信
管道符 |
将前一个命令执行的结果传递给后面的命令
(将前一个命令的输出作为后一个命令的输入)
同时会为两个命令创建子进程
18- 重定向
将输出到 标准输出中的内容 输出到 文件
18.1 输入重定向
wc -l filename.sh 显示文件行数
wc -l 然后在页面中输入任意几行信息,按ctrl D 停止输入, 结果显示输入信息的行数
wc -l < filename.sh 显示文件行数, 用文件代替用户输入
输入
wc -l testMethods.sh
显示
6 testMethods.sh
输入
wc -l < testMethods.sh
显示
6
18.2 输出重定向
echo "xxx" > filename.sh 覆盖
echo "xxx" >> filename.sh 追加
18.3 错误输出重定向
18.3.1 输入一条不存在的命令 nocmd, 控制行下方显示错误
bash: nocmd: command not found…
18.3.2 将错误输出重定向到 err.txt
nocmd 2> err.txt
查看err.txt
cat err.txt
bash: nocmd: command not found…
18.4 输出(不管错误还是正确)重定向
nocommand &> all.txt
输出到标准输出的输出到文件
19- 变量
19.1 定义
有意义的变量名
不区分类型
19.2 变量赋值
为变量赋值的过程,称为变量替换
1) 变量名=变量值 [等号左右不能出现空格]
value=233
2) 使用let为变量赋值 [通常let用来计算]
let value=10+33
3) 将命令赋值给变量
通常是把命令的值赋给变量
l=ls
4) 将命令结果赋值给变量,使用$() 或``
let c=$(ls -l /etc)
let c=`ls -l /etc`
newed_file=`ls *.html -t | head -1` # 取当前目录下最新的一个 *.html文件
bak_file="${newed_file%.*}_`date +"%y%m%d%H%M"`" # 名字后加时间戳
5) 变量值有空格等特殊字符可以包含在 "" 或 '' 中
string1="hello world"
string2='hello "world"'
19.3 变量的引用
${变量名} 也可以 $变量名
19.4 取变量值
echo ${变量名}
echo $变量名
19.5 变量的作用范围
变量的默认作用范围 只针对当前的shell(终端)有效
如果在当前的shell产生新的子shell,或者是当前shell的平行shell或父shell,都是无效的
step1: 举个例子 命令行中给一个变量赋值
demo_var=333
step2: 然后在一个脚本中调用该变量,并打印值
文件名 testDemo.sh
#!/bin/sh
echo demo_var=$demo_var
step3: 用两种在当前shell执行的执行方式来执行
source test07.sh #执行结果 demo_var=333
. test07.sh #执行结果 demo_var=333
可以获取到该变量的值
step4: 用两种会创建子进程的执行方式来执行
bash test07.sh #执行结果 demo_var=
./test07.sh #执行结果 demo_var=
发现并不能获取到该变量的值
改变变量的默认作用范围 用 export
export: 希望在子进程父进程以及其他shell中可以读到当前shell中定义的变量时, 使用export
在命令行中加上
export demo_var
step5: 加上export后 然后用两种会创建子进程的执行方式来执行
bash test07.sh #执行结果 demo_var=333
./test07.sh #执行结果 demo_var=333
可以获取到该变量的值
step6:当不使用变量了,可以对变量删除, 使用unset
unset demo_var
19.6 环境变量
把变量保存在系统中,使它成为环境变量
环境变量:每个shell打开都可以获取到的变量
1)现有的环境变量有哪些
用 env 查看
env
用echo $xxx 来输出值
2) 当前目录的搜索路径
echo $PATH
我们在执行 ls echo 这类命令时, 前面是没有带路径的,这些命令都没有在当前路径,
linux就是通过 $PATH 这个搜索路径来找的
输入
echo $PATH
显示
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin
3) 在原来的PATH路径上加上我们的当前目录 /home/tester
PATH=$PATH:/home/tester
就有当期的目录了,可以直接执行
test0717.sh
19.7 预定义变量
echo $? # 上一条命令的执行结果(是否成功)
echo $$ # 显示进程的id号
echo $0 # 显示当前的进程名称
19.8 位置变量
为shell脚本添加参数
test0717.sh
如果第二个参数有值, 则用传来的值
如果第二个参数没有值, 则用_来代替
#!/bin/sh
echo para1=$1
echo para2=${2-_}
输入
./test0717.sh a
结果
para1=a
para2=_
输入
./test0717.sh a bbb
结果
para1=a
para2=bbb
20- 数组
定义一个名为IPTS的数组
Array=( 10.0.0.1 10.0.0.2 10.0.0.3)
1)第一个元素
输入
echo ${Array}
显示 第一个元素
10.0.0.1
2)所有元素的列表
输入
echo ${Array[@]}
显示 所有元素的列表
10.0.0.1 10.0.0.2 10.0.0.3
3)元素个数
输入
echo ${#IPTS[@]}
显示 元素个数
3
4)下标值为1的元素
输入
echo ${IPTS[1]}
显示 下标值为1的元素
10.0.0.2
21- 运算符
21.1 expr 用于整数值计算
1,输入
expr 4+2 #(错,要数字与运算符中间要加空格)
显示
4+2
2,输入
expr 4 + 2
显示
6
3, 输入
expr 4 + 9.0 #(错, 数字必须是整数)
显示
expr: non-integer argument
expr算得的值如何赋给变量
4, 输入
add_value=`expr 4 + 2`
echo "add_value=$add_value"
显示
add_value=6
21.2 let
let "变量名=变量值"
1, 输入
let b=3*4
echo $b
显示
12
值以0开头为八进制
值以0x开头为十六进制
双圆括号是let命令的简化
((a=10))
((a++))
echo $((10+22))
22- 特殊字符之 括号
22.1 圆括号 () 和 (())
() 产生子shell 使用圆括号会产生一个子shell,如(xyz=223)
数组初始化
(()) 做算术运算 (()) 是 let 命令的简化 ((a=8+2))
22.2 方括号 [] 和 [[]]
[] 做测试 [ 4 -gt 2 ]
[[]] 测试扩展[[ 4 > 2 ]] 做真正的测试
22.3 尖括号 重定向符号 <>
< 和> 做输入输出重定向 比较大小
22.4 花括号 {}
{ } 输出范围 ehco {0..9} 输出0-9的数字
let 变量名=变量值
23- expr
expr (evaluate expressions的缩写)。“表达式求值”。
Shell expr是一个功能强大。并且比较复杂的命令,它除了可以实现整数计算,还可以结合一些选项对字符串进行处理,例如计算字符串长度、字符串比>较、字符串匹配、字符串提取等。
23.1 用expr计算一个整数运算
expr \( 4 + 2 \) \* 2
12
23.2 用"
"(两个反引号) 将计算的结果赋值给新的变量
value1=`expr \( 4 + 2 \) \* 2`
echo $value1
12
23.3 用 $() 将计算的结果赋值给新的变量
value2=$(expr \( 4 + 2 \) \* 2)
echo $value2
12
24- for的使用
for 参数 in 参数列表
do
操作命令
done
参数列表的产生: 使用 命令 / 文本文件
{0..9} ---> 产生1-9的列表
/home/*.sh
for filename in ls `/home/*.shsh`
do
mv $filename $(basename $filename *.shsh).sh #将后缀为shsh改为sh
done
25- 使用循环处理未知参数
while [ $# -ge 1 ];
do
echo "total paras=" $#
if [ $1 == help ] ; then
echo '$1' =$1
fi
shift
done
26- 脚本优先级控制
使用nice renice 调整脚本优先级
避免出现 "不可控的"死循环
27- 一次性计划任务
设置
at + 时间 + 命令
查看
atq
28- 周期性计划任务
配置
crontab -e
查看
crontab -l
29- 如果数据不能按照预期时间运行
29.1 延迟计划任务
anacontab
29.2 flock 锁文件
三、文本操作篇
30- find
30.1 find 目录 -name 文件名
find /etc -name passwd 查找 /etc 目录下文件名为passwd的文件
find . -name "*bin" 查找 当前目录下后缀名为 bin的文件名
30.2 find 目录 -regex 文件名
find /etc -regex .*wd 查找 /etc 目录下以wd结尾的文件
find /etc -regex .etc.*wd 查找 /etc 目录下文件名含 etc且wd结尾的文件
find /etc -regex .*sec.*wd 查找 /etc 目录下文件名含 sec且wd结尾的文件
30.3 find 目录 -type x -regex 名字
find 目录 -type d -regex 目录名
find 目录 -type f -regex 文件名
查找当前目录以及所有子目录下文件名含.h的文件
第一种
find ./ -type f -regex .*.h
第二种
find ./ -type f -name "*.h"
查找当前目录以及所有子目录下文件名含.h 且文件内容含有abcd的文件
第一种
find ./ -type f -regex .*.h | xargs grep abcd
第二种
find ./ -type f -name "*.h" | xargs grep abcd
30.4 find 目录 -xtime xxx
find 目录 -atime xxx atime access 访问时间
find 目录 -ctime xxx ctime change 改变时间
find 目录 -mtime xxx mtime modify 修改时间