《Linux就该这么学》阅读笔记

前言:我从第三章开始做,这本书其实蛮适合现在的我,主要目的是查漏补缺

第三章

四个最常用的转义字符:

  1. 反斜杠(\ ):使反斜杠后面的一个变量变为单纯的字符串。
  2. 单引号(‘’):转义其中所有的变量为单纯的字符串。
  3. 双引号(“”):保留其中的变量属性,不进行转义处理。
  4. 反引号( ` `) :把其中的命令执行后返回结果。

管道符 |

口诀:前一个命令的输出后一个命令的输入

输入输出重定向

口诀是:输入输出错误流,分别对应:

数据流文件描述符
STDIN0
STDOUT1
STDERR2
这三个文件描述符是linux默认有的。
输入重定向
符号作用
命令 < 文件将文件作为命令的标准输入
命令 << 分界符从标准输入中读入,直到遇见分界符才停止
命令 < 文件 1 > 文件 2 将文件 1作为命令的标准输入并将标准输出到文件2
输出重定向
符号作用
命令 > 文件将标准输出重定向到一个文件中(清空原有文件的数据)
命令 2> 文件将错误输出重定向到一个文件中(清空原有文件的数据)
命令 >> 文件将标准输出重定向到一个文件中(追加到原有内容的后面)
命令 2>> 文件将错误输出重定向到一个文件中(追加到原有内容的后面)
命令 >> 文件 2>&1 或 命令 &>> 文件将标准输出与错误输出共同写入到文件中(追加到原有内容的 后面)

用户执行一条命令后,解释器所做的事情

  1. 判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是的话 则直接执行。
  2. Linux 系统检查用户输入的命令是否为“别名命令”,即用一个自定义的命令 名称来替换原本的命令名称。
  3. Bash 解释器判断用户输入的是内部命令还是外部命令。
  4. 系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作 PATH。

Linux 系统中最重要的 10 个环境变量

变量名称作用
HOME 用户的主目录(即家目录)
SHELL用户在使用的 Shell 解释器名称
HISTSIZE输出的历史命令记录条数
HISTFILESIZE保存的历史命令记录条数
MAIL邮件保存路径
LANG 系统语言、语系名称
RANDOM生成一个随机数字
PS1Bash 解释器的提示符
PATH定义解释器搜索用户执行命令的路径
EDITOR 用户默认的文本编辑器

普通变量只需要选一个变量名(说是最好全大写),再用=赋值就好了,别乱加空格。
另外,普通变量的生命周期与终端一样,我把终端关了,再打开一个终端变量就没了。

变量是可以自定义的,但是默认是局部的,即别用户无法使用,但是可以用export 命令将其提升为全局变量,这样其他用户也就可以使用它了。

第四章

  • vim
    我个人还是蛮喜欢用vim的,直接解放双手,很推荐去专门练一手vim,可以花点点时间去研究对应的插件,基础好+熟练效率真的可以完爆IDE。
    vim的模式其实分4个模式
    1. 正常模式,可以进行正常的文本编辑
    2. 插入模式,对应书中输入模式
    3. 视图模式,可以光标行或列选取
    4. Ex模式,即命令模式,对应书中末行模式

这些其实非常简单,花个两天玩一下,熟悉一下vim的快捷键和常用命令,如:复制粘贴,行尾字符删、撤回、复制粘贴、光标定位和移动、字符替换。就是书中收集的这些,配合若干个C语言的小项目,有哪里不熟悉就练哪里。可定制是vim最大亮点,可以去GitHub找一下别人的vim配置(文件在~主目录上.vimrc),下几个好用的插件,定制自己的代码编辑器。

  • ifconfig 查询主机网络信息
  • ping ip地址 查询网络连接

Shell 脚本

  • 交互式(Interactive):用户每输入一条命令就立即执行。
  • 批处理(Batch):由用户事先编写好一个完整的 Shell 脚本,Shell 会一次性执行脚本 中诸多的命令。
  • ps:很好理解,脚本程序需要一个解释程序来执行程序,linux默认是bash,该解释程序会逐行解释程序中的每条命令,省去了编译的过程。

linux的shell脚本以.sh为文件扩展名(约定俗称)。(可以用#!指定解释器)用vim在文件里面输入一些命令。
使用方法:

  1. 终端相对路径和绝对路径执行文件(需要文件有可执行权限)
  2. 用bash 文件名路径 或 sh 文件名路径 (不需要可执行权限)

这些可执行文件,我们是可以灵活调整输入参数的。(我们平时编程main函数入口,有个args[]参数作为命令输入,args[0]、args[1]…来自定义参数,这里也可以这么理解。)

  1. $0 脚本程序名称
  2. $# 对应参数个数
  3. $* 对应所有的参数值
  4. $? 对应的是显示上一次命令的执行返回值
  5. $数字 对应 $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每一行
    分 时 日 月 周 命令
    1. 命令中必须使用绝对路径
    2. “分”字段必须有数值,绝对不能为空或是*号
    3. “日”和“周”字段不能同时使用,否则就会发生冲突。

第五章

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/sbinLinux 系统开机时不会使用到的软件/命令/脚本
/usr/share帮助与说明文件,也可放置共享文件
/var主要存放经常变化的文件,如日志
/lost+found当文件系统发生错误时,将一些丢失的文件片段存放在这里

(汗,书中总结了很多,我全搬过来了,能记一点是一点)

常用命令

mount 挂载命令
参数作用
-a挂载所有在/etc/fstab 中定义的文件系统
-t指定文件系统的类型

但是这个命令的挂载是临时的,重启之后依然需要重新挂载,我记得我以前搞了一次装在 U盘 的迷你linux系统,折腾了好几天才搞明白。

  1. 打开文件: vim /etc/fstab
  2. 设备文件 挂载目录 格式类型 权限选项 自检 优先级

我找了一下我的这个文件,发现是这样的:(-_-!汗)
/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在规则链的末尾加入新规则
-Inum 在规则链的头部加入新规则
-Dnum 删除某一条规则
-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 2SSH 协议的版本号
HostKey /etc/ssh/ssh_host_keySSH 协议版本为 1 时,DES 私钥存放的位置
HostKey /etc/ssh/ssh_host_rsa_keySSH 协议版本为 2 时,RSA 私钥存放的位置
HostKey /etc/ssh/ssh_host_dsa_keySSH 协议版本为 2 时,DSA 私钥存放的位置
PermitRootLogin yes设定是否允许 root 管理员直接登录
StrictModes yes当远程用户的私钥改变时直接拒绝连接
MaxAuthTries 6最大密码尝试次数
MaxSessions 10最大终端数
PasswordAuthentication yes是否允许密码验证
PermitEmptyPasswords no是否允许空密码登录(很不安全)

众所周知,加密方式有对称加密和非对称加密,这里用的是非对称。
书中写了ssh免密登录的流程,就是用了一个常说的认证模型

  1. 生成客户端的公钥和私钥
  2. 手动把客户端的公钥加到服务器上
  3. 往后客户端发送登录请求后,服务器用客户端公钥加密一个 随机数R服务器公钥 形成密文发给客户端
  4. 客户端用私钥解密得到 随机数R服务器公钥 ,用服务器的公钥加密R发给服务器
  5. 服务器用私钥解密密文得到 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值