模糊 發表於 2021-9-30 16:18:00

WSL-ubuntu常用操作

<h2 id="1基础">1,基础</h2>
<h3 id="1-1安装与卸载">1-1,安装与卸载</h3>
<ul>
<li><mark>wsl2.0</mark>
<ul>
<li>win10如何开启自带的虚拟机(bios也需要设置)</li>
<li>旧版 WSL 的手动安装步骤</li>
<li>设置 WSL 开发环境的最佳做法</li>
<li>排查适用于 Linux 的 Windows 子系统问题</li>
</ul>
</li>
<li>应用商店-<mark>ubuntu</mark>/mnt 为windows文件系统(挂载)</li>
<li><mark>docker desktop</mark></li>
<li>docker desktop settings/resource/WSL INTEGRATION/UBUNTU可以在子系统中共享docker</li>
<li>How to Fix Docker Permission Denied Error on Ubuntu</li>
<li>应用商店-<mark>windows terminal</mark></li>
</ul>
<h3 id="1-2常用命令">1-2,常用命令</h3>
<pre><code class="language-cmd">du -h --max-depth=1    查看当前路径下各文件夹的大小
lsof -i:端口号               查看端口占用
</code></pre>
<pre><code class="language-cmd">help
man
ping

whereis    查询文件的位置
which      在 PATH 变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果
file       查看文件的类型
who      查看当前在线的用户
whoami   当前用户
pwd      当前工作目录
uname -a   查看内核信息
echo       打印语句(&gt;&gt;输出到文件)
clear      清屏
history    历史
wget       从网络链接下载文件
curl      进行http请求
dd          制作镜像
mount /dev/*** /mnt挂载设备
df -h   查看磁盘使用情况
time       统计命令运行耗时

tar -zvcf *** *** 压缩(-c打包,-f指定文件名,-z".tar.gz"格式压缩,-j".tar.bz2"格式压缩,-v显示过程)
tar -zvxf *** -C ***   解压缩(-x解包,-C指定解包目录)
zip -r myfile.zip ./*
unzip -d 指定目录 ***.zip
unzip解压缩zip文件

hostname 主机名
hostname *** 临时修改主机名
hostnamectl set-hostname *** 永久更改主机名

ulimit -a   查看系统参数限制(最大进程数等)

free -m 看内存
df -h看磁盘
top看cpu和内存
lsof -i:3306看端口占用
</code></pre>
<h3 id="1-3特殊字符">1-3,特殊字符</h3>
<ul>
<li>.
<ul>
<li>如果在文件的开始,说明是个隐藏文件(ls -a)</li>
<li>.指向当前目录</li>
<li>..指向上一层目录</li>
</ul>
</li>
<li>$
<ul>
<li>说明后面跟着的是一个变量,变量是一个指针,$是取指针的值
<ul>
<li>$PATH 系统的环境变量</li>
</ul>
</li>
</ul>
</li>
<li>
<ul>
<li></li>
<li>通配符</li>
</ul>
</li>
<li>~
<ul>
<li>当前用户的家目录
<ul>
<li>每个用户的家目录是不同的</li>
<li>root用户家目录在系统根目录下</li>
<li>其他用户的家目录以/home/用户名为家目录</li>
</ul>
</li>
</ul>
</li>
<li>空格
<ul>
<li>linux命令与参数用空格隔开</li>
</ul>
</li>
<li>/
<ul>
<li>这个linux的文件根目录</li>
</ul>
</li>
<li>命令的参数
<ul>
<li>如果是单词一般加--</li>
<li>如果是字母或缩写一般加-</li>
</ul>
</li>
</ul>
<h2 id="2系统操作">2,系统操作</h2>
<h3 id="2-1文件系统命令">2-1,文件系统命令</h3>
<pre><code class="language-cmd">=========================================目录操作=========================================
cd      切换目录
ll ls   显示当前指定目录下的所有文件(开头-普通文件,d文件夹,l软连接|快捷方式)
mkdir   创建目录
mkdir -p自动创建父目录(后面可以跟上{}一次创建多个目录,中间用,隔开)
rmdir   删除空目录(比较安全,比rm -rf强。。。)

=========================================文件操作=========================================
cp 源文件 目标路径            拷贝一个文件
cp -r 源文件夹 目标路径       拷贝一个文件夹
cp -r 源文件夹* 目标路径      拷贝一个文件夹下的所有文件

mv 源文件 目标路径            移动(剪切)一个文件
mv 源文件夹 目标路径          移动(剪切)一个文件夹
mv 源文件夹* 目标路径         移动(剪切)一个文件夹下的所有文件
mv 原文件名字 目标文件名字   修改文件名字

rm 文件                      删除文件
rm -f 文件                   强制删除文件
rm -r 文件夹               删除文件夹
rm -rf /*                  终极命令

touch 文件                   创建文件(如果有了文件,修改元数据信息中的Access(何时有人访问)、Modify(何时改变了内容)、Change(何时改变了元数据/属性信息)三个时间)
stat 文件                  查看文件的元数据信息

ln 目标文件 链接名            创建硬链接指向目标文件(ll类型开头为-)
ln existingfile newfile(sexistingfile 待建立链接文件的文件,newfile是新创建的链接文件)
ln existingfile-list directory
-f 建立时,将同档案名删除.无论”newfile”存在与否,都创建链接
-i 删除前进行询问
-n 如果”newfile”已存在,就不创建链接。
ln -s 目标文件 链接名         创建链接(软链接)指向目标文件(相当于快捷方式)(ll的时候,类型开头为l,并且后有表示指向谁)
软链接指向的文件被删除,slink就废了,hlink还在;并且修改hlink的值,目标文件以及slink的值也会做相应的修改。(硬链接可以用来保护文件不被删除)

cat 文件                      查看文件的内容(正序完全加载)
tac 文件                      倒序完全加载文件内容
more 文件                     正序加载整屏的文件内容,回车一行行向下加载,b一行行向前,空格一页页向下加载,h会给出提示信息,q退出
less 文件                     与more类似,但h会发现多了一些命令
head -number 文件             取文件的前number行
tail -number 文件             取文件的后number行
head -number 文件 | tail -1   通过管道取文件的第number行
tail -f/-F 文件               监控正在改变的文件(如果是-f,监听指定inode的文件,但如果文件被删除,即使重新创建,inode也会发生变化从而监听失败;如果是-F,则监听指定名字的文件,如果文件被删除并重新创建,则会继续监听新创建的重名文件)

find 搜索范围(如/) -name 目标文件   范围搜索文件的位置
find . -maxdepth 1 -name ***      在当前目录层级搜寻目标***
</code></pre>
<h3 id="2-2vi编辑器">2-2,vi编辑器</h3>
<pre><code class="language-cmd">=========================================vi编辑器=========================================
* vi 文件名                vi打开文件
* vi +8 文件名             vi打开文件并定位到第8行
* vi + 文件名            vi打开文件并定位到最后一行
* vi +/指定搜索单词 文件名vi打开文件并定位到指定搜索单词

=========================================vi编辑器三模式=========================================
* 编辑模式按ESC进入可使用各种快捷键(编辑模式中每一个按键都是快捷键)
* 输入模式按i进入向文本中输入内容
* 末行/命令行模式按:进入不属于文件内容,可以保存退出等,执行一些特定的命令

=========================================三模式的切换=========================================
* vi打开文件进入编辑模式
* 编辑模式下按i进入输入模式(i插入,a追加,I行首,A行尾,o下一行,O上一行)
* 输入模式按ESC进入编辑模式
* 编辑模式按:进入命令行模式
* 命令行模式按ESC进入编辑模式

=========================================编辑模式=========================================
* G 最后一行
* gg 第一行(数字gg 跳转到数字行)
* w 下个单词(数字w)
* dw 删除一个单词(数字dw)
* dd 删除一行(数字dd)
* u 回退到前面的操作(. 撤销u的操作)
* yw 复制一个单词(数字yw)
* yy 复制一行(数字yy)
* x 剪切(数字x)
* p 粘贴(数字p)
* r 替换目标,然后输入一个字符替换(数字r)
* hjkl 方向键            
* shift 6行首
* shift 4行尾
* pageup pagedown一页的最上和最下
* shift zz 保存并退出(ZZ)
* ctrl s锁屏      strl q解锁

=========================================输入模式=========================================
* 输入啥是啥

=========================================命令行模式=========================================
* wq          保存并退出
* w         保存
* q         退出
* q!          强制退出
* set nu      显示行号
* set nonu    隐藏行号
* /查找的目标查找
* s/p1/p2   用p2替换p1,一次替换一个
* s/p1/p2/g   将当前行所有的p1替换为p2
* g/p1/s//p2/g    所有p1替换为p2
</code></pre>
<h3 id="2-3用户用户组权限">2-3,用户、用户组、权限</h3>
<h4 id="2-3-1用户">2-3-1,用户</h4>
<pre><code class="language-cmd">新增用户
useradd ***
会创建同名的组和家目录
设置密码
passwd ***
切换用户
su ***
删除用户
userdel -r ***
级联删除家目录和组
修改用户信息
usermod -l *** *** (修改用户名,家目录和组信息不会被修改)
usermod -L *** (锁定用户名)
usermod -U *** (解锁用户名)
常用文件
cat /etc/shadow (用户名和密码)
cat /etc/passwd (用户名、用户编号、组编号、家目录、所用bash)
</code></pre>
<h4 id="2-3-2用户组">2-3-2,用户组</h4>
<pre><code class="language-cmd">创建组
groupadd ***
删除组
groupdel ***
修改组信息
groupmod -n *** ***
查看用户对应的组
groups (当前用户所在的组)
groups *** (当创建用户的时候,默认创建一个与同名的主组)
修改用户的组
usermod -g(主组) ***(用户名) ***(组名)
usermod -G(附属组) ***(组名) ***(用户名)
</code></pre>
<h4 id="2-3-3权限">2-3-3,权限</h4>
<pre><code class="language-cmd">三组权限(UGO模型:文件所有者,文件所属组,其他用户),每组三个字母
r/4:读权限
w/2:写权限
x/1:执行权限
-:没有权限
修改文件权限方法1:修改文件所属
chown ***(用户) ***(目标文件)            修改文件所有者
修改文件权限方法2:修改文件的rwx
chmod u/g/o +/- r/w/x ***(目标文件)       增添或删减ugo对应的权限
chmod o=rw ***(目标文件)                  修改ugo对应的权限
</code></pre>
<pre><code class="language-cmd">facl:文件访问控制列表,权限控制更加灵活
getfacl ***
查看***文件的权限信息
setfacl -m u:用户名/g:用户组名:权限 文件名
赋予权限
例如:setfacl -m u:user1:r afile      setfacl -m u:user2:rw afile
setfacl -x
收回权限
</code></pre>
<h2 id="3系统管理">3,系统管理</h2>
<h3 id="3-1网络管理">3-1,网络管理</h3>
<h4 id="3-1-1网络状态查看net-toolsiptoute2网络接口命名修改">3-1-1,网络状态查看(net-tools,iptoute2,网络接口命名修改)</h4>
<pre><code class="language-cmd">1, net-tools(centos7前的工具包)
* ifconfig
* route [-n]
* netstat
2, iproute2(centos7及之后主推的工具包)
* ip
* ss
3,网络接口命名修改
* 网卡命名受biosedvname和net.ifnames两个参数影响
    biosedvname=0, net.ifnames=0, 网卡名=eth0
    biosedvname=0, net.ifnames=1, 网卡名=ens33
    biosedvname=1, net.ifnames=0, 网卡名=em1
* 编辑 /etc/default/grub 文件,增加 biosedvname=0, net.ifnames=0
* 更新grub
    grub2-mkconfig -o /boot/grub2/grub.cfg
* 重启
    reboot
</code></pre>
<h4 id="3-1-2网络配置">3-1-2,网络配置</h4>
<pre><code class="language-cmd">1,接口/网卡配置
* ifconfig &lt;接口/网卡&gt; &lt;ip地址&gt;
* ifup &lt;接口/网卡&gt;    (启用接口/网卡)
* ifdown&lt;接口/网卡&gt;    (关闭接口/网卡)
2,网关配置
* 添加网关
    * route add default gw &lt;网关ip&gt;
    * route add &lt;指定ip&gt; gw &lt;网关ip&gt;
    * route add -host &lt;指定ip&gt; gw &lt;网关ip&gt;      (明细路由)
    * route add -net &lt;指定网段&gt; netmask &lt;子网掩码&gt; gw &lt;网关ip&gt;      (明细路由)
* 删除网关
    * route del &lt;destination/指定ip&gt; gw &lt;网关ip&gt;
3,以上命令与ip的对应
</code></pre>
<h4 id="3-1-3网络故障排除ping-traceroute-mtr-nslookup-telnet-tcpdump-netstat-ss">3-1-3,网络故障排除(ping, traceroute, mtr, nslookup, telnet, tcpdump, netstat, ss)</h4>
<pre><code class="language-cmd">ping
* 检测和目标主机是否畅通
* ping 域名/ip
traceroute
* 追踪到目标主机的每一跳
* traceroute 域名/ip
mtr
* 检查和目标主机之间是否有数据包丢失
* mtr 域名/ip
nslookup
* 查看目标主机域名对应的ip
* nslookup 域名
telnet
* 检查端口的连接状态
* telnet 域名/ip 端口号
tcpdump
* 更细致的分析数据包,网络抓包
* tcpdump -i any -n host ip号 and port 端口号 -w 要保存的文件名称
netstat
* 查看服务的监听地址
* netstat -ntpl(不解析域名,tcp,显示进程号,监听)
ss
* 查看服务的监听地址
* ss -ntpl
</code></pre>
<h4 id="3-1-4网络配置文件">3-1-4,网络配置文件</h4>
<pre><code class="language-cmd">网络服务管理程序分为两种,分别为SysV和systemd
* service network status|start|stop|restart
* chkconfig --list network
* chkconfig --level ???(2345) network on|off
* systemctl list-unit-files NetworkManager.service
* systemctl start|stop|restart NetworkManager
* systemctl enable|disable NetworkManager
网络配置文件
* ifcfg-eth0
* /etc/hosts
</code></pre>
<p>System has not been booted with systemd as init system (PID 1). Can't operate.</p>
<h3 id="3-2系统进程管理">3-2,系统进程管理</h3>
<h4 id="3-2-1进程信息ps-pstree-top">3-2-1,进程信息(ps, pstree, top)</h4>
<pre><code class="language-cmd">ps -ef
* UID PID PPID C STIME TTY TIME CMD
* UID:所属用户
* PID:进程编号
* PPID:当前进程编号的父进程编号
ps -ef | grep ***
查看特定进程的信息
ps -eLf
显示线程信息
ps -aux
包含CPU和内存使用率
ps -aux --sort -p***(pid cpu ...)
按***排序显示
pstree
查看进程的树形结构
top
实时显示内存使用率
* PR 系统优先级
* NI 进程的nice值,进程的优先级
top -p PID
查看某一特定进程
ll /proc
进程在linux中都对应一个文件,就是这里的文件
kill -9 PID
杀死某进程,对应的/proc中的文件也被删除
ps -ef |grep ***| awk'{print $2}'| xargs kill -9
awk'{print $2}'指第二列的内容,是运行的程序ID;可以通过xargs将ID传递给kill -9,让其关闭
</code></pre>
<h4 id="3-2-2进程控制nicerenice-jobsfg-bg-ctrlz">3-2-2,进程控制(nice,renice,&amp;, jobs,fg, bg, ctrl+z)</h4>
<pre><code class="language-cmd">1,调整优先级
* nice 范围从-20到19,值越小优先级越高,抢占资源越多,对未启动的程序设置优先级再启动运行
   nice -n 优先级-20到19 程序名
* renice 重新设置优先级,修改正在运行的进程的优先级
   renice -n 优先级-20到19 PID
2,进程的作业控制
* &amp;符号
在命令后面添加 &amp;,进程会以后台进程的方式启动
* nohup 命令 &amp;
nohup可以防止后台进程被挂起(关闭终端,程序依然运行;nohup忽略输入并把输出追加到"nohup.out")
* jobs -l
可以获取当前的后台信息,但只有当前用户界面可以获取到
* fg jobs中的编号
将后台进程调度为前台进程
* ctrl z
将前台进程以stopped形式调度到后台,常用于临时停止进行磁盘备份
* bg jobs中的编号
将停止的进程以后台方式运行
</code></pre>
<h4 id="3-2-3程序运行的第三种方式服务">3-2-3,程序运行的第三种方式:服务</h4>
<ul>
<li>三种方式:前台、后台、服务</li>
<li>Linux中的服务一般都是常见的,一直在运行的命令,其独立于控制终端,不受前台和终端的控制,在后台周期性地执行某种任务或等待处理某些发生的事件。运行服务的进程通常被成为后台进程(守护进程)。服务由service启动,并配置。使用上通常由systemctl命令进行控制。</li>
<li>服务(service) 本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如(mysql , sshd 防火墙iptables等),因此我们又称为守护进程,是 Linux 中非常重要的知识点。</li>
<li>之所以可以成为服务并且能够开机启动,是因为
<ul>
<li>在ubuntu中,/lib/systemd/system目录下会创建一个XXX.service配置文件,里面定义了如何启动、如何关闭</li>
<li>在CentOS中,/usr/lib/systemd/system目录下目录下会创建一个XXX.service配置文件,从而成为一个服务</li>
</ul>
</li>
<li>服务(提供常见功能的守护进程)集中管理工具:
<ul>
<li>service</li>
<li>systemctl</li>
</ul>
</li>
</ul>
<pre><code class="language-cmd">systemctl status|start|stop|restart|reload|enable|disable 服务名称(***.service)
systemctl start ***
启动服务
systemctl enable ***
设置开机启动
</code></pre>
<h4 id="3-2-4进程间通信">3-2-4,进程间通信</h4>
<ul>
<li>信号是进程间通信方式之一,典型用法是:终端用户输入中断指令,通过信号机制停止一个程序的运行。</li>
</ul>
<pre><code class="language-cmd">kill -l         查看所有可支持的信号(1-64)
ctrl+c          使用kill的2号信号,SIGINT
kill -9 PID    使用9号信号,SIGKILL
</code></pre>
<h3 id="3-3软件安装">3-3,软件安装</h3>
<h4 id="3-3-1环境变量">3-3-1,环境变量</h4>
<pre><code class="language-cmd">当执行一个命令的时候,默认从当前路径开始查找;
如果当前命令找不到对应的命令文件,从环境变量$PATH查找
$PATH配置文件在 /etc/profile(不能cd,只能vi,这是一个文件)(安装软件后配置环境变量也是修改该文件)
windows路径与路径之间用;(分号)连接,linux路径与路径之间用:(冒号)连接
linux每次修改完成之后,需要重新加载文件 source/etc/profile
</code></pre>
<h4 id="3-3-2安装的方式软件包安装解压包安装源码编译包管理平台">3-3-2,安装的方式(软件包安装、解压包安装、源码编译、包管理平台)</h4>
<ul>
<li>软件包安装(Ubuntu的软件包格式是deb,centos的软件包格式是rpm,可以用用alien把rpm转换成deb)(dpkg(ubuntu)、rpm(centos))
<ul>
<li>查看安装了哪些软件:rpm -qa    dpkg -l</li>
<li>删除软件:rpm -edpkg -r</li>
</ul>
</li>
<li>解压包安装(比如tomcat)</li>
<li>源码编译安装
<ul>
<li>下载压缩包,解压缩,进入解压后目录</li>
<li>./configure --prefix = /usr/local/***      指定安装位置(生成makefile)</li>
<li>make -j2                                             用2个逻辑cpu进行编译(生成build)(查看cpu个数:lscpu)</li>
<li>make install                                       将编译好的软件安装到指定目录</li>
</ul>
</li>
<li>借助包管理平台安装(pip(python)、apt(ubuntu)、yum(centos)、360、腾讯管家)
<ul>
<li>centos的源配置文件:/etc/yum.repos.d/CentOS-Base.repo</li>
<li>ubuntu的源配置文件:/etc/apt/sources.list</li>
</ul>
</li>
</ul>
<h4 id="3-3-3使用dpkg进行软件包安装">3-3-3,使用dpkg进行软件包安装</h4>
<ul>
<li>deb是debian linux的安装格式,跟red hat的rpm非常相似,最基本的安装命令是:dpkg -i file.deb</li>
</ul>
<h4 id="3-3-4使用apt-getapt进行包管理平台安装">3-3-4,使用apt-get/apt进行包管理平台安装</h4>
<table>
<thead>
<tr>
<th>操作</th>
<th>Centos</th>
<th>Ubuntu</th>
</tr>
</thead>
<tbody>
<tr>
<td>软件源配置文件</td>
<td>/etc/yum.conf</td>
<td>/etc/apt/sources.list</td>
</tr>
<tr>
<td>安装软件包</td>
<td>yum install package</td>
<td>apt-get install package</td>
</tr>
<tr>
<td>删除软件包</td>
<td>yum uninstall package</td>
<td>apt-get remove package</td>
</tr>
<tr>
<td>删除有依赖关系软件包和配置文件</td>
<td>yum uninstall package</td>
<td>apt-get autoremove package --purge</td>
</tr>
<tr>
<td>查看安装包</td>
<td>yum info package</td>
<td>apt-cache show package</td>
</tr>
<tr>
<td>查看已安装的软件</td>
<td>yum info package</td>
<td>apt-get install package 或 dpkg -s package</td>
</tr>
<tr>
<td>更新软件包列表</td>
<td>yum update</td>
<td>apt-get update</td>
</tr>
<tr>
<td>清除缓存</td>
<td>yum clean</td>
<td>apt-get clean</td>
</tr>
</tbody>
</table>
<ul>
<li>Ubuntu中apt与apt-get命令的区别
<ul>
<li>最常用的 Linux 包管理命令都被分散在了 apt-get、apt-cache 和 apt-config 这三条命令当中。</li>
<li>apt 命令的引入就是为了解决命令过于分散的问题,它包括了 apt-get 命令出现以来使用最广泛的功能选项,以及 apt-cache 和 apt-config 命令中很少用到的功能。</li>
<li>虽然 apt 与 apt-get 有一些类似的命令选项,但它并不能完全向下兼容 apt-get 命令。</li>
<li>作为一个常规 Linux 用户,系统极客建议大家尽快适应并开始首先使用 apt。不仅因为广大 Linux 发行商都在推荐 apt,更主要的还是它提供了 Linux 包管理的必要选项。 最重要的是,apt 命令选项更少更易记,因此也更易用,所以没理由继续坚持 apt-get。</li>
<li>目前还没有任何 Linux 发行版官方放出 apt-get 将被停用的消息,至少它还有比 apt 更多、更细化的操作功能。对于低级操作,仍然需要 apt-get。</li>
</ul>
</li>
</ul>
<table>
<thead>
<tr>
<th>apt 命令</th>
<th>取代的命令</th>
<th>命令的功能</th>
</tr>
</thead>
<tbody>
<tr>
<td>apt install</td>
<td>apt-get install</td>
<td>安装软件包</td>
</tr>
<tr>
<td>apt remove</td>
<td>apt-get remove</td>
<td>移除软件包</td>
</tr>
<tr>
<td>apt purge</td>
<td>apt-get purge</td>
<td>移除软件包及配置文件</td>
</tr>
<tr>
<td>apt update</td>
<td>apt-get update</td>
<td>刷新存储库索引</td>
</tr>
<tr>
<td>apt upgrade</td>
<td>apt-get upgrade</td>
<td>升级所有可升级的软件包</td>
</tr>
<tr>
<td>apt autoremove</td>
<td>apt-get autoremove</td>
<td>自动删除不需要的包</td>
</tr>
<tr>
<td>apt full-upgrade</td>
<td>apt-get dist-upgrade</td>
<td>在升级软件包时自动处理依赖关系</td>
</tr>
<tr>
<td>apt search</td>
<td>apt-cache search</td>
<td>搜索应用程序</td>
</tr>
<tr>
<td>apt show</td>
<td>apt-cache show</td>
<td>显示安装细节</td>
</tr>
</tbody>
</table>
<ul>
<li>当然,apt 还有一些自己的命令:</li>
</ul>
<table>
<thead>
<tr>
<th>新的apt命令</th>
<th>命令的功能</th>
</tr>
</thead>
<tbody>
<tr>
<td>apt list</td>
<td>列出包含条件的包(已安装,可升级等)</td>
</tr>
<tr>
<td>apt edit-sources</td>
<td>编辑源列表</td>
</tr>
</tbody>
</table>
<ul>
<li>阿里源</li>
<li>wsl换源</li>
</ul>
<h4 id="3-3-5内核升级">3-3-5,内核升级</h4>
<pre><code class="language-cmd">* apt格式安装
* uname -r                         查看内核版本
* apt install kernel-*****      升级内核版本
* apt update                     升级已安装的其他软件包和补丁
* 源码编译安装
* 内核源码地址:www.kernel.org
* 解压缩,进入解压缩后的目录
* 配置内核编译参数
    * make menuconfig | allyesconfig | allnoconfig
    * 使用当前系统内核配置 cp /boot/config-kernelversion.platform 解压缩后的目录/.config
* 查看cpu
    * lscpu
* 编译
    * make -j2 all
* 安装
    * make modules_install      (安装支持内核模块)
    * make install                     (安装内核)
</code></pre>
<h3 id="3-4内存与磁盘管理">3-4,内存与磁盘管理</h3>
<h4 id="3-4-1使用率查看命令">3-4-1,使用率查看命令</h4>
<ul>
<li>内存
<ul>
<li>free [-m -g]</li>
<li>top</li>
</ul>
</li>
<li>磁盘
<ul>
<li>fdisk 可查看,可分区
<ul>
<li>fdisk -l</li>
</ul>
</li>
<li>df [-h]</li>
<li>du
<ul>
<li>du与ls的区别:du -h显示文件实际大小;ls -lh显示文件虚拟化的大小(空洞文件);du实际统计数据块数目(1个数据块固定为4k);ls读取i节点信息 ls-li</li>
<li>空洞文件</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="3-4-2文件系统管理">3-4-2,文件系统管理</h4>
<ul>
<li>linux支持多种文件系统,常见的有:
<ul>
<li>ext4</li>
<li>xfs</li>
<li>NTFS(Windows文件系统,linux支持需要安装额外软件)</li>
</ul>
</li>
<li>ext4文件系统基本结构
<ul>
<li>超级块</li>
<li>超级块副本</li>
<li>i节点(inode):记录数据元信息</li>
<li>数据块(datablock):存储数据</li>
<li>Linux 虚拟文件系统四大对象:超级块、inode、dentry、file之间关系</li>
</ul>
</li>
</ul>
<h4 id="3-4-3磁盘分区与挂载fdisk创建分区mkfs格式化分区挂载">3-4-3,磁盘分区与挂载(fdisk创建分区,mkfs格式化分区,挂载)</h4>
<ul>
<li>挂载的作用
<ul>
<li>linux操作系统将所有的设备都看作文件,它将整个计算机的资源都整合成一个大的文件目录。我们要访问存储设备中的文件,必须将文件所在的分区挂载到一个已存在的目录上,然后通过访问这个目录来访问存储设备。挂载就是把设备放在一个目录下,让系统知道怎么管理这个设备里的文件,了解这个存储设备的可读写特性之类的过程,访问这个目录就是访问该存储设备。</li>
<li>插入了新硬盘会会获得/dev/sdb1 吗,直接对它操作不就行了?这不是它的目录吗?这不是它的目录。虽然/dev是个目录,但/dev/sdb1不是目录。可以发现ls/dev/sdb1无法执行。/dev/sdb1,是一个类似指针的东西,指向这个分区的原始数据块。mount前,系统并不知道这个数据块哪部分数据代表文件,如何对它们操作。</li>
<li>插入CD,系统其实自动执行了 mount /dev/cdrom /media/cdrom。所以可以直接在/media/cdrom中对CD中的内容进行管理。</li>
</ul>
</li>
<li>常用命令
<ul>
<li>fdisk
<ul>
<li>创建分区</li>
<li>fdisk -l    查看都有哪些硬盘</li>
<li>fdisk 硬盘(/dev/sda)    硬盘操作交互界面    m查看帮助    n创建新分区    p主分区    e扩展分区。。。根据交互提示进行操作q退出 w写入d删除分区</li>
</ul>
</li>
<li>mkfs
<ul>
<li>分区映射(格式化),操作时确保硬盘中无数据。</li>
<li>mkfs[.ext4等文件系统] 分区名称</li>
</ul>
</li>
<li>mount
<ul>
<li>将设备挂载到目录,这样对目录的操作就相当于对设备操作</li>
<li>mount 分区 目录(一般在/mnt创建目录)</li>
</ul>
</li>
<li>parted
<ul>
<li>如果硬盘大于2T,无法用fdisk分区,需要用parted分区</li>
</ul>
</li>
</ul>
</li>
<li>常见配置文件
<ul>
<li>/etc/fstab</li>
</ul>
</li>
</ul>
<h4 id="3-4-4用户磁盘配额">3-4-4,用户磁盘配额</h4>
<ul>
<li>xfs文件系统的用户磁盘配额 quota</li>
</ul>
<pre><code class="language-cmd">fdisk创建分区
mkfs.xfs /dev/sdb1
mkdir /mnt/disk1
mount -o uquota, gquota /dev/sdb1 /mnt/disk1          #支持用户磁盘配额和组磁盘配额进行挂载
chmod 1777 /mnt/disk1
xfs_quota -x -c 'report -ugibh' /mnt/disk1                  #查看用户、组的节点、数据块的配额信息,h表示详细显示
xfs_quota -x -c 'limit -u isoft=5 ihard=10 user1' /mnt/disk1      #限制用户磁盘配额,soft限制可以短期超限(report中会有宽限时间),hard限制一定不可以超过,i为链接,b为数据块
</code></pre>
<ul>
<li>进一步可以学习使用虚拟化技术限制cpu使用、内存使用、硬盘使用等</li>
</ul>
<h4 id="3-4-5交换分区swap的查看和创建">3-4-5,交换分区swap的查看和创建</h4>
<ul>
<li>swap:虚拟内存</li>
<li>free -m</li>
<li>使用硬盘分区增加swap的大小</li>
</ul>
<pre><code class="language-cmd">对磁盘分区
mkswap 分区名          对分区进行swap格式化(类似于mkfs)
swapon分区名          swap挂载使用(类似于mount)
swapoff 分区名          关闭swap挂载
</code></pre>
<ul>
<li>使用文件制作交换分区</li>
</ul>
<pre><code class="language-cmd">dd if=/dev/zero bs=4M count=1024 of=/swapfile            创建4M*1024大小的文件
mkswap /swapfile                                                          (有时会报错要求修改600权限,chmod 600 /swapfile)
swapon /swapfile
</code></pre>
<ul>
<li>为了使swap分区修改永久生效,需要修改/etc/fstab文件<br>
/etc/fstab文件中写入</li>
</ul>
<pre><code class="language-cmd">/swapfile swap swap defaults 0 0
(要挂载的分区挂载到哪 文件系统类型 权限 备份时要不要备份这块分区 磁盘自检的顺序)
</code></pre>
<h4 id="3-4-6磁盘阵列raid与软件raid技术">3-4-6,磁盘阵列RAID与软件RAID技术</h4>
<ul>
<li>RAID的常见级别及含义
<ul>
<li>RAID 0 stiping            条带方式,提高单盘吞吐率(最少两块)</li>
<li>RAID 1 mirroring         镜像方式,提高可靠性(最少两块)</li>
<li>RAID 5                     有奇偶校验(最少三块)</li>
<li>RAID 10                     是RAID1与RAID0的结合(最少四块)</li>
</ul>
</li>
<li>硬件RAID:RAID卡</li>
<li>软件RAID(大量读写时比较耗CPU):mdadm</li>
</ul>
<pre><code class="language-cmd">创建并使用RAID
fdisk创建多块分区(比如/dev/sdb1, /dev/sdc1, /dev/sdd1)
mdadm -C /dev/md0(磁盘阵列分区) -a yes -l1(RAID1级别) -n2(两块分区组成阵列) /dev/sd1      创建RAID分区,md0是基于/dev/sdb1和/dev/sdc1创建的
mdadm -D /dev/md0      查看RAID分区
echo DEVICE /dev/sd1 &gt;&gt; /etc/mdadm.conf    写入RAID配置1
mdadm -Evs &gt;&gt; /etc/mdadm.conf    写入RAID配置2
mkfs.xfs /dev/md0      格式化RAID
mount                        挂载

停止并破坏RAID
mdadm --stop /dev/md0    停止RAID
dd if=/dev/zero of=/dev/sdb1 bs=1M count=1破坏超级块
dd if=/dev/zero of=/dev/sdc1 bs=1M count=1破坏超级块
</code></pre>
<h4 id="3-4-7逻辑卷lvm管理文件系统层次结构">3-4-7,逻辑卷LVM管理,文件系统层次结构</h4>
<ul>
<li>逻辑卷和文件系统的关系
<ul>
<li>LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。</li>
<li>LVM的工作原理其实很简单,它就是通过将底层的物理硬盘抽象的封装起来,然后以逻辑卷的方式呈现给上层应用。在传统的磁盘管理机制中,我们的上层应用是直接访问文件系统,从而对底层的物理硬盘进行读取,而在LVM中,其通过对底层的硬盘进行封装,当我们对底层的物理硬盘进行操作时,其不再是针对于分区进行操作,而是通过一个叫做逻辑卷的东西来对其进行底层的磁盘管理操作。比如说我增加一个物理硬盘,这个时候上层的服务是感觉不到的,因为呈现给上层服务的是以逻辑卷的方式。</li>
<li>LVM最大的特点就是可以对磁盘进行动态管理。因为逻辑卷的大小是可以动态调整的,而且不会丢失现有的数据。如果我们新增加了硬盘,其也不会改变现有上层的逻辑卷。作为一个动态磁盘管理机制,逻辑卷技术大大提高了磁盘管理的灵活性。</li>
<li>
<img src="https://images2018.cnblogs.com/blog/1121174/201807/1121174-20180721222325528-1055457585.jpg" height="90%" width="90%">
</li>
<li>https://www.cnblogs.com/cloudos/p/9348315.html</li>
</ul>
</li>
<li>为linux创建逻辑卷</li>
</ul>
<pre><code class="language-cmd">fdisk创建多个分区(比如/dev/sdb1, /dev/sdc1, /dev/sdd1)
pvcreate /dev/sdb1, /dev/sdc1, /dev/sdd1      创建物理卷(也可以基于RAID创建物理卷)
pvs    查看创建的物理卷
vgcreate vg1 /dev/sdb1, /dev/sdc1, /dev/sdd1    基于物理卷创建卷组
vgs    查看卷组
lvcreate -L 100M -n lv1 vg1      从卷组中划分逻辑卷
lvs      查看逻辑卷
mksf.xfs /dev/lv1/vg1            格式化逻辑卷
mount                                     挂载
</code></pre>
<ul>
<li>动态扩容逻辑卷</li>
</ul>
<pre><code class="language-cmd">vgextend 卷组(centos) 分区(/dev/sdd1)                  使用分区先扩充逻辑卷所在的卷组(卷组可以通过pvs,vgs,lvs进行查看)
lvextend -L +100M/G 逻辑卷(/dev/centos/root)      从卷组中划分区域扩充逻辑卷
xfs_growfs 逻辑卷(/dev/centos/root)                      通知文件系统逻辑卷扩充
</code></pre>
<ul>
<li>文件系统分层:物理磁盘(fdisk)-&gt;分区(fdisk)-&gt;磁盘阵列RAID-&gt;物理卷pv-&gt;卷组vg-&gt;逻辑卷lv-&gt;挂载-&gt;文件系统</li>
</ul>
<h3 id="3-5其他">3-5,其他</h3>
<h4 id="3-5-1grub配置文件">3-5-1,grub配置文件</h4>
<ul>
<li>grub是多系统引导管理器,是在计算机启动后运行的第一个程序,他是用来负责加载、传输控制到操作系统的内核,一旦把内核挂载,系统引导管理器的任务就算完成退出,系统引导的其它部份,比如系统的初始化及启动过程则完全由内核来控制完成。</li>
<li>grub配置文件
<ul>
<li>/etc/default/grub</li>
<li>/etc/grub.d</li>
<li>/boot/grub2/grub.cfg</li>
<li>grub2-mkconfig -o /boot/grub2/grub.cfg</li>
</ul>
</li>
</ul>
<h4 id="3-5-2screen命令">3-5-2,screen命令</h4>
<ul>
<li>screen 是一个非常有用的命令,提供从单个 SSH 会话中使用多个 shell 窗口(会话)的能力。当会话被分离或网络中断时,screen 会话中启动的进程仍将运行,可以随时重新连接到 screen 会话。</li>
</ul>
<pre><code class="language-cmd">screen                                                      进入screen环境
ctrl+a d                                                      退出(detached)screen环境
screen -ls                                                   查看screen会话
screen -r sessionid(ls结果中.前的数字)      恢复会话
</code></pre>
<p>https://handerfly.github.io/linux/2019/03/31/Screan命令的使用/<br>
https://www.runoob.com/linux/linux-comm-screen.html<br>
https://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html</p>
<h4 id="3-5-3安全组件selinux">3-5-3,安全组件:SELinux</h4>
<ul>
<li>DAC(自主访问控制):用户自己配置权限进行访问控制</li>
<li>MAC(强制访问控制):进程、用户、文件都打标签,都对的上才允许访问</li>
<li>SElinux的配置文件<br>
/etc/selinux/config</li>
<li>查看SELinux的命令</li>
</ul>
<pre><code class="language-cmd">getenforce
</code></pre>
<h4 id="3-5-4系统综合状态查询sariftop">3-5-4,系统综合状态查询:sar,iftop</h4>
<ul>
<li>sar命令查看系统综合状态</li>
<li>第三方命令查看网络流量
<ul>
<li>apt install epel-release</li>
<li>apt install iftop</li>
<li>iftop -P</li>
</ul>
</li>
</ul>
<h2 id="4shell脚本">4,shell脚本</h2>
<h3 id="4-1认识shell脚本">4-1,认识shell脚本</h3>
<ul>
<li>UNIX的哲学:一条命令只做一件事,为了组合多个命令或将命令多次执行,使用脚本文件保存寻要执行的命令</li>
<li>脚本文件赋予执行权限(chmod u+rx filename)</li>
<li>sha-bang 声明解释器</li>
</ul>
<pre><code class="language-cmd">#!/bin/bash
#!/usr/bin/python
</code></pre>
<ul>
<li>shell脚本的运行方式
<ul>
<li>bash filename      此方法不用赋予执行权限,创建新子进程执行,不影响当前运行环境(脚本中cd不会改变命令行当前目录)</li>
<li>./filename            此方法需要赋予执行权限,创建新子进程执行,不影响当前运行环境</li>
<li>source filename    不会创建新子进程,影响当前运行环境</li>
<li>. ./filename          不会创建新子进程,影响当前运行环境</li>
</ul>
</li>
<li>内建命令不需要创建子进程,对当前shell有影响;外部命令需要创建子进程,不对当前shell产生影响。</li>
</ul>
<h3 id="4-2管道">4-2,管道</h3>
<ul>
<li>管道和信号一样,也是进程通讯的方式之一</li>
<li>匿名管道(管道符)是shell编程进场用到的通讯工具</li>
<li>管道符|, 作用是将前一个命令的执行结果传递给后一个命令</li>
</ul>
<pre><code class="language-cmd">cat *** | grep a                  使用grep进行文本搜索
head -8 *** | tail -1             显示文件特定行
</code></pre>
<ul>
<li>;的作用是隔开两个命令,第一条命令执行完再执行第二条,两条命令之间没有任何关系</li>
</ul>
<h3 id="4-3重定向">4-3,重定向</h3>
<ul>
<li>一个进程默认会打开标准输入、标准输出、错误输出三个文件描述符</li>
<li>输入重定向,使用文件代替键盘进行输入
<ul>
<li>符号&lt;</li>
</ul>
</li>
</ul>
<pre><code class="language-cmd">wc -l &lt; file    统计file有多少行
cat file | wc -l
read var &lt; ***输入数据***并保存到变量var
echo $var
</code></pre>
<ul>
<li>输出重定向,使用文件代替终端进行输出
<ul>
<li>符号&gt;&gt;&gt;2&gt;&amp;&gt;</li>
</ul>
</li>
</ul>
<pre><code class="language-cmd">&gt;(覆盖)
&gt;&gt;(追加)
2&gt; 2&gt;&gt;(前面的2为标准错误,1为标准输出可省略)
&amp;&gt;(无论输出是标准输出还是错误输出,都输出到指定的文件)

&gt;&gt; *** 2&gt;&amp;1(无论对错都追加)
&gt;&gt; /dev/null (数据黑洞)
nohup *** &gt;out.file 2&gt;&amp;1 &amp;(1表示标准输出,2表示标准错误,2&gt;&amp;1表示标准输出和标准错误合并,都合并到out.flie中)
</code></pre>
<ul>
<li>cat &gt; ... &lt;&lt; EOF 向文件中输入多行内容</li>
</ul>
<h3 id="4-4shell变量">4-4,shell变量</h3>
<ul>
<li>变量的定义:变量名只能由字母、数字、下划线组成,不能以数字开头</li>
<li>变量赋值(又称变量替换)</li>
</ul>
<pre><code class="language-cmd">a=123                  直接赋值,赋值时=左右不能出现空格
let a=123                使用let关键字
l=ls                        将命令赋值给变量
let c=$(ls -l /etc)   将命令结果赋值给变量,使用$()或者``(数字1右边的反引号)
变量值中有空格等特殊字符可以包含在""或''中,并且''中的变量不会进行解释,""中的变量会进行解释
var1=123
echo '$var1'
echo "$var1"
</code></pre>
<ul>
<li>变量引用</li>
</ul>
<pre><code class="language-cmd">${变量名}                对变量的引用,$可以理解为取值
echo ${变量名}      查看变量的值
${变量名}在部分情况下可以省略为$变量名
</code></pre>
<ul>
<li>变量默认作用范围:默认只在当前终端的shell进程范围内生效(四种运行脚本方式的区别后两种才能读取当前shell的变量)
<ul>
<li>定义变量时使用export 关键字,可以使得子进程得到父进程的变量取值</li>
</ul>
</li>
</ul>
<pre><code class="language-cmd">export var1=123
</code></pre>
<ul>
<li>取消变量的赋值</li>
</ul>
<pre><code class="language-cmd">unset 变量名
</code></pre>
<ul>
<li>系统环境变量:每个shell打开都可以读取到的变量
<ul>
<li>env 命令可以查看已存在的环境变量
<ul>
<li>PATH变量保存了系统默认的搜索路径,可以使用PATH=$PATH:***进行临时添加</li>
</ul>
</li>
<li>预定义变量
<ul>
<li>$?上一条命令是否执行成功,0成功,非0不成功</li>
<li>$$当前进程的PID</li>
<li>$0当前进程的名称</li>
</ul>
</li>
<li>位置变量:</li>
</ul>
</li>
</ul>
<pre><code class="language-cmd">$1, $2, ..., $9, ${10}, ...
</code></pre>
<ul>
<li>环境变量的配置文件
<ul>
<li>/etc/profile</li>
<li>/etc/profile.d</li>
<li>~/.bash_profile</li>
<li>~/.bashrc</li>
<li>/etc/bashrc</li>
</ul>
</li>
</ul>
<h3 id="4-5shell数组">4-5,shell数组</h3>
<ul>
<li>定义数组</li>
</ul>
<pre><code class="language-cmd">IPTS=( 10.0.0.1 10.0.0.2 10.0.0.3 )
</code></pre>
<ul>
<li>显示数组所有元素</li>
</ul>
<pre><code class="language-cmd">echo ${IPTS[@]}
</code></pre>
<ul>
<li>显示数组元素个数</li>
</ul>
<pre><code class="language-cmd">echo ${#IPTS[@]}
</code></pre>
<ul>
<li>显示数组的第一个元素</li>
</ul>
<pre><code class="language-cmd">echo ${IPTS}
</code></pre>
<h3 id="4-6shell运算符">4-6,shell运算符</h3>
<ul>
<li>赋值运算符</li>
</ul>
<pre><code class="language-cmd">=用于算术赋值和字符串赋值
使用unset取消为变量的赋值
=除了作为赋值运算符还可以作为测试运算符
</code></pre>
<ul>
<li>算术运算符</li>
</ul>
<pre><code class="language-cmd">+ - * / ** %    基本算术运算符
使用expr进行运算
expr 1 + 1
var1=`expr 1 + 1`
</code></pre>
<ul>
<li>数字常量</li>
</ul>
<pre><code class="language-cmd">let "变量名=变量值"
变量值使用0开头为八进制
变量值使用0x开头为十六进制
</code></pre>
<ul>
<li>双圆括号是let命令的简化</li>
</ul>
<pre><code class="language-cmd">((a=10))
((a=4+5))
((a++))
echo $((10+20))
</code></pre>
<h3 id="4-7shell脚本的测试与判断">4-7,shell脚本的测试与判断</h3>
<ul>
<li>退出与退出状态</li>
</ul>
<pre><code class="language-cmd">利用exit
exit 10 返回10给shell
$? 判断当前shell前一个进程是否正常退出,返回值非0为不正常退出
</code></pre>
<ul>
<li>测试命令test</li>
</ul>
<pre><code class="language-cmd">* test命令用于检查文件或者比较值
* -lt, -le, -gt, -ge, -eq    小于,小于等于,大于,大于等于,等于
* test 可以做以下测试
* 文件测试
* 整数比较测试
* 字符串测试
* test测试语句可以简化为 [] 符号
* [] 符号还有扩展写法 [[]] 支持 &amp;&amp; || ! &lt; &gt;
* 测试结果还是 echo $?
</code></pre>
<h3 id="4-8shell流程控制">4-8,shell流程控制</h3>
<h4 id="4-8-1分支结构-if-then-elif-then-else-fi-case-select">4-8-1,分支结构: if-then-elif-then-else-fi, case, select</h4>
<ul>
<li>使用if-then-fi语句</li>
</ul>
<pre><code class="language-cmd">if [ 测试条件成立 ] 或 命令返回值是否为0; then
执行相应命令(缩进可要可不要)
fi 结束
</code></pre>
<pre><code class="language-cmd">if pwd; then echo "pwd runing"; fi
if abc; then echo "pwd runing"; fi
</code></pre>
<ul>
<li>使用if-then-else-fi语句</li>
</ul>
<pre><code class="language-cmd">if [ 测试条件 ]
then
测试条件成立,执行相应的命令
else
测试条件不成立,执行相应的命令
fi 结束
</code></pre>
<ul>
<li>使用if-then-elif-then-else-fi语句</li>
</ul>
<pre><code class="language-cmd">if [ 测试条件1 ]
then
测试条件1成立,执行相应的命令
elif [ 测试条件2 ]
then
测试条件2成立,执行相应的命令
else
测试条件1,2都不成立,执行相应的命令
fi 结束
</code></pre>
<ul>
<li>嵌套if的使用</li>
</ul>
<pre><code class="language-cmd">if [ 测试条件1 ]
then
测试条件1成立,执行以下命令
if [ 测试条件2 ]
then
    测试条件2成立,执行命令
fi
fi
</code></pre>
<pre><code class="language-cmd">#!/bin/bash

# if demo

if [ $UID = 0 ]; then
      echo "root user"
      if [ -x ~/test.sh ]; then
                ~/test.sh
      fi
else
      echo "swith to root user"
fi
</code></pre>
<ul>
<li>使用case语句</li>
</ul>
<pre><code class="language-cmd">case "$变量" in
"情况1" )
    命令1;;
"情况2" )
    命令2;;
...
esac
</code></pre>
<pre><code class="language-cmd">#!/bin/bash

# case demo

case "$1" in
      "start"|"START")
                echo $0 start...... ;;
      "stop"|"STOP")
                echo $0 stop...... ;;
      "restart"|"reload")
                echo $0 restart...... ;;
      *)
                echo "Usage: $0 {start|stop|restart|reload}";;
esac
</code></pre>
<h4 id="4-8-2循环结构-for-while-until-break-continue">4-8-2,循环结构: for, while, until, break, continue</h4>
<ul>
<li>使用for语句-用法1</li>
</ul>
<pre><code class="language-cmd">for 参数 in 列表
#使用反引号或$()方式执行命令,命令的结果当作列表处理
do 执行的命令
done 封闭一个循环
</code></pre>
<pre><code class="language-cmd">for i in {1..9}; do echo $i; done
for i in {a..c}; do touch $i.mp3; done
echo `ls *.mp3`
for filename in `ls *.mp3`; do mv $filename $(basename $filename .mp3).mp4; done
</code></pre>
<ul>
<li>使用for语句-用法2</li>
</ul>
<pre><code class="language-cmd">for((变量初始化;循环判断条件;变量变化))
do
循环执行的命令
done
</code></pre>
<pre><code class="language-cmd">for ((i=1;i&lt;=10;i++)); do echo $i; done
</code></pre>
<ul>
<li>使用while语句</li>
</ul>
<pre><code class="language-cmd">while test测试条件
do
命令
done
</code></pre>
<pre><code class="language-cmd">a=1; while [[ $a -lt 10 ]]; do ((a++)); echo $a; done
a=1; while [[ $a -le 10 ]]; do ((a++)); echo $a; done
a=20; while [[ $a -gt 10 ]]; do ((a--)); echo $a; done
a=20; while [[ $a -ge 10 ]]; do ((a--)); echo $a; done
</code></pre>
<pre><code class="language-cmd">#死循环
while : ; do echo always; done
</code></pre>
<ul>
<li>使用until语句:与while循环相反,循环测试为假时执行循环,为真时循环停止。</li>
</ul>
<pre><code class="language-cmd">#死循环
until [ 5 -lt 4 ]; do echo always; done
</code></pre>
<ul>
<li>循环可以使用break和continue语句在循环中退出</li>
</ul>
<pre><code class="language-cmd">for num in {1..9}; do   if [ $num -eq 5 ]; then   continue;   fi;   echo $num; done
</code></pre>
<pre><code class="language-cmd">for num in {1..9}; do   if [ $num -eq 5 ]; then   break;   fi;   echo $num; done
</code></pre>
<ul>
<li>循环和判断嵌套使用</li>
</ul>
<pre><code class="language-cmd">for sc_name in /etc/profile.d/*.sh; do   if [ -x $sc_name ]; then   . $sc_name;   fi; done
</code></pre>
<ul>
<li>使用循环处理命令行参数
<ul>
<li>命令行参数可以使用 <code>$1 $2 ... ${10} ... $n</code>进行读取</li>
<li><code>$0</code>代表脚本名称</li>
<li><code>$* $@</code>代表所有位置参数</li>
<li><code>$#</code>代表位置参数的数量</li>
</ul>
</li>
</ul>
<pre><code class="language-cmd">#!/bin/bash

# help display help help

for pos in $*
do
      if [ "$pos" = "help" ]; then
                echo $pos $pos
      fi
done
</code></pre>
<pre><code class="language-cmd">#!/bin/bash

#help display help help

while [ $# -ge 1 ]
do
      echo $#
      echo "do something"
      if [ "$1" = "help" ]; then
                echo $1 $1
      fi
      shift   #去除第一个位置参数
done
</code></pre>
<h3 id="4-9shell函数">4-9,shell函数</h3>
<h4 id="4-9-1自定义函数">4-9-1,自定义函数</h4>
<ul>
<li>可在终端直接创建和调用函数,也可保存在shell脚本中构建函数库</li>
</ul>
<pre><code class="language-cmd">#函数定义,function可省略
function fname(){
命令
}

#取消函数
unset fname

#执行
在终端定义:      fname
在shell脚本定义:   source 脚本名称
                   fname

#函数作用范围的变量(局部变量),超出函数范围则变量失效
local 变量名

#函数的参数
$1 $2 $3 ... $n
</code></pre>
<pre><code class="language-cmd">#终端
#定义
cdls() {
&gt; cd $1
&gt; ls
&gt; }
#调用
cdls /home
</code></pre>
<pre><code class="language-cmd">#shell脚本
#定义
#!/bin/bash

# functions

checkpid() {
for i in $*
do
      if [ -d "/proc/$i" ]; then
                return 0
      fi
done
return 1
}
#调用
source test5.sh
checkpid 1 2
echo $?
checkpid 65533
echo $?
</code></pre>
<h4 id="4-9-2系统函数库">4-9-2,系统函数库</h4>
<ul>
<li>系统自建了函数库,可以在脚本中引用,函数库目录<code>/etc/init.d/functions</code></li>
<li>使用<code>source</code>由函数脚本文件“导入”函数</li>
</ul>
<h3 id="4-10shell脚本控制">4-10,shell脚本控制</h3>
<h4 id="4-10-1脚本优先级控制">4-10-1,脚本优先级控制</h4>
<ul>
<li>对脚本占用资源的分配,可以使用<code>nice</code>和<code>renice</code>调整脚本优先级</li>
<li>避免出现“不可控的”死循环,fork炸弹(死循环导致CPU占用过高,并导致死机)</li>
</ul>
<pre><code class="language-cmd">#fork炸弹的例子-V1
func() { func | func&amp; }
func
#V2
.(){.|.&amp;};.
</code></pre>
<h4 id="4-10-2捕获信号">4-10-2,捕获信号</h4>
<ul>
<li>捕获信号脚本的编写
<ul>
<li>kill会默认发送15号信号给应用程序</li>
<li>ctrl+c发送2号信号给应用程序</li>
<li>9号信号不可阻塞(trap无效)</li>
</ul>
</li>
</ul>
<pre><code class="language-cmd">#脚本test1.sh
#!/bin/bash

#signal demo

trap "echo sig 15" 15    #捕获并屏蔽15号信号
trap "echo sig 2" 2    #捕获并屏蔽2号信号,也就是ctrl+c信号

echo $$

while :
do
      :
done
</code></pre>
<pre><code class="language-cmd">chmod u+x test1.sh
./test1.sh
kill -15 ***pid
kill ***pid
kill -9 ***pid
</code></pre>
<h4 id="4-10-3一次性计划任务-at">4-10-3,一次性计划任务 at</h4>
<ul>
<li>计划任务:让计算机在指定的时间运行程序</li>
</ul>
<pre><code class="language-cmd">at 时间
at&gt; 任务命令            #使用source引入脚本中的函数或者引入命令的绝对路径,执行没有终端输出echo需要重定向
at&gt; ctrl+d 提交
</code></pre>
<h4 id="4-10-4周期性计划任务-crontab">4-10-4,周期性计划任务 crontab</h4>
<ul>
<li>配置方式                              <code>crontab -e</code></li>
<li>查看现有的计划任务               <code>crontab -l</code></li>
<li>配置格式
<ul>
<li>分钟 小时 日期 月份 星期几 执行的命令</li>
<li>注意命令的路径问题</li>
</ul>
</li>
</ul>
<pre><code class="language-cmd">crontab -e
* * * * * /bin/date &gt;&gt; /tmp/date.txt            #每过一分钟记录一次日期
* * * * 1,5 /bin/date &gt;&gt; /tmp/date.txt         #周一和周五每过一分钟记录一次日期
* * * * 1-5 /bin/date &gt;&gt; /tmp/date.txt      #周一到周五每过一分钟记录一次日期
</code></pre>
<h4 id="4-10-5延时计划任务-anacontab-计划任务加锁-flock">4-10-5,延时计划任务 anacontab 计划任务加锁 flock</h4>
<ul>
<li>如果计算机不能按照预期时间运行(计算机关机)
<ul>
<li>anacontab设置延时计划任务</li>
<li>flock锁文件,脚本只运行执行一次(类似单例模式)</li>
</ul>
</li>
</ul>
<pre><code class="language-cmd">flock -xn ''/tmp/f.lock'' -c ''***脚本''
</code></pre>
<h3 id="4-n其他">4-N,其他</h3>
<h4 id="4-n-1shell关键字">4-N-1,shell关键字</h4>
<ul>
<li>引号
<ul>
<li>'' 完全引用</li>
<li>"" 不完全引用</li>
<li>`` 执行</li>
</ul>
</li>
<li>括号
<ul>
<li>() (()) $() 圆括号
<ul>
<li>单独使用圆括号会产生一个子shell (a=1)</li>
<li>单独使用圆括号可用于数组初始化 IPS=(IP1 IP2 IP3)</li>
<li>双圆括号是let命令的简化 ((a=1))</li>
<li>var1=$(ope) 将ope的运算结果赋值给var1</li>
</ul>
</li>
<li>[] [[]] 方括号
<ul>
<li>单独使用方括号是测试(test) 或数组元素功能</li>
<li>两个方括号表示测试表达式,可以直接用 &gt; &lt; 进行数值判断,结果通过$?查看,0为真,非0为假</li>
</ul>
</li>
<li>&lt;&gt; 尖括号,大小比较,重定向符号</li>
<li>{} 花括号
<ul>
<li>输出范围 echo {0..9}echo</li>
<li>配合取数组元素</li>
<li>文件复制 cp /etc/passed{,.bak}    相当于   cp /etc/passwd /etc/passwd.bak</li>
</ul>
</li>
</ul>
</li>
<li>算术运算符
<ul>
<li>
<pre><code class="language-cmd">+ - * / %
</code></pre>
</li>
</ul>
</li>
<li>比较运算符
<ul>
<li>
<pre><code class="language-cmd">&gt; &lt; =
</code></pre>
</li>
<li>
<pre><code class="language-cmd">-lt, -le, -gt, -ge, -eq    小于,小于等于,大于,大于等于,等于
</code></pre>
</li>
</ul>
</li>
<li>逻辑运算符
<ul>
<li>
<pre><code class="language-cmd">&amp;&amp; || !
</code></pre>
</li>
</ul>
</li>
<li>转义字符 \
<ul>
<li>普通字符转义后有特殊功能</li>
<li>特殊字符转义后当作普通字符使用</li>
</ul>
</li>
<li>其他</li>
</ul>
<pre><code class="language-cmd"># 注释符
; 命令分隔符
case 语句的分隔符要转义 ;;
: 空指令
.和source命令相同,用于执行shell脚本
~ 家目录
, 分隔目录
* 通配符
? 条件测试或通配符
$ 取值符号
| 管道符
&amp; 后台运行
_ 空格
</code></pre>
<h2 id="5文本操作">5,文本操作</h2>
<h3 id="5-1元字符">5-1,元字符</h3>
<pre><code class="language-cmd">.   匹配除换行符外的任意单个字符
*匹配任意一个跟在它前面的字符
[]匹配方括号中的字符类中的任意一个
^匹配开头
$匹配结尾
\转义后面的特殊字符
</code></pre>
<h3 id="5-2扩展元字符">5-2,扩展元字符</h3>
<pre><code class="language-cmd">+ 匹配前面的正则表达式至少出现一次
? 匹配前面的正则表达式出现零次或一次
| 匹配它前面或后面的正则表达式(多个正则表达式并列的情况)
</code></pre>
<h3 id="5-3文件的查找命令-find">5-3,文件的查找命令 find</h3>
<ul>
<li><code>find 路径 查找条件 [补充条件]</code></li>
</ul>
<pre><code class="language-cmd">find /etc -name pass*
find /etc -regex .*wd$
find /etc -regex .etc.*wd$
find /etc -type f -regex .*wd$
</code></pre>
<h3 id="5-4文件内容的过滤查找命令-grep">5-4,文件内容的过滤(查找)命令 grep</h3>
<h3 id="5-5sed和awk">5-5,sed和AWK</h3>
<ul>
<li>vim和sed、AWK的区别
<ul>
<li>交互式与非交互式</li>
<li>文件操作模式(文本编辑器)与行操作模式(行编辑器)</li>
</ul>
</li>
</ul>
<h4 id="5-5-1sed">5-5-1,sed</h4>
<ul>
<li>sed一般用于对文本内容做替换 <code>sed '/user1/s/user1/u1/' /etc/passwd</code>
<ul>
<li>sed的基本工作方式:
<ul>
<li>将文件以行为单位读取到内存(模式空间)</li>
<li>使用sed的每个脚本对该行进行操作(在内存中)</li>
<li>处理完成后输出该行</li>
</ul>
</li>
<li>sed的替换命令: s<pre><code>基础用法:
sed 's/old/new/' filename
连续的多个命令:
sed -e 's/old/new/' -e 's/old/new/' ... filename
sed 's/old1/new1/;s/old2/new2/;...' filename1 filename2 ...
改写/重定向原始文件:
sed -i 's/old/new/' 's/old/new/' filename
sed -e 's/old/new/' -e 's/old/new/' ... filename &gt; newfilename
正则表达式:
sed 's/正则表达式/new/' filename
sed -r 's/扩展正则表达式/new/' filename
/如何和正则匹配的内容冲突,可以将分隔符改为其他符号:
sed 's!/!abc!' filename
s@old@new@
</code></pre>
</li>
<li>sed的替换命令加强版
<ul>
<li>全局替换<code>'s/old/new/'g</code>;g为全局替换,用于替换所有出现的次数</li>
<li>限定替换第n处<code>'s/old/new/'n</code></li>
<li>标志位<code>'s/old/new/'标志位</code>,标志位不同则含义不同
<ul>
<li>数字,第几次出现才进行替换</li>
<li>g,每次出现都进行替换</li>
<li>p,打印模式空间的内容<code>sed -n 's/root/!!!!/'p</code> 只输出替换成功的行</li>
<li>w,将模式空间的内容写入到文件</li>
</ul>
</li>
<li>寻址
<ul>
<li>默认对每行进行操作,增加寻址后对匹配的行进行操作;</li>
<li><code>/正则表达式/s/old/new/g</code></li>
<li><code>行号s/old/new/g</code>;行号可以是具体的行,也可以是最后一行$符号;</li>
<li>可以使用两个寻址符号,也可以混合使用行号和正则地址; <code>head -6 /etc/passwd | sed '2,$s/usr/!/'</code></li>
</ul>
</li>
<li>分组
<ul>
<li>寻址可以匹配多条命令 <code>/regular/{s/old/new/;s/old/new/}</code></li>
</ul>
</li>
<li>sed脚本文件
<ul>
<li>可以将选项保存为文件,使用-f加载脚本文件<code>sed -f sedscript filename</code></li>
</ul>
</li>
</ul>
</li>
<li>sed的其他命令
<ul>
<li>删除命令:删除模式空间内容,改变脚本的控制流,读取新的输入行
<ul>
<li><code>[寻址]d</code><code>sed '/ab/d' bfile</code><code>sed '/ab/d;s/a/!/' bfile</code></li>
</ul>
</li>
<li>追加、插入、更改
<ul>
<li>追加命令<code>a</code>:匹配的后一行插入<code>sed '/ab/a hello' bfile</code></li>
<li>插入命令<code>i</code>:匹配的前一行插入<code>sed '/ab/i hello' bfile</code></li>
<li>更改命令<code>c</code>:匹配的本行改写<code>sed '/ab/c hello' bfile</code></li>
</ul>
</li>
<li>打印
<ul>
<li>打印行号 <code>=</code><code>sed '/ab/d;=' bfile</code></li>
<li>打印命令:输出匹配的行 <code>p</code><code>sed '/ab/p' bfile</code><code>sed -n '/ab/p' bfile</code></li>
</ul>
</li>
<li>下一行
<ul>
<li>下一行命令<code>n</code>:流程控制,遇见匹配行不做处理,直接处理下一行</li>
</ul>
</li>
<li>读文件和写文件
<ul>
<li>读文件<code>r</code></li>
<li>写文件<code>w</code></li>
</ul>
</li>
<li>退出命令
<ul>
<li><code>q</code>,匹配到行就直接退出了</li>
<li><code>sed 10q filename</code><code>sed -n 1,10p filename</code>前者速度更快,因为前者到第10行就直接退出了,后者相当于还是对文件遍历了一遍。</li>
</ul>
</li>
</ul>
</li>
<li>sed多行模式空间
<ul>
<li>为什么要有多行模式:配置文件一般为单行出现,但也有使用XML或JSON格式的多行配置文件出现。(比如有换行符等)</li>
<li>多行模式处理命令:<code>N, D, P</code>
<ul>
<li><code>N</code>:将下一行加入到模式空间</li>
<li><code>D</code>:删除模式空间中的第一个字符到第一个换行符(改变控制流程,构建循环)</li>
<li><code>P</code>:打印模式空间中的第一个字符到第一个换行符</li>
</ul>
</li>
</ul>
</li>
<li>sed保持空间
<ul>
<li>sed保持空间也是多行的一种操作方式;将内容暂存在保持空间,便于做多行处理:文本文件-&gt;模式空间-&gt;保持空间</li>
<li><code>h或H</code>将模式空间内容存放到保持空间,<code>h</code>为覆盖模式,<code>H</code>为追加模式;</li>
<li><code>g或G</code>将保持空间内容取出到模式空间,<code>g</code>为覆盖模式,<code>G</code>为追加模式;</li>
<li><code>x</code>交换模式空间和保持空间内容</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="5-5-2awk">5-5-2,AWK</h4>
<ul>
<li>AWK一般用于对文本内容进行统计、按需要的格式进行输出
<ul>
<li>AWK和sed的区别
<ul>
<li>AWK更像是脚本语言</li>
<li>AWK用于比较规范的文本处理,用于统计数量并输出指定字段</li>
<li>使用sed将不规范的文本,处理成“较规范”的文本</li>
</ul>
</li>
<li>AWK脚本的流程控制<pre><code class="language-cmd">输入数据前例程BEGIN{}
主输入循环{}
所有文件读取完成例程END{}
</code></pre>
</li>
<li>AWK的字段引用与分离
<ul>
<li>每行称作AWK的记录</li>
<li>使用空格、制表符分隔开的单词称作字段</li>
<li>可以自己指定分隔的字段
<ul>
<li>awk可以使用-F选项改变字段分隔符 <code>awk -F ',' '{print $1, $2, $3}' filename</code></li>
<li>分隔符可以使用正则表达式</li>
</ul>
</li>
<li>字段的引用
<ul>
<li>awk中使用 $1 $2 ... $n 表示每一个字段<code>awk '{print $1, $2, $3}' filename</code></li>
</ul>
</li>
<li>例子<br>
<code>head -5 /etc/passwd | awk -F ":" '{print $1}'</code></li>
</ul>
</li>
<li>AWK的表达式
<ul>
<li>赋值操作符<pre><code class="language-cmd">= 是最常用的赋值操作符
var1 = "name"
var2 = "hello" "world"
var3 = $1
其他赋值操作符    ++--+=-=*=/=%=^=
</code></pre>
</li>
<li>算数操作符<pre><code class="language-cmd">+-*/%^
</code></pre>
</li>
<li>系统变量<pre><code class="language-cmd">FS和OFS字段分隔符,OFS表示输出的字段分隔符
RS记录分隔符
NR和FNR行号
NF字段数量,最后一个字段内容可以用 $NF 取出
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print $1}'
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print $1, $2}'
head -5 /etc/passwd | awk 'BEGIN{FS=":"; OFS="-"}{print $1, $2}'
head -5 /etc/passwd | awk 'BEGIN{RS=":"}{print $0}'
head -5 /etc/passwd | awk '{print NR, $0}'
head -5 /etc/passwd | awk '{print FNR, $0}'
awk '{print NR, $0}' /etc/hosts /etc/hosts
awk '{print FNR, $0}' /etc/hosts /etc/hosts
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print NF}'
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print $NF}'
</code></pre>
</li>
<li>关系操作符<pre><code class="language-cmd">&lt;&gt;&lt;=&gt;===!=~!~
</code></pre>
</li>
<li>布尔操作符<pre><code class="language-cmd">&amp;&amp;||!
</code></pre>
</li>
</ul>
</li>
<li>AWK判断和循环
<ul>
<li>条件语句:如果有多个语句需要执行,可以使用<code>{}</code>将多个语句括起来<pre><code class="language-cmd">if (表达式)
awk 语句1
[ else
awk 语句2
]
</code></pre>
</li>
<li>循环语句<pre><code class="language-cmd">1-while 循环:
while(表达式)
    awk语句1
2-do循环:
do{
    awk 语句1
}while(表达式)
3-for循环
for(初始值; 循环判断条件; 累加)
    awk语句1
4-影响控制的其他语句
break
continue
</code></pre>
</li>
</ul>
</li>
<li>AWK数组
<ul>
<li>数组的定义<code>数组名[下标]=值</code>下标可以使用数字也可以使用字符串</li>
<li>数组的遍历<code>for (变量 in 数组名)</code>使用<code>数组名[变量]</code>的方式依次对每个数组的元素进行操作</li>
<li>删除数组<code>delete 数组[下标]</code></li>
<li>命令行参数数组<code>ARGC ARGV</code></li>
</ul>
</li>
<li>AWK函数
<ul>
<li>算数函数<code>sin()cos()int()rand()srand()</code></li>
<li>字符串函数<code>gsub(r,s,t)index(s,t)length(s)match(s,r)split(s,a,sep)sub(r,s,t)substr(s,p,n)</code></li>
<li>自定义函数<pre><code class="language-cmd">function 函数名 (参数) {
awk语句
return awk变量
}
</code></pre>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="6服务管理篇">6,服务管理篇</h2>
<ul>
<li>在linux上部署服务,提供给其他的用户使用。</li>
</ul>
<h3 id="6-1防火墙">6-1,防火墙</h3>
<ul>
<li>防火墙分类
<ul>
<li>软件防火墙:数据包过滤防火墙和应用层防火墙(centos6默认的防火墙是iptables-数据包过滤防火墙,centos7默认的防火墙是firewallD-底层使用netfilter)</li>
<li>硬件防火墙</li>
</ul>
</li>
</ul>
<h4 id="6-1-1iptables">6-1-1,iptables</h4>
<ul>
<li>iptables的表和链
<ul>
<li>规则表-iptables能够支持的功能:<code>filter-允许哪些ip和端口通过nat-网络地址转换-如内网ip转外网ipmangleraw</code></li>
<li>规则链-规则控制的范围/方向:<code>INPUT OUTPUT FORWARD</code>    <code>PREROUTING POSTROUTING</code></li>
</ul>
</li>
<li>iptables的filter表<pre><code class="language-cmd">iptables -t filter 命令 规则链 规则
命令有:
-L(显示已经具备的过滤规则)
iptables -t filter -L
iptables -t filter -nL
iptables -t filter -vnL
iptables -vnL
-A -I(添加规则,-A在已有的规则后面添加,-I在第一条规则添加,规则是从上向下进行匹配的不会覆盖)
iptables -t filter -A INPUT -s 10.0.0.1 -j ACCEPT
iptables -t filter -A INPUT -s 10.0.0.1 -j DROP
-D -F -P(-D清楚指定的规则,-F清除自己添加的所有规则,-P修改默认规则)
iptables -D INPUT 规则的序号/名称
iptables -F INPUT
iptables -P INPUT DROP
-N -X -E(-N自定义规则链,-X删除自定义规则链,-E重命名自定义规则链)
</code></pre>
</li>
<li>iptables的nat表<pre><code class="language-cmd">iptables -t nat 命令 规则链 规则
PREROUTING 目的地址转换
POSTROUTING 源地址转换
iptables -t nat -A PREROUTING -i eth0 -d 114.115.116.117 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.1
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth1 -j SNAT --to-source 111.112.113.114
</code></pre>
</li>
<li>iptables配置文件<pre><code class="language-cmd">/etc/sysconfig/iptables
CentOS6
service iptables save | start | stop | restart
CentOS7
apt install iptables-services
</code></pre>
</li>
</ul>
<h4 id="6-1-2firewalld">6-1-2,firewallD</h4>
<ul>
<li>firewallD服务
<ul>
<li>支持区域"zone"概念(iptables中的自建规则链)</li>
<li>firewall-cmd</li>
<li><code>systemctl status | start | restart | stop | enable | disable firewalld.service</code></li>
<li><code>firewall-cmd --stats | --list-all | --zone=public --list-interfaces | --list-ports | --list-services | --add | --remove | --permanent | --reload</code></li>
</ul>
</li>
<li>iptables和firewallD都是管理Linux防火墙的工具,真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构。</li>
</ul>
<h3 id="6-2ssh服务-远程登陆">6-2,SSH服务-远程登陆</h3>
<ul>
<li>SSH服务介绍:telnet明文传输,ssh密文传输</li>
<li>SSH服务配置文件:sshd_config<pre><code class="language-cmd">Port 22                               默认端口
PermitRootLogin yes            是否允许root登录
AuthorizedKeysFile .ssh/authorized_keys
</code></pre>
</li>
<li>SSH命令<pre><code>systemctl status | start | stop | restart | enable | disable sshd.service
客户端登录:
ssh [-p端口] 用户@远程ip
</code></pre>
</li>
<li>SSH公钥认证<pre><code class="language-cmd">ssh-keygen -t rsa                                 要在客户端产生密钥
ssh-copy-id -i 公钥文件 用户@远程ip      拷贝公钥到服务端
</code></pre>
</li>
<li>scp和sftp远程拷贝文件<pre><code class="language-cmd">本地文件拷贝到远程:
scp 本地目录/本地文件 用户@远程ip:远程目录/远程文件
远程文件拷贝到本地:
scp 用户@远程ip:远程目录/远程文件 本地目录/本地文件
</code></pre>
</li>
</ul>
<h3 id="6-3ftp服务-文件共享">6-3,FTP服务-文件共享</h3>
<ul>
<li>FTP协议(文件传输协议,包含主动模式和被动模式)</li>
<li>vsftpd服务器安装</li>
</ul>
<pre><code class="language-cmd">sudo apt install vsftpd ftp
systemctl start vsftpd.service
ftp localhost
</code></pre>
<ul>
<li>vsftpd服务配置文件</li>
</ul>
<pre><code class="language-cmd">配置文件有:
/etc/vsftpd/vsftpd.conf    主配置文件
/etc/vsftpd/ftpusers      用户黑名单,不允许登录ftp服务器
/etc/vsftpd/user_list      用户黑白名单,可以在主配置文件中将其设置为黑名单或者白名单
</code></pre>
<pre><code class="language-cmd">使用firewallD开放ftp服务:
firewall-cmd --list-all
firewall-cmd --add-service ftp
</code></pre>
<ul>
<li>FTP命令</li>
</ul>
<pre><code class="language-cmd">用户ftp登录所在目录就是ftp服务器上的用户家目录:
ls                  查看ftp服务器上有哪些文件
!ls                   查看本地有哪些文件
put 文件          将本地文件上传到ftp服务器
get 文件          将ftp服务器上的文件下载到本地
</code></pre>
<ul>
<li>使用虚拟用户进行验证</li>
</ul>
<pre><code class="language-cmd">主配置文件,配置项设置:
guest_enable = YES                                          使vsftpd支持虚拟用户
guest_username = vuser                                    权限映射(这里默认是vuser的用户权限)
user_config_dir = /etc/vsftpd/vuserconfig             对虚拟用户的权限控制
allow_writeable_chroot = YES                              允许虚拟用户可写(可以上传)
pam_service_name = vsftpd.vuser                         可插拔式验证模块
</code></pre>
<pre><code class="language-cmd">useradd vuser -d /data/ftp -s /sbin/nologin          创建一个用户,数据存放目录为/data/ftp,不能通过终端登录-指定shell为/sbin/nologin (只用于用户身份的映射)
cd /etc/vsftpd
vim vuser.temp                                                                              设置用户名和密码
db_load -T -t hash -f /etc/vsftpd/vuser.temp /etc/vsftpd/vuser.db      使配置文件生效
ll /etc/vsftpd/vuser.db
chmod 600 /etc/vsftpd/vuser.db                                                      修改配置文件权限
vim /etc/pam.d/vsftpd.vuser                                                             可插拔验证
vim /etc/vsftpd/vsftpd.conf                                                            依照“主配置文件,配置项设置”进行设置
</code></pre>
<h3 id="6-4samba服务-文件共享">6-4,samba服务-文件共享</h3>
<ul>
<li>常见共享服务的区别
<ul>
<li>协议不同</li>
<li>对操作系统的支持程度不同:FTP可支持所有的操作系统,samba默认只支持windows和windows之间的共享,NFS默认只支持linux和linux之间共享。</li>
<li>交互的便利性不同(samba和NFS都是基于挂载使用,挂载后就可以像操作本地文件一样操作远程共享文件)</li>
</ul>
</li>
<li>samba服务的安装</li>
</ul>
<pre><code class="language-cmd">apt install samba
</code></pre>
<ul>
<li>samba服务的配置文件</li>
</ul>
<pre><code class="language-cmd">/etc/samba/smb.conf


comment = my share
path = /data/share
read only = No
</code></pre>
<ul>
<li>samba用户的设置</li>
</ul>
<pre><code class="language-cmd">smbpasswd命令
-a 添加用户(需要基于已有的用户 useradd)
-x 删除用户
pdbedit
-L 查看用户
</code></pre>
<ul>
<li>samba服务的启动和停止</li>
</ul>
<pre><code class="language-cmd">systemctl start | stop smb.service

linux客户端使用挂载方式访问
mount -t cifs -o username=user1 //127.0.0.1/user1/mnt

windows客户端
资源管理器访问共享
映射网络驱动器
</code></pre>
<h3 id="6-5nfs服务-文件共享">6-5,NFS服务-文件共享</h3>
<ul>
<li>NFS服务的配置-不用安装,linux默认自带</li>
</ul>
<pre><code class="language-cmd">/etc/exports                                                          配置文件
/data/share*(ro,rw,sync,all_squash)                            共享路径(data和share必须存在并且都是目录,*表示所有ip都可以访问也可以写单独的ip地址,ro只读,rw读写,sync读写同步,all_squash确保映射后的用户权限为普通用户权限)

showmount -e localhost

客户端使用挂载方式访问
mount -t nfs localhost:/data/share /mnt
</code></pre>
<ul>
<li>NFS服务的启动和停止</li>
</ul>
<pre><code class="language-cmd">systemctl start | stop nfs.service
</code></pre>
<h3 id="6-6nginx服务openresty-web服务器">6-6,Nginx服务/OpenResty-web服务器</h3>
<ul>
<li>Nginx和web服务介绍
<ul>
<li>Nginx(engine x)是一个高性能的web和反向代理服务器</li>
<li>Nginx支持HTTP、HTTPS和电子邮件代理协议</li>
<li>OpenResty是基于Nginx和Lua实现的web应用网关(Nginx的发行版本),集成了大量的第三方模块(扩展功能)</li>
</ul>
</li>
<li>OpenResty软件的下载和安装</li>
</ul>
<pre><code class="language-cmd">yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
yum install openresty
</code></pre>
<ul>
<li>OpenResty的配置文件</li>
</ul>
<pre><code class="language-cmd">配置文件位置:
/usr/local/openresty/nginx/conf/nginx.conf
service openresty start | stop | restart | reload

日志位置:
/usr/local/openresty/nginx/logs/

html文件位置:
/usr/local/openresty/nginx/html/
</code></pre>
<ul>
<li>使用OpenResty配置域名虚拟机<br>
Nginx web server配置</li>
</ul>
<pre><code class="language-cmd">配置文件:
server {
listen 80;                控制访问端口
server_name 准备好的域名;                使用准备好的域名访问server的范围
location / {                                                      
    root html;                使用准备好的域名:80 会访问到的目录(此时访问的是/usr/local/openresty/nginx/html/)
    index index.html index.htm;
}
}

启动nginx:
cd /usr/local/openresty/nginx/sbin/
./nginx -t                检查配置文件的语法有没有错误
./nginx                启动(方法一)
service openresty start | stop | restart | reload                启动(方法二)
netstat -ntpl | grep nginx                查看端口监听情况

nginx的常用命令:
./nginx -s stop                关闭nginx(关闭进程,连接断开)
./nginx -s reload                重新加载配置文件(不关闭进程,连接不断开)

测试:
curl 127.0.0.1:80

如果部署到公网后,使用公网ip无法访问,需要修改服务器的防火墙设置
(需要nginx监听,防火墙设置,腾讯云安全组一致才能访问)
最简单的直接关闭防火墙:systemctl stop firewalld.service
或者使用命令: firewall-cmd --zone=public --add-port=80/tcp --permanent    进行添加
</code></pre>
<h3 id="6-7lnmp">6-7,LNMP</h3>
<ul>
<li>什么是LNMP?
<ul>
<li>LAMP(Linux+Apache+PHP+MySQL)</li>
<li>LNMP(Linux+Nginx+PHP+MySQL)</li>
</ul>
</li>
<li>环境搭建</li>
</ul>
<pre><code class="language-cmd">MySQL安装
* 可以使用mariadb替代
* yum install mariadb mariadb-server
* 修改默认编码,配置文件地址 /etc/my.cnf
    character_set_server=utf8
    init_connect='SET NAMES utf8'
* systemctl start mariadb.service
* mysql数据库交互界面
    show variables like '%character_set%';

PHP安装
* yum install php-fpm php-mysql
    php-mysql使得php可以支持mysql      php-fpm使得php可以作为独立的进程运行
* 启动 php-fpm
    systemctl start php-fpm.service

Nginx配置(修改位置就在openresty安装后nginx.conf的配置文件server{]块中,取消对应的注释即可)
location ~ \.php${
roothtml;
fastcgi_pass127.0.0.1:9000;
fastcgi_indexindex.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
</code></pre>
<h3 id="6-8dns服务-域名解析">6-8,DNS服务-域名解析</h3>
<ul>
<li>DNS服务介绍
<ul>
<li>DNS(Domain Name System)域名系统</li>
<li>FQDN(Full Qualified Domain Name)完全限定域名</li>
<li>域分类:根域,顶级域(TLD)</li>
<li>查询方式:递归、迭代</li>
<li>解析方式:正向解析、反向解析</li>
<li>DNS服务器的类型:缓存域名服务器、主域名服务器、从域名服务器</li>
</ul>
</li>
</ul>
<pre><code class="language-cmd">早期实现
/etc/hosts            ip 域名          使用邮件定期发送给用户进行更新(手动并且时效性差)
</code></pre>
<ul>
<li>BIND软件的安装</li>
</ul>
<pre><code class="language-cmd">yum install bind bind-utils
systemctl start named.service
</code></pre>
<ul>
<li>BIND的配置文件</li>
</ul>
<pre><code class="language-cmd">vim /etc/named.conf
</code></pre>
<ul>
<li>使用dig和nslookup命令测试DNS</li>
<li>从域名服务器的配置
<ul>
<li>从服务器内容会自动同步主服务器(读写分离等架构的基础)</li>
</ul>
</li>
</ul>
<pre><code class="language-cmd">zone "test.com" IN {
type slave;
file "slaves/test/com.zone";
masters { 10.211.55.3; };
};
</code></pre>
<h2 id="附录1文件系统">附录1,文件系统</h2>
<ul>
<li>万事万物皆文件,mount扩容很方便。</li>
<li>各目录的含义(注意linux为/,windows为\)</li>
</ul>
<pre><code class="language-cmd">/bin:
可执行文件,系统管理命令、脚本(bin是Binary的缩写,这个目录存在着最经常使用的命令。)

/boot:
启动时用的引导文件(这里存放着启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。)

/dev:
设备信息(dev是Device(设备)的缩写,该目录下存放的是linux的外部设备,在Linux中访问设备的方式与访问文件的方式是相同的)

/etc:
配置文件

/home:
非root用户的家目录

/lib:
最基本的动态链接共享库

/lost+found:
一般是空的,系统非法关机后,该目录中会存放一些文件

/media:
u盘,光驱等linux自动识别的外部设备

/mnt:
让用户临时挂载别的文件系统(比如将光驱挂载到/mnt上,进入该目录可以查看光驱中的内容)

/opt:
软件的自定义安装位置

/proc:
进程信息(一个虚拟的目录,是系统内存的映射,可以通过直接访问该目录获取系统信息。
该目录的内容不在硬盘上而在内存里,并可以直接修改里面的某些文件。)

/root:
系统管理员的用户主目录

/sbin:
系统管理员才能使用的系统管理程序

/selinux:
这个目录是red/centos所特有的目录,selinux是一个安全机制,类似于windows的防火墙,但是这套机制比较复杂,这个目录就是存放selinux的相关文件的

/srv:
存放服务启动之后需要提取的数据

/sys:
系统内核信息(是linux2.6内核的一个很大的变化,该目录下安装了linux2.6内核中新出现的一个文件系统sysfs
sysfs集成了3种文件系统的信息,针对进程信息的proc文件系统、针对设备的devfs文件系统、以及针对伪终端的devpts文件系统,该文件系统是内核设备树的一个直观反映。
当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。)

/tmp:
临时文件(临时变量)

/usr:
一个非常重要的目录,用户许多应用程序和文件都放在该目录下。类似于windows下的program files目录。

/usr:
多个用户的共享区域,软件的默认安装区域。(类似于C:\Windows)
/usr/bin
/usr/sbin
/usr/src:
内核源代码默认的放置目录

/var:
存放着不断扩充着的东西,习惯将不断被修改的目录放在该目录下,包括各种日志文件。

/run:
一个临时文件系统,存储系统启动以来的信息(系统常量、系统变量)。如果系统上有/var/run目录,应将其指向/run。
</code></pre>
<h2 id="附录2ubuntu与centos的区别">附录2,Ubuntu与Centos的区别</h2>
<img src="https://ask.qcloudimg.com/http-save/yehe-4870527/o1q6k8ih76.png?imageView2/2/w/1620" height="60%" width="60%">
<h2 id="附录3vivim键盘图">附录3,vi/vim键盘图</h2>
<p><img src="https://tse1-mm.cn.bing.net/th/id/R-C.6bd2418f48a4b10b9730d7f7270b77d3?rik=D1VvT8zVvclyOw&amp;riu=http%3a%2f%2fwww.linuxidc.com%2fupload%2f2015_07%2f150716090467891.jpg&amp;ehk=h7ObGNb35bcFtfswNzenNYQqO97dvo1uOGVg%2blFDy00%3d&amp;risl=&amp;pid=ImgRaw&amp;r=0" height="100%" width="100%"></p>
<h2 id="附录4帖子汇总">附录4,帖子汇总</h2>
<p>问君哪得清如许,为有源头活水来(中文版本)<br>
问君哪得清如许,为有源头活水来(英文版本)</p>
<p>2021年 Windows10 环境下使用WSL和Docker 配置深度学习环境- 可使用任意版本的 Ubuntu+CUDA image 以及踩坑记录<br>
Windows系统WSL2 的ubuntu子系统安装 docker、nvidia-docker调用GPU<br>
Ubuntu下载、配置、运行Anaconda<br>
Ubuntu下载anaconda教程(全过程)<br>
docker配置ubuntu16.04+cuda10.1+cudnn7详解<br>
Linux Tools Quick Tutorial</p>


</div>
<div id="MySignature" role="contentinfo">
    行动是治愈恐惧的良药,而犹豫拖延将不断滋养恐惧。<br><br>
来源:https://www.cnblogs.com/tensorzhang/p/15357305.html
頁: [1]
查看完整版本: WSL-ubuntu常用操作