前言:我从第三章开始做,这本书其实蛮适合现在的我,主要目的是查漏补缺
第三章
四个最常用的转义字符:
- 反斜杠(\ ):使反斜杠后面的一个变量变为单纯的字符串。
- 单引号(‘’):转义其中所有的变量为单纯的字符串。
- 双引号(“”):保留其中的变量属性,不进行转义处理。
- 反引号( ` `) :把其中的命令执行后返回结果。
管道符 |
口诀:前一个命令的输出为后一个命令的输入
输入输出重定向
口诀是:输入输出错误流,分别对应:
数据流 | 文件描述符 |
---|---|
STDIN | 0 |
STDOUT | 1 |
STDERR | 2 |
这三个文件描述符是linux默认有的。 |
输入重定向
符号 | 作用 |
---|---|
命令 < 文件 | 将文件作为命令的标准输入 |
命令 << 分界符 | 从标准输入中读入,直到遇见分界符才停止 |
命令 < 文件 1 > 文件 2 将文件 1 | 作为命令的标准输入并将标准输出到文件2 |
输出重定向
符号 | 作用 |
---|---|
命令 > 文件 | 将标准输出重定向到一个文件中(清空原有文件的数据) |
命令 2> 文件 | 将错误输出重定向到一个文件中(清空原有文件的数据) |
命令 >> 文件 | 将标准输出重定向到一个文件中(追加到原有内容的后面) |
命令 2>> 文件 | 将错误输出重定向到一个文件中(追加到原有内容的后面) |
命令 >> 文件 2>&1 或 命令 &>> 文件 | 将标准输出与错误输出共同写入到文件中(追加到原有内容的 后面) |
用户执行一条命令后,解释器所做的事情
- 判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是的话 则直接执行。
- Linux 系统检查用户输入的命令是否为“别名命令”,即用一个自定义的命令 名称来替换原本的命令名称。
- Bash 解释器判断用户输入的是内部命令还是外部命令。
- 系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作 PATH。
Linux 系统中最重要的 10 个环境变量
变量名称 | 作用 |
---|---|
HOME | 用户的主目录(即家目录) |
SHELL | 用户在使用的 Shell 解释器名称 |
HISTSIZE | 输出的历史命令记录条数 |
HISTFILESIZE | 保存的历史命令记录条数 |
MAIL | 邮件保存路径 |
LANG | 系统语言、语系名称 |
RANDOM | 生成一个随机数字 |
PS1 | Bash 解释器的提示符 |
PATH | 定义解释器搜索用户执行命令的路径 |
EDITOR | 用户默认的文本编辑器 |
普通变量只需要选一个变量名(说是最好全大写),再用=赋值就好了,别乱加空格。
另外,普通变量的生命周期与终端一样,我把终端关了,再打开一个终端变量就没了。
变量是可以自定义的,但是默认是局部的,即别用户无法使用,但是可以用export
命令将其提升为全局变量,这样其他用户也就可以使用它了。
第四章
- vim
我个人还是蛮喜欢用vim的,直接解放双手,很推荐去专门练一手vim,可以花点点时间去研究对应的插件,基础好+熟练效率真的可以完爆IDE。
vim的模式其实分4个模式- 正常模式,可以进行正常的文本编辑
- 插入模式,对应书中输入模式
- 视图模式,可以光标行或列选取
- Ex模式,即命令模式,对应书中末行模式
这些其实非常简单,花个两天玩一下,熟悉一下vim的快捷键和常用命令,如:复制粘贴,行尾字符删、撤回、复制粘贴、光标定位和移动、字符替换。就是书中收集的这些,配合若干个C语言的小项目,有哪里不熟悉就练哪里。可定制是vim最大亮点,可以去GitHub找一下别人的vim配置(文件在~主目录上.vimrc),下几个好用的插件,定制自己的代码编辑器。
- ifconfig 查询主机网络信息
- ping ip地址 查询网络连接
Shell 脚本
- 交互式(Interactive):用户每输入一条命令就立即执行。
- 批处理(Batch):由用户事先编写好一个完整的 Shell 脚本,Shell 会一次性执行脚本 中诸多的命令。
- ps:很好理解,脚本程序需要一个解释程序来执行程序,linux默认是bash,该解释程序会逐行解释程序中的每条命令,省去了编译的过程。
linux的shell脚本以.sh为文件扩展名(约定俗称)。(可以用#!指定解释器)用vim在文件里面输入一些命令。
使用方法:
- 终端相对路径和绝对路径执行文件(需要文件有可执行权限)
- 用bash 文件名路径 或 sh 文件名路径 (不需要可执行权限)
这些可执行文件,我们是可以灵活调整输入参数的。(我们平时编程main函数入口,有个args[]参数作为命令输入,args[0]、args[1]…来自定义参数,这里也可以这么理解。)
$0
脚本程序名称$#
对应参数个数$*
对应所有的参数值$?
对应的是显示上一次命令的执行返回值$数字
对应 $1 $2 $3…数字代表按顺序输入的每个元素
测试了一下,$后面只能接一位字符
比如说$1对应字符X,那么$11会发生什么?
总共有12个参数,分别是X 2 3 4 5 6 7 8 9 10 11 12。
输出: $X1
运算符
- 使用方法:[ 条件表达式 ] (记得不能少那左右两个空格,不然老是报错)
运算符 | 作用 |
---|---|
-d | 测试文件是否为目录类型 |
-e | 测试文件是否存在 |
-f | 判断是否为一般文件 |
-r | 测试当前用户是否有权限读取 |
-w | 测试当前用户是否有权限写入 |
-x | 测试当前用户是否有权限执行 |
还有与(&&)或(||)非(!)运算符连接两个命令,很好理解,与或运算遵循短路运算原则
可以在文件里这么写:
[ -e ./k ] || [ -d ./k ] && echo "不是目录或不存在"
- 数字运算符(左右两边针对数字,不能和字符串混用)
运算符 | 作用 |
---|---|
-eq | 是否等于 |
-ne | 是否不等于 |
-gt | 是否大于 |
-lt | 是否小于 |
-le | 是否等于或小于 |
-ge | 是否大于或等于 |
书中列了个有意思的例子,用于查看内存是否足够
FreeMem=`free -m | grep Mem: | awk '{print $4}'`
[ $FreeMem -lt 1024 ] && echo "Insufficient Memory"
至于比较字符,就是简单的=、!=以及-z(判断字符串内容是否为空)了。
直接现学现用就好了
#!/bin/bash
FK=
[ -z $FK ] && echo "字符串为空" || echo "字符串为$FK"
流程控制语句
编程语言万变不离其宗,顺序选择循环
- if 语句
格式:
if [ 条件表达式 ]
then
#一系列操作......
elif [ 条件表达式 ]
then
#一系列操作......
else
#一系列操作......
fi #结束符
- for 语句
格式:
for 变量名 in 取值列表
do
#$变量名一系列操作......
done
现学现用:(打印输入的所有参数)
#!/bin/bash
for N in $*
do
echo $N
done
- while 语句
格式:
while 条件表达式
do
#一系列操作......
done
书中的例子
#!/bin/bash
PRICE=$(expr $RANDOM % 1000) #$RANDOM是系统变量,在上面有写
TIMES=0
echo "商品实际价格为 0-999 之间,猜猜看是多少?"
while true
do #这里可以改改不能输入字符,只能输入数字
read -p "请输入您猜测的价格数目:" INT
let TIMES++
if [ $INT -eq $PRICE ] ; then
echo "恭喜您答对了,实际价格是 $PRICE"
echo "您总共猜测了 $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ] ; then
echo "太高了!"
else
echo "太低了!"
fi
done
- case 语句
case 变量 in
[范围x])
#一系列命令......
;;
*)
#默认执行
#一系列命令......
esac
- crond 用法
这里我是结合别人的资料来学>>>Linux之定时任务Crond使用
一句话概况crontab每一行
分 时 日 月 周 命令- 命令中必须使用绝对路径
- “分”字段必须有数值,绝对不能为空或是*号
- “日”和“周”字段不能同时使用,否则就会发生冲突。
第五章
UID是表示用户的身份号码,具有唯一性。
0代表root系统管理员用户
1~999代表系统用户
1000开始往后代表普通用户
GID是用户组号
常用的基本命令
useradd
命令
格式为:useradd [选项] 用户名
参数 | 作用 |
---|---|
-d | 指定用户的家目录(默认为/home/username) |
-e | 账户的到期时间,格式为 YYYY-MM-DD |
-u | 指定该用户的默认 UID |
-g | 指定一个初始的用户基本组(必须已存在) |
-G | 指定一个或多个扩展用户组 |
-N | 不创建与用户同名的基本用户组 |
-s | 指定该用户的默认 Shell 解释器 |
书上提到了一个点,一旦用户的解释器被设置为 nologin,则代表该用户不能登录到系统中。
即 -s /sbin/nologin
groupadd
命令
作用:用于创建用户组
格式为:groupadd 用户名
usermod
命令
格式为:usermod [选项] 用户名
参数 | 作用 |
---|---|
-c | 填写用户账户的备注信息 |
-d | -m 参数-m 与参数-d 连用,可重新指定用户的家目录并自动把旧的数据转移过去 |
-e | 账户的到期时间,格式为 YYYY-MM-DD |
-g | 变更所属用户组 |
-G | 变更扩展用户组 |
-L | 锁定用户禁止其登录系统 |
-U | 解锁用户,允许其登录系统 |
-s | 变更默认终端 |
-u | 修改用户的 UID |
ps:用户组和用户是多对多的关系,-g 和 -G 选项 千万别搞混了,一个覆盖一个扩展。
passwd
命令
作用:root用户可以修改任一用户的密码,普通用户只能修改自己的
格式为:passwd [选项] [用户名]
参数 | 作用 |
---|---|
-l | 锁定用户,禁止其登录 |
-u | 解除锁定,允许用户登录 |
–stdin | 允许通过标准输入修改用户密码,如echo “NewPassWord” | passwd --stdin Username |
-d | 使该用户可用空密码登录系统 |
-e | 强制用户在下次登录时修改密码 |
-S | 显示用户的密码是否被锁定,以及密码所采用的加密算法名称 |
userdel
命令
参数 | 作用 |
---|---|
-f | 强制删除用户 |
-r | 同时删除用户及用户家目录 |
chattr
命令
格式为:chattr [参数] 文件
作用:用于设置文件的隐藏权限(听起来就很nb)
对参数的加减权限分别对应 +
和-
参数 | 作用 |
---|---|
i | 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件 |
a | 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only) |
S | 文件内容在变更后立即同步到硬盘(sync) |
s | 彻底从硬盘中删除,不可恢复(用 0 填充原文件所在硬盘区域) |
A | 不再修改这个文件或目录的最后访问时间(atime) |
b | 不再修改文件或目录的存取时间 |
D | 检查压缩文件中的错误 |
d | 使用 dump 命令备份时忽略本文件/目录 |
c | 默认将文件或目录进行压缩 |
u | 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复 |
t | 让文件系统支持尾部合并(tail-merging) |
X | 可以直接访问压缩文件中的内容 |
(还真别说,我记不住这些…)
lsattr
命令
格式为:lsattr [参数] 文件
作用:展示隐藏权限
第六章
linux目录
目录名称 | 应放置文件的内容 |
---|---|
/boot | 开机所需文件—内核、开机菜单以及所需配置文件等 |
/dev | 以文件形式存放任何设备与接口 |
/etc | 配置文件 |
/home | 用户家目录 |
/bin | 存放单用户模式下还可以操作的命令 |
/lib | 开机时用到的函数库,以及/bin 与/sbin 下面的命令要调用的函数 |
/sbin | 开机过程中需要的命令 |
/media | 用于挂载设备文件的目录 |
/opt | 放置第三方的软件 |
/root | 系统管理员的家目录 |
/srv | 一些网络服务的数据文件目录 |
/tmp | 任何人均可使用的“共享”临时目录 |
/proc | 虚拟文件系统,例如系统内核、进程、外部设备及网络状态等 |
/usr/local | 用户自行安装的软件 |
/usr/sbin | Linux 系统开机时不会使用到的软件/命令/脚本 |
/usr/share | 帮助与说明文件,也可放置共享文件 |
/var | 主要存放经常变化的文件,如日志 |
/lost+found | 当文件系统发生错误时,将一些丢失的文件片段存放在这里 |
(汗,书中总结了很多,我全搬过来了,能记一点是一点)
常用命令
mount
挂载命令
参数 | 作用 |
---|---|
-a | 挂载所有在/etc/fstab 中定义的文件系统 |
-t | 指定文件系统的类型 |
但是这个命令的挂载是临时的,重启之后依然需要重新挂载,我记得我以前搞了一次装在 U盘 的迷你linux系统,折腾了好几天才搞明白。
- 打开文件: vim /etc/fstab
- 设备文件 挂载目录 格式类型 权限选项 自检 优先级
我找了一下我的这个文件,发现是这样的:(-_-!汗)
/swapfile none swap sw 0 0
/dev/fd0 /media/floppy0 auto rw,user,noauto,exec,utf8 0 0
umount
卸载命令
格式为:umount [挂载点/设备文件]
软硬方式链接
硬连接
硬链接文件与原始文件只是名字不相同的同一个文件
不能跨分区对目录文件进行链接
若原始文件删掉了,还是能够正常访问
软链接
包含了一个指向目标原文件的路径(应该通常是绝对路径)
可以跨文件系统
原始文件删了就真删了,无法访问
ln
命令
格式为:ln [选项] 目标
参数 | 作用 |
---|---|
-s | 创建“符号链接”(如果不带-s 参数,则默认创建硬链接) |
-f | 强制创建文件或目录的链接 |
-i | 覆盖前先询问 |
-v | 显示创建链接的过程 |
第七章
讲的是RAID和LVM技术
第八章
防火墙策略管理工具
有四种策略:
- ACCEPT(允许流量通过)
- REJECT(拒绝流量通过)
- LOG (记录日志信息)
- DROP (拒绝流量通过)
iptables
命令
参数 | 作用 |
---|---|
-P | 设置默认策略 |
-F | 清空规则链 |
-L | 查看规则链 |
-A | 在规则链的末尾加入新规则 |
-I | num 在规则链的头部加入新规则 |
-D | num 删除某一条规则 |
-s | 匹配来源地址 IP/MASK,加叹号“!”表示除这个 IP 外 |
-d | 匹配目标地址 |
-i | 网卡名称 匹配从这块网卡流入的数据 |
-o | 网卡名称 匹配从这块网卡流出的数据 |
-p | 匹配协议,如 TCP、UDP、ICMP |
–dport num | 匹配目标端口号 |
–sport num | 匹配来源端口号 |
firewalld
这个多了一个区域的概念,书中讲的很直观,区域能够方便默认策略规则的快速转换。
- 区域
区域 | 默认策略规则 |
---|---|
trusted | 允许所有的数据包 |
home | 拒绝流入的流量,除非与流出的流量相关;而如果流量与 ssh、mdns、ipp-client、amba-client 与 dhcpv6-client 服务相关,则允许流量 |
internal | 等同于 home 区域 |
work | 拒绝流入的流量,除非与流出的流量数相关;而如果流量与 ssh、ipp-client 与dhcpv6-client 服务相关,则允许流量 |
public | 拒绝流入的流量,除非与流出的流量相关;而如果流量与 ssh、dhcpv6-client 服务相关,则允许流量 |
external | 拒绝流入的流量,除非与流出的流量相关;而如果流量与 ssh 服务相关,则允许流量 |
dmz | 拒绝流入的流量,除非与流出的流量相关;而如果流量与 ssh 服务相关,则允许流量 |
block | 拒绝流入的流量,除非与流出的流量相关 |
drop | 拒绝流入的流量,除非与流出的流量相关 |
- firewalld-cmd 命令中使用的参数以及作用
参数 | 作用 |
---|---|
–get-default-zone | 查询默认的区域名称 |
–set-default-zone=<区域名称> | 设置默认的区域,使其永久生效 |
–get-zones | 显示可用的区域 |
–get-services | 显示预先定义的服务 |
–get-active-zones | 显示当前正在使用的区域与网卡名称 |
–add-source= | 将源自此 IP 或子网的流量导向指定的区域 |
–remove-source= | 不再将源自此 IP 或子网的流量导向某个指定区域 |
–add-interface=<网卡名称> | 将源自该网卡的所有流量都导向某个指定区域 |
–change-interface=<网卡名称> | 将某个网卡与区域进行关联 |
–list-all | 显示当前区域的网卡配置参数、资源、端口以及服务等信息 |
–list-all-zones | 显示所有区域的网卡配置参数、资源、端口以及服务等信息 |
–add-service=<服务名> | 设置默认区域允许该服务的流量 |
–add-port=<端口号/协议> | 设置默认区域允许该端口的流量 |
–remove-service=<服务名> | 设置默认区域不再允许该服务的流量 |
–remove-port=<端口号/协议> | 设置默认区域不再允许该端口的流量 |
–reload | 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则 |
–panic-on | 开启应急状况模式 |
–panic-off | 关闭应急状况模式 |
(-_-!汗,我的头好大,不管了,先记下来再说)
- GUI版本
书中推荐firewall-config
捣鼓了一下,顿时觉得比终端模式香多了…(-_-!汗,那我还记个啥?)
第九章
主要重点记一下ssh协议和sshd服务
主配置文件:/etc/ssh/sshd_config
连接方式:ssh [参数] ip地址
在连接前需要做一些事情,比如服务器的配置和生成客户端公钥私钥
sshd 服务配置文件
参数 | 作用 |
---|---|
Port 22 | 默认的 sshd 服务端口 |
ListenAddress 0.0.0.0 | 设定 sshd 服务器监听的 IP 地址 |
Protocol 2 | SSH 协议的版本号 |
HostKey /etc/ssh/ssh_host_key | SSH 协议版本为 1 时,DES 私钥存放的位置 |
HostKey /etc/ssh/ssh_host_rsa_key | SSH 协议版本为 2 时,RSA 私钥存放的位置 |
HostKey /etc/ssh/ssh_host_dsa_key | SSH 协议版本为 2 时,DSA 私钥存放的位置 |
PermitRootLogin yes | 设定是否允许 root 管理员直接登录 |
StrictModes yes | 当远程用户的私钥改变时直接拒绝连接 |
MaxAuthTries 6 | 最大密码尝试次数 |
MaxSessions 10 | 最大终端数 |
PasswordAuthentication yes | 是否允许密码验证 |
PermitEmptyPasswords no | 是否允许空密码登录(很不安全) |
众所周知,加密方式有对称加密和非对称加密,这里用的是非对称。
书中写了ssh免密登录的流程,就是用了一个常说的认证模型
- 生成客户端的公钥和私钥
- 手动把客户端的公钥加到服务器上
- 往后客户端发送登录请求后,服务器用客户端公钥加密一个 随机数R 和 服务器公钥 形成密文发给客户端
- 客户端用私钥解密得到 随机数R 和 服务器公钥 ,用服务器的公钥加密R发给服务器
- 服务器用私钥解密密文得到 R,与刚开始的R进行比较,如果相同,完成整个认证
大致原理是如此,看上去整个过程中间人冒充拿不到秘钥和信息。
scp
命令
作用:两台linux主机进行文件传递(和cp作用很像,只不过这个能跨主机
本机传到目标主机:
scp [参数] 源文件绝对地址 目标ip:/绝对地址目录
目标主机传到本机:
scp [参数] 目标ip:/源文件绝对地址 本机绝对地址目录
参数 | 作用 |
---|---|
-v | 显示详细的连接进度 |
-P | 指定远程主机的 sshd 端口号 |
-r | 用于传送文件夹 |
-6 | 使用 IPv6 协议 |
第十章
Apache
由于我是菜鸟,用的是Ubuntu,httpd和apache2是一样的,但有些小不同
#安装apache
sudo apt install apache2
#输入
sudo service apache2
#它会给你一行选用的参数
#{start|stop|graceful-stop|restart|reload|force-reload}
#启动服务程序
sudo service apache2 start
#开机自启,systemctl命令是比较新
sudo systemctl enable apache2
如何验证?
在虚拟机上访问这个地址即可 http://127.0.0.1/
如何去查看Apache2的配置?
配置文件的名称 | 存放位置 |
---|---|
服务目录 | /etc/apache2 |
主配置文件 | /etc/apache2/apache2.conf |
网站根目录 | /var/www/html/ |
访问日志 | /var/log/apache2/access_log |
错误日志 | /var/log/apache2/error_log |
文件名 | 作用 |
---|---|
apache2.conf | 主配置文件,包含服务器上所有站点所需要的设置,在这个文件中可以设置日志系统的运行方式、主机名、默认端口等参数信息。 |
conf-available | 包含系统提供的 Apache 网站配置文件。 |
conf-enabled | 包含要在服务器上激活的 Apache 网站配置文件。通常,这些文件是符号链接。 |
envvars | 包含 Apache HTTP 服务器需要的环境变量。 |
magic | 该文件包含文件类型检测的默认规则。 |
mods-available | 包含apache2标准模块和扩展模块以及配置。 |
mods-enabled | 包含了已经启用的模块对应的符号链接。 |
ports.conf | 包含 Apache HTTP 服务器监听的所有端口。 |
sites-available | 包含所有可用的虚拟主机配置文件。 |
sites-enabled | 包含已启用的虚拟主机的符号链接。 |
不需要特别记,用到了就来查查,用多了就知道了。
我们想要做一个自己的网页,可以把html放置在/var/www/html/
目录文件下,将资源保存在某个目录方便管理。
建议说是 把这些html页面和资源 改成默认 www-data
用户和组,更加安全。
Apache默认以 www-data
用户访问资源和目录文件,如果没有足够权限就无法读取,这时候你可以在 /var/log/apache2/error_log
中查看问题所在。
#简单粗暴,直接把整个目录和文件改成 www-data 用户和组
sudo chown -R www-data:www-data /var/www/html
#至于权限?给个755就好了
另外假设你的主机有多个ip地址的话,想要不同的ip地址对应不同网站的话
可以选择在这个目录中操作 /etc/apache2/sites-available/
你会可以观察一下,该目录有一个 000-default.conf 文件,没错,就是虚拟主机的默认配置文件
你会发现其结构如下:
<VirtualHost *:80>
# *代表ip,80代表端口,意思是,以该ip和端口为目的地址的请求会进入如下配置
ServerAdmin webmaster@localhost #电子邮箱,这个是默认值
#ServerName 域名 必须真实存在
DocumentRoot /var/www/html #网站根目录
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
于是就可以:
#禁用虚拟主机文件指令
sudo a2dissite 000-default.conf
#启用虚拟主机文件指令
sudo a2ensite mytest.conf
#最后重启服务
sudo systemctl restart apache2
另外,如果你不小心乱搞了什么,很难受,想把服务器重置回某个状态…
一个方法是虚拟机的快照
另一个方法是卸了重装(血泪)
#卸载干干净净,/etc/www/html/ 不会被删的
sudo apt-get purge apache2
sudo rm -rf /etc/apache2
sudo rm /etc/apache2/sites-available/000-default.conf
sudo rm -rf /var/log/apache2