# 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