# Linux

# 1. Linux 常用目录

目录 说明
/ 根目录
/boot 启动目录
/dev 设备文件
/etc 配置文件
/home 普通用户的家目录
/lib 系统库保存目录
/mnt 移动设备挂载目录
/media 光盘挂载目录
/misc 磁带机挂载目录
/root 超级用户的家目录
/tmp 临时目录,可以操作
/proc 内存的挂载点,不能直接操作
/sys 内存的挂载点,不能直接操作
/var 变量
/bin 普通命令
/sbin 超级用户可以执行的命令
/usr/bin 系统软件资源目录,普通用户的系统命令
/usr/sbin 系统软件资源目录,超级用户的系统命令

# 2. Linux 常用目录截图

# 3. Linux 命令格式

  • 严格区分大小写
  • 命令 [选项][参数]
  • 当有多个选项时,可以写在一起
  • 一般参数有简写有完整写法,如 --a 和--all 等效

# 4. Linux 常用命令

# 5. 基本命令说明列表

命令 选项 参数 描述 Code
history 查看历史命令记录
-c 清空历史命令记录
ls [目录/文件名] 查询目录中的内容
-a [目录/文件名] 显示所有文件,包括隐藏文件
-l [目录/文件名] 显示详情信息,等同于 ll
drwxr-xr-x --> 文件类型和权限
. --> ACL 权限
2 --> 硬链接引用计数
root --> 所有者
root --> 所属组
4096 --> 文件大小
Apr 11 2018 --> 最后修改时间
home --> 文件名
-d [目录/文件名] 查看目录本身的属性而非子文件
-h [目录/文件名] 人性化的方式显示文件大小
-i [目录/文件名] 显示inode,也就是i节点,每个节点都有ID号
mkdir 目录名 创建目录
-p 目录名 递归创建目录
cd 目录名 切换到所在目录
~ 切换到家目录
. 当前目录
.. 上级目录
1. 相对路径是参照当前所在目录
2. 绝对路径是从根目录开始
3. 按TAB键可以补全命令和目录
pwd 显示当前目录
rmdir [目录名] 删除目录
rm -r [文件/目录名] 删除目录
-f [文件/目录名] 强制删除
-rf [文件/目录名] 递归强制删除所有目录
cp [源文件][目标位置] 复制文件到目标位置下
-r [源文件][目标位置] 复制目录,默认是复制文件
-p [源文件][目标位置] 连带文件属性复制
-d [源文件][目标位置] 若源文件是链接文件,则复制链接属性
-a [源文件][目标位置] 相当于-rpd
mv [源文件/源目录][目标文件/目标目录] 移动(文件/目录)或重命名(文件/目录) mv 1.txt 2.txt
mv 1.txt /tmp/
ln -s [源文件][目标文件] 创建软链接 ln -s /root/1.txt 1.ln.txt
1. 类似于windows的创建快捷方式
2. 软链接拥有自己的i节点和Block块,但是数据块中只保存源文件的文件名和i节点号,并没有实际的文件数据
3. 修改任意一个文件,另一个都会改变
4. 删除源文件,软链接不能使用
5. 软链接源文件必须写绝对路径
whereis 命令名称 查找命令名称所在的文件位置 whereis cd
which 命令名称 查找命令名称所在的文件位置 which ls
echo 打印,理解为console echo hello world
$PATH 打印环境变量的路径 echo $PATH
find [搜索范围/搜索条件] [名称] 查找文件 find /
-name [搜索范围/搜索条件] 按照名称进行查找 find /root -name 1.txt
-i 忽略大小写查找 find /root -iname ABC.txt
通配符 * 匹配任意内容 find /root *
通配符 [] 匹配[]中的任意一个字符 find /root -name ab[ecf].txt
通配符 ? 匹配任意一个字符 find /root -name ab?.txt
-user 按所属者用户进行搜索 find /root -user root
grep [匹配条件] [名称] 在文件当中匹配符合条件的字符串 grep helloworld 1.txt
-i 忽略大小写进行查找 grep Helloworld -i 1.txt
-v 排除指定字符串
zip -r [压缩后名称][压缩目录] 压缩目录 压缩: zip -r a.zip a
解压: unzip a.zip
gzip 文件名称 压缩为.gz格式的压缩文件,源文件会消失 gzip 1.txt
-c 源文件 > 压缩文件 压缩为.gz格式的压缩文件,源文件不会消失 gzip -c 1.txt > 1.txt.gz
-r 目录 压缩目录下的所有子文件,但是不压缩目录 gzip -r xx
gunzip 压缩文件 解压缩文件,不保留压缩包 gunzip 1.txt.gz
tar -c 打包 打包命令
-v 显示打包过程 打包命令
-f 指定打包后的文件名 打包命令
-cvf 打包文件名 源文件 打包命令 tar -cvf 1.tar 1.txt
-xvf 打包文件名 解包命令 tar -xvf 1.tar
-zcvf 打包文件名 目录名/文件名 压缩为.tar.gz格式 tar -zcvf book.tar.gz book
-zxvf 包名.tar.gz 解压.tar.gz格式包 tar -zxvf book.tar.gz
shutdown -c 取消前一个关机命令 shutdown -c
-r 时间 重启 shutdown -r 06:00
-h 关机 shutdown -h
init 0 关机 init 0
6 重启 init 6
logout 退出登录 logout
w 查看登录用户信息 w
USER --> 登录的用户名
TTY --> 登录的终端 tty1 本地终端 pts/0远程终端
FROM --> 登录的IP
LOGIN --> 登录时间
IDLE --> 用户闲置时间
JCPU --> 该终端所有进程占用的时间
PCPU --> 当前进程所占用的时间
WHAT --> 正在执行的命令
who 查看登录用户信息 who
USER --> 登录的用户名
TTY --> 登录的终端 tty1 本地终端 pts/0远程终端
LOGIN --> 登录时间和登录的IP
last 查看当前登录和过去登录的用户信息 默认读取 /var/log/wtmp 文件 last
用户名
登录终端
登录IP
登录时间
退出时间(在线时间)
lastlog 查看所有用户的最后一次登录时间 lastlog
用户名
登录终端
登录IP
最后一次登录时间

# 6. Vi 常用命令列表

模式 参数 描述 Code
打开文件 文件名 编辑文件 vi 1.txt
底行模式 :w 把内容写入保存到硬盘中
:q 退出当前Vi编辑器打开的文件
:wq! 强制保存并退出
插入模式 i 在当前位置插入
a 在当前光标的右边插入
A 在当前光标的右行末插入
s 删除当前光标位置并插入
删除 x 删除当前字符
dd 删除光标所在行
撤销 u 撤销最后执行的一次命令
复制 yy 复制光标所在的行
粘贴 p 光标所在行的下方粘贴
P 光标所在行的上方粘贴
搜索 / 输入/可以在当前文件中查找该字符串 /const
n 查找下一个
Shift+N 查找上一个

# 7. 用户和用户组

# 7.1 解释说明

用户: 使用操作系统的人都是用户 用户组: 具有相同系统权限的一组用户

# 7.2 用户组操作

# 1. 创建用户组
groupadd student

# 2. 查看用户组
cat /etc/group
cat /ect/group | grep student

# 3. 修改用户组名称
groupmod student -n stu

# 4. 修改用户组编号
groupmod -g 666 stu

# 5. 创建用户组并且指定编号
groupmod -g 888 teacher

# 6. 删除用户组
groupdel teacher

# 7.3 用户操作

# 1. 如果创建用户的时候没有指定用户组,系统会为他创建一个和用户名相同的用户组

# 2. 添加用户组
groupadd huihuizi

# 3. 创建用户
useradd -g huihuizi zhangsan
useradd -g huihuizi lisi

# 4. 查看用户
id zhangsan

# 5. 创建用户并指定家目录
useradd -d /home/huihuizi wangwu

# 6. 设置用户密码
passwd zhangsan
passwd lisi
passwd wangwu

# 7. 修改个人家目录
usermod -d /home/wangyu wangwu

# 8. 修改用户组
usermod -g changfu wangwu

# 9. 删除用户
userdel wangwu

# 10. 删除用户并删除对应的目录
userdel -r zhangsan

# 8. Shell 编程 - 变量

# 8.1 解释说明

  • Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便于运行程序的界面系统级程序
  • 用户可以用 Shell 来启动、挂起、停止或者编写一些程序
  • Shell 还是一个功能相当强大的编程语言,易编写、易调试、灵活性较强
  • Shell 是解释型语言,在 Shell 中可以直接调用 Linux 系统命令

# 8.2 变量

  • 变量默认类型都是字符串
  • 可以变化的量
  • 必须以字母或者下划线开头,名字中间只能由字母、数字和下划线组成
  • 变量名的长度不得超过 255 个字符
  • 变量名在有效范围内必须是唯一的

# 8.3 变量的分类

  • 字符串
  • 整型
  • 浮点型
  • 日期型

# 8.4 用户自定义变量

  • 变量的值是自己定义的
  • 变量名不能为数字开头
  • 等号左右两边不能有空格
# 定义变量
name=zcf
age=18

# 输出变量值
echo $变量名

# 值默认都是字符串
x=1
y=2
z=$x+$y
echo $z # 1+2

# 赋值的时候引用变量
m="$x"2
echo $m # 12

# 8.5 查看变量

# 查询系统中默认所有已经生效的变量,包括系统变量,也包括自定义变量
set | grep zcf

# 8.6 删除变量

unset xx

# 8.7 环境变量

  • 环境变量是全局变量,而自定义变量是局部变量
  • 自定义变量会在当前的 shell 中生效,而环境变量会在当前 shell 以及子 shell 中生效
  • 环境变量主要保存的是和系统操作环境相关的数据
  • 变量可以自定义,但是对系统生效的环境变量名和变量作用是固定的
# 自定义环境变量
export 变量名=变量值
export envName=prod

# 仅仅用来查看环境变量,而不看到本地变量
env | grep envName

# 系统系统变量
HOSTNAME -> 主机名 -> HOSTNAME=localhost
SHELL -> 当前的shell -> SHELL=/bin/bash
HISTSIZE -> 历史命令条数 -> HISTSIZE=1000
SSH_CLIENT -> 客户端IP -> SSH_CLIENT=192.168.1.1
USER -> 当前登录的用户 -> USER=root

echo $HOSTNAME
echo $SHELL
echo $HISTSIZE
echo $SSH_CLIENT
echo $USER

# 8.8 位置参数变量

# 写一个求和的shell脚本
#!/bin/bash
vi sum.sh

num1=$1
num2=$2
sum=$((num1+num2))
echo $sum

sh sum.sh 1 2

# 写一个循环输出的shell脚本
vi for.sh

#!/bin/bash
# "$@" 代表命令行中的所有参数
# "$#" 代表命令行中所有参数的个数
for i in "$@"
  do
    echo i=$i
  done

sh for.sh 1 2 3 4

# 8.9 预定义变量

  • 是脚本中已经定义好的变量,变量名不能自定义,变量作用也是固定的

$? : 最后一次执行命令的返回状态,0 代表正确执行,非 0 代表不正确执行

$$

$$

echo $?
echo $$

# 9. Shell 编程 - read

选项 含义
-p 提示信息,在等待 read 输入时,输出提示信息
-t 等待用户输入的秒数
-n 字符数,read 命令只接受指定的字符数,就会执行
-s 隐藏输入的数据,适用于机密信息的输入
# 写一个让用户输入名字、性别、密码并打印出来的Shell脚本

vi read.sh

#!/bin/bash
read -p '请输入你的名字:' -t 5 name
echo -e "\n"
read -p '请输入你的性别:' -n 1 gender
echo -e "\n"
read -p '请输入你的密码' -s password
echo -e "\n"
echo $name,$gender,$password

sh read.sh

# 10. Shell 编程 - 流程控制

# 10.1 按照文件类型进行判断

选项 描述
-d 文件是否存在并且是目录
-e 文件是否存在
-f 文件是否存在并且是普通文件
# 编写一个判断文件是否存在的shell脚本
vi exist.sh

#!bin/bash
read -p "请输入文件路径" file
[ -e $file ] && echo 'yes' || echo 'no'

sh exist.sh

# 编写一个判断路径是文件还是目录的shell脚本
vi fileOrDir.sh

# 10.2 按照文件权限进行判断

选项 描述
-r 文件是否存在,并且是否拥有读权限
-w 文件是否存在,并且是否拥有写权限
x 文件是否存在,并且是否拥有执行权限
echo read >> read.txt
echo write >> write.txt
echo execute >> execute.txt

chmod u+w wirte.txt
chmod u+x execute.txt

[ -r read.txt ] && echo "read yes" || echo "read no"

[ -w write.txt ] && echo "write yes" || echo "write no"

[ -x execute.txt ] && echo "execute yes" || echo "execute no"

# 10.3 两个整数间的比较

选项 描述
整数 1 -eq 整数 2 判断整数 1 是否和整数 2 相等
整数 1 -ne 整数 2 判断整数 1 是否和整数 2 不相等
整数 1 -gt 整数 2 判断整数 1 是否大于整数 2
整数 1 -lt 整数 2 判断整数 1 是否小于整数 2
整数 1 -ge 整数 2 判断整数 1 是否大于等于整数 2
整数 1 -le 整数 2 判断整数 1 是否小于等于整数 2
[ 2 -eq 2 ] && echo "相等" || echo "不相等"
[ 1 -ne 2 ] && echo "不相等" || echo "相等"
[ 3 -gt 2 ] && echo "3大于2" || echo "no"
[ 2 -lt 3 ] && echo "2小于3" || echo "no"
[ 2 -ge 2 ] && echo "2大于等于2" || echo "no"
[ 2 -le 2 ] && echo "2小于等于2" || echo "no"

# 10.4 多重条件判断

选项 描述
判断 1 -a 判断 2 逻辑与(js 中&&)
判断 1 -o 判断 2 逻辑或(js 中| | )
!判断 逻辑非(js 中!)
[ 2 -gt 1 -a 1 -lt 2 ] && echo "yes" || echo "no"
[ 2 -lt 1 -o 2 -gt 1 ] && echo "yes" || echo "no"
[ ! 3 -gt 2 ] && echo "yes" || echo "no"

# 10.5 单分支 if 语句

  • if 语句使用fi结尾
  • [条件判断式]就是使用test命令进行判断,所以中括号和条件判断式之间必须有空格
  • then 后面跟符合条件之后执行的程序,可以放在[]之后,用;分隔,也可以换行不用;
# 基本语法
if [条件判断];then
  代码体
fi

if [条件判断]
then
  代码体
fi

# 实例
if [ 2 -gt 1 ];then echo bigger;fi

if [ 2 -gt 1 ]
then
  echo bigger
fi

# 判断当前用户是否为root用户
vi isRoot.sh

#!/bin/bash
user=`whoami`
if [ $user == root ]
then
  echo "我是root用户"
fi

# 10.6 双分支 if 语句

# 基本语法
if [条件判断]
then
 代码体1
else
  代码体2
fi

# 编写一个判断路径是否为目录的shell脚本
vi isDir.sh

#!/bin/bash
read -p "请输入一个路径" dir
if [ -d $dir ]
then
   echo "$dir是目录"
else
   echo "$dir不是目录"
fi

sh isDir.sh

# 10.7 多分支 if 语句

# 基本语法
if [条件判断1]
then
  代码体1
elif [条件判断2]
then
  代码体2
else
  代码体3
fi

# 实例
vi manyif.sh

#!/bin/bash
read -p "请输入一个分数" score
if [ $score -gt 90 ]
then
   echo "优秀"
elif [ $score -gt 80 -a $score -le 90 ]
then
   echo "良好"
else
  echo "继续努力"
fi

sh manyif.sh

# 10.8 循环语句-for

# 语法
for 变量 in 值1 值2 值3
do
  代码块
done

for((i=1;i<10;i++));
do
  echo $(($i))
done

# 10.9 循环语句-while

# 语法
while [条件判断式]
do
  代码块
done

# 编写一个从1加到100的shell脚本
vi while.sh

#!/bin/bash
i=1
result=0
while [ $i -le 100 ]
do
  result=$(($result+$i))
  i=$(($i+1))
done
echo $result

sh while.sh

# 11. 软件包管理

# 11.1 软件包的分类

  • 源码包(需要经过编译,把源代码编译成机器语言才能运行)
    • 优点
      • 开源免费
      • 可以自由配置功能
      • 编译安装更适合自己系统,更稳定
      • 卸载稳定
    • 缺点
      • 安装过程比较复杂
      • 编译过程比较长
      • 安装过程一旦报错,非常难以排查
  • 二进制包
    • 优点
      • 包管理系统比较简单,只要通过简单的命令就可以实现包的安装、升级、查询和卸载
      • 安装速度比源码包快很多
    • 缺点
      • 经过编译则不能看到源代码
      • 功能选择不灵活
      • 依赖性比较麻烦
  • 脚本安装包(把复杂的安装过程写成了脚本,可以一键安装,本质上安装的还是源码包或二进制包)
    • 优点
      • 安装简单
    • 缺点
      • 失去了自定义性

# 11.2 YUM 在线管理

RPM(RedHat Package Manager),类似 Windows 中的添加/删除程序

yum(Yellow dog Updater),Modified 主要功能是更方便的添加/删除/更新 RPM 包,它能自动解决包的依赖性问题

RPM 包的在线管理命令

# 11.3 使用阿里云镜像

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache

# 11.5 YUM 命令

命令 描述
yum list 查询所有可用软件包列表
yum search 搜索服务器上所有和关键字相关的包
yum -y install 包名 -y 自动回答 yes install 安装
yum -y update 包名 -y 自动回答 yes update 升级
yum -y remove 包名 -y 自动回答 yes remove 卸载,卸载有依赖性,所以尽量不要卸载

# 11.4 安装 Nginx

# 安装
yum install nginx -y

# 查看安装位置
whereis nginx

# 启动服务
systemctl start nginx.service

# 测试
curl http://1.15.51.4/

# 停止服务
systemctl stop nginx.service

# 11.5 安装 Mongodb

# 1. 添加安装源
vim /etc/yum.repos.d/mongodb-org-3.4.repo

# 2. 添加以下内容
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc

# 3. 更新缓存
yum makecache

# 4. 安装
yum -y install mongodb-org

# 5. 修改配置文件
vi /etc/mongod.conf

# 6. 注释掉bindIp内容
net:
  port: 27017
#  bindIp: 127.0.0.1

# 7. 启动服务
systemctl start mongod.service

# 8. 停止服务
systemctl stop mongod.service

# 9. 查看状态
systemctl status mongod.service

# 10. 重启服务
systemctl restart mongod.service

# 11.6 安装 Redis

# 安装
yum install redis -y

# 启动服务
systemctl start redis.service

# 停止服务
systemctl stop redis.service

# 查看状态
systemctl status redis.service

# 重启服务
systemctl restart redis.service

# 11.7 安装 Mysql

# 下载MySQL源安装包
wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

# 安装源
yum -y install mysql57-community-release-el7-11.noarch.rpm
yum repolist enabled | grep mysql.*

# 安装Mysql服务器
yum install mysql-community-server -y

# 启动服务
systemctl start mysqld.service

# 停止服务
systemctl stop mysqld.service

# 查看状态
systemctl status mysqld.service

# 重启服务
systemctl restart mysqld.service

# 开机自动访问
systemctl enable mysqld
systemctl daemon-reload