Linux系统管理命令
使用ifconfig查看网卡ip
netstat查看网络端口号
◆netstat-tulpn或者netstat-ano
netstat常用选项
查看进程&杀掉进程
◆ps -ef ◆kill -9 PID
可以使用grep进行筛选
应用服务化
◆应用服务化是指让应用程序以服务方式在系统后台运行 ◆Liux系统对服务化应用进行统一管理 ◆服务管理命令:systemctl
systemctl
将redis应用服务化,随着linux开启而启动,不用每次手动加载conf文件进行启动
先确定PID文件是否存在,进入redis文件夹
使用命令find / -name *.pid
找到一个文件/run/redis_6379.pid
,使用vim打开,里面保存的是pid号
或者使用grep进行搜索查看
里面保存的是进程编号,我们如果应用服务化后要进行重启或者杀进程就需要这个编号
记住文件位置/run/redis_6379.pid
,注意,重启后需要手动开启一次redis.conf文件,才会出现pid文件 ./src/redis-server redis.conf
打开路径/usr/lib/systemd/system
文件路径
看到里面大量文件都是以.service
结尾的,我们应用服务话也是这样的文件
我们需要新建一个servse文件,使用vim redis.servse
然后:wq
保存并退出
对所有service 进行重载,执行命令systemctl daemon-reload
在此之前需要杀掉启动的redis进程
然后输入命令启动systemctl start redis
CSDN
应用服务化简介
为什么需要应用服务化?
以为redis为例,阐述如下内容:
痛点一: 在Linux系统中安装redis后,启动redis、关闭redis、重启redis,都需要去redis的源代码目录,手动去调用文件:挺麻烦的!!!
痛点二: 而且,安装了redis后,我们可以通过在redis安装文件目录中,手动执行【./src/redis-server redis.conf】,去加载redis.conf,启动redis;但是,当我们关闭Linux系统或者重启Linux系统时候,redis都是自动被关闭了的;然后,如果我们还想启动redis,任然需要手动执行【./src/redis-server redis.conf】;手动启动redis,这么做当然是可以的,但是在实际中,一家公司的服务器有很多台,如果每台服务器重启后都要手动去启动redis,这个工作量太大。为此,就可以将redis进行服务化,这样以后redis就会随着系统的启动而自动启动,就不需要我们手动去启动redis了。
说白了有两个重要的痛点:(1)redis需要手动的去redis源代码目录,进行各种管理;(2)redis无法跟随Linux系统启动而自启动;
而,把redis设置成系统服务,就可以解决这个两个痛点。
应用服务化简介
(1) 应用服务化在Windows中也存在;
(2) 应用服务化的好处:通过简单的命令,就可以列出目前系统中正在运行那些服务,以及这些服务的工作状态如何,也可以通过服务管理命令对这些服务进行管理;
(3) 应用服务化的核心命令:systemctl(System Control:系统控制);
● 在把一个应用设置成应用服务化的过程 中 ,需要大量的调用systemctl命令;
● 在把一个应用设置成应用服务化的过程 后 ,也可通过调用systemctl命令,来管理这个应用;
(4) 【把一个应用程序以为服务的方式在后台运行】,也可以称作【把这个应用配置成系统服务】;
应用服务化的核心命令:【systemctl】及其子指令
【systemctl及其子指令】 要明确两点:
● 【在将一个应用设置成系统服务】的过程中,需要使用【systemctl及其子指令】;
● 【已经把一个应用设置成了系统服务后】,依旧可以使用【systemctl及其子指令】来管理这个应用;
systemctl是一个核心的命令,其涉及到了很多子指令:这些是在日常开发中,所使用到的systemctl的常用命指令;这些指令都是针对服务的;
案例:CentOS中将redis配置成系统服务
该案例以【redis的服务化设置】为例;
1.第一步:手动启动redis,并确定redis.pid文件的存在 启动redis后,确认redis是否有pid文件: 主要目的是:获取redis的pid文件的全路径
然后,这儿可以顺便看下pid文件的内容:
说明:
(1)redis的pid文件【redis_6379.pid】,是一个标识,保存的是当前进程的编号;如果,我们在redis服务化以后,在redis进行重启或者是关闭的时候,需要从redis的pid文件【redis_6379.pid】中读取进程编号,对其进行kill杀进程的操作;
(2) 在确认了redis的pid文件【redis_6379.pid】的文件名和路径后,就可以进行后续的动作了;
(3) 在配置redis为系统服务的过程中,是否需要在redis已经被手动启动的情况下设置,尚不明确;反正,自己在设置的时候,是在redis被手动启动的情况下设置的,然后也设置OK了;(这一点,待确认吧)。。即经过实测,有一点是明确的,redis没有启动的时候,在run目录下,是没有redis_6379.pid文件;
2.第二步:在【/usr/lib/systemd/system】目录下,创建并编写redis的服务描述文件:redis.service切换到system目录:
cd /usr/lib/systemd/system
查看system目录下的内容;可以看到该目录下的很多文件都是.service文件,这些是服务描述文件;
在system目录下,创建redis.service
这儿是通过vim命令直接创建的;
vim redis.service
如果想将redis进行服务化,需要在system目录中,创建一个redis的.service文件,这个.service文件的文件名就是服务名;
在redis.service中编写如下内容:
说明:
(1)第一个配置项[Unit]
●【Description=Redis】:这是个描述信息,来说明当前的服务是做什么的;这一项,纯粹是给读者看的;
●【After=syslog.target network.target remote-fs.target nss- lookup.target】:After是“什么什么之后的意思”,后面跟了很多系统服务;这儿的意思是,要在【syslog.target network.target remote-fs.target nss-lookup.target】这些服务启动后,才允许启动redis服务;这些服务,暂时不需要过度了解;以后,在设置其他应用程序的时候,这儿固定这样能写就行;
(2)第二个配置项【Service】
●【Type=forking】:描述服务的类型;forking代表后台运行;( PS:这儿注释掉了,因为,我们不要在redis的服务文件中,将redis设置为默认后台运行;而是后面将redis设置为系统服务后,可以通过systemctl命令,可以随时任性的设置redis是否是后台运行)
●【PIDFile=/run/redis_6379.pid】:这一项指向的,就是描述redis程序进程编号的pid文件;
●【ExecStart=/usr/local/redis-5.0.14/src/redis-server/usr/local/redis-5.0.14/redis.conf】:这一项,表示服务启动时使用什么命令。这儿需要书写应用程序的完整路径;
●【ExecStop=/bin/kill -s QUIT 变量,其具体值来自于redis的pid文件【redis_6379.pid】中的那个进程编号;即,在实际运行时,其会把【PIDFile=/run/redis_6379.pid】中的值代入到【$MAINPID】上;【-s QUIT】表示按照正常的流程,通知指定的进程去关闭应用,以前接触过【kill -9】;-9是比较粗暴的做法,是强制的删除进程,就行是直接拔电源一样;-s是通知进程按照正常的流程进行退出;在服务关闭时,建议使用-s,但是如果入到僵尸进程或者无法正常退出的进程,就需要使用-9了;
●【PrivateTmp=true】:代表为每一个服务设置私有的Tmp临时文件目录;
(3)第三个配置项【Install】:安装的配置项
●【WantedBy=multi-user.target】:将当前redis服务,分配到multi-user.target这个服务组上;multi-user.target是系统默认的服务组,系统为这个服务组分配了一个权限,允许multi-user.target服务组中所有的服务可以随系统启动而自动启动;即,只要把一个服务分配到multi-user.target这个服务组中,那么这个服务就可以随系统启动而自动启动了;
编写好了之后,Esc退出编辑模式,然后:wq保存并退出:然后,在system目录中,就有了redis.service这个redis的服务描述文件了;
3.第三步:重载【/usr/lib/systemd/system】目录下的.service,让【redis服务描述文件】生效使用【systemctl daemon-reload】命令,重载所有Service;
systemctl daemon-reload
至此,redis的服务化,就算是设置好了;然后,我们就可以使用服务化的systemctl及其子命令,来对redis这个应用进行各种操作了。 然后,我们就不用去redis的源代码目录,去操作redis了;也就是,经过上面的设置后,我们可以借由systemctl这个系统命令,从系统层面上对redis进行统一管理了。
进行接下来的操作前,需要把原先手动开启的redis给关掉(Ctrl+C);
应用服务演示一:systemctl start redis:启动redis服务
systemctl start redis
应用服务演示二:systemctl status redis:查看启动后的redis状态
systemctl status redis
应用服务演示三:systemctl stop redis:关闭redis服务
systemctl stop redis
应用服务演示四:systemctl restart redis:重启redis服务
应用服务演示五:systemctl enable redis:设置redis开机自启
systemctl enable redis
可以看到,在【multi-user.target】分组下增加了redis.service,然后其指向了我们编写的那个resis.service配置文件;我们将这个称为“软关联”,软关联类似于Windows中的快捷方式,即 【multi-user.target分组下的redis.service】就像是一个快捷方式,具体执行的时候,还是需要去/usr/lib/systemed/system目录下去加载redis.service;
应用服务演示六:systemctl is-enabled redis:查看redis,是否已经设置为了自启动
systemctl is-enabled redis
验证【自启动】:设置为redis自启动后,可以shutdown -r now重启系统,验证一下
应用服务演示七:systemctl disable redis:设置redis开机不自启
systemctl disable redis
然后,设置redis开机不自启后,通过【systemctl is-enables redis】命令,可以看到redis已经disabled了。
验证【不自启动】:设置为redis不自启动后,可以shutdown -r now重启系统,验证一下
应用服务演示八:systemctl list-unit-files:查看当前系统中,所有的服务的当前状态
systemctl list-unit-files
自然可以使用通道技术,筛选出目前自启动的服务:
systemctl list-unit-files | grep enabled
如Tomcat,redis,MySQL这种重要的中间件,就可以把其设置为系统服务,这样以后就可以借由systemctl及其子命令,对其进行统一管理,然后也可以设置其为自启动;
Linux用户与用户组管理
用户
◆Linux是多用户多任务系统,包含两个概念:用户与用户组 ◆用户与账户是同一概念,用于登录系统与区分资源权限 ◆用户让系统变的更安全,同时也保护了用户的个人数字资产
(1) 任何想登录Linux系统的人,都必须给他一个用户(或称账户),然后这个人使用这个用户去登录Linux系统;
(2) 不同的用户,可以设置不同的权限;某用户创建的东西,可以设置哪些人可以读写,哪些人不能读写;
用户组
◆用户组就是将用户分组,隶属用户自动拥有组权限 ◆一个用户可隶属于多个组,用户可任意切换当前组 ◆用户组的出现让用户权限管理变更轻松
按照用户在现实中的某种特性,对这些用户进行分组,就称作用户组;比如,在实际公司中,有研发组、测试组、运维组,不同的组有不同的权限;
(1) 组权限:用户组能够访问的文件和目录的权限;
(2) 一个用户可以隶属于多个组,但是在系统访问的时候,同一时间只能有一个组为当前组;
(3)确实,管理员不用给一个新的用户手动去设置各种权限,只要根据该用户的职责将其分配到对应的用户组中就可以了;这种方式,也方便管理用户权限,尤其是在人比较多的公司中,优点更加明显;
用户与用户组常用命令
(1) usermod:将用户原有分配的用户组先删除,再进行重新分配;
(2) chown:就是变更对应文件或目录的所有权;
案例
案例介绍:假设当前是一个下项目组,主要包含开发组、测试组这两组人员;这两组人员所能访问的文件是不一样的,研发人员可以访问源代码和开发手册,测试人员主要是在服务器上创建对应的测试用例文档;这两组人彼此所创建的文件,应该隔离开,不能出现互相修改和访问的情况;所以,下面的案例就是分别创建研发用户、测试用户;研发组,测试组,并给用户分配组;
声明,设置用户和用户组的操作都是在root管理员账户下操作的;
使用 【useradd命令】,创建三个账户; 比如,公司中有两个开发(developer),一个测试(tester);登录root管理员账户,
使用 【passwd命令】给用户设置密码;
d2和t1账户设置密码,同理;
利用 【groupadd命令】,创建新的用户组;
创建了developer开发组,testor测试组;
使用 【usermod命令】给用户分配组;
把d1和d2账户分配到developer研发组;t1账户分配到testor测试组;
登录d1,d2,t1三个账户;
然后,粘贴三份:为登录d1,d2,t1三个账户做准备;
然后,再在粘贴的副本中,去修改用户名和密码:
然后,就愉快的以d1账户的身份登录了:
d2账户和t1账户同理:
使用 【groups命令】查看,当前用户隶属于哪个组;
主机名:附加说明:
Linux文件权限设置
一:文件或目录的【权限】、【属主拥有者】、【所关联的用户组】简介
权限代码介绍:
(1) d:directory;r:read;w:write;x:execute;
(2) 第一组权限(红色部分,1-4位):【“创建这个文件或目录”的属主】,对于这个文件或目录有什么权限;
(3) 第二组权限(棕色部分,5-7位):与【“创建这个文件或目录”的属主】位于相同用户组下的其他用户,对于这个文件或目录有什么权限;
(4) 第三组权限(蓝色部分,8-10位):剩余的其他用户,对于这个文件或目录有什么权限;
(5) 如果在对应位置上,有对应的字母,就表示有对应的权限;如果是-就表示,没有对应权限;
上面的意思是:d表示这个一个目录,root用户对dev-document目录拥有读、写、执行权限;(对于目录来说,读就是查看目录的文件列表;写就是修改这个目录的名称;执行就是进入这个目录 );root同用户组的其他用户对dev-document目录拥有读、执行权限;剩余的其他用户对dev-document目录拥有读、执行权限;
(6) 第二行的数字,是对应权限的权重;(本篇博客的后面,会介绍这部分的用处)
二:用户与用户组常用命令
(1) usermod:将用户原有分配的用户组先删除,再进行重新分配;
(2) chown:就是变更对应文件或目录的所有权;
在 【Linux进阶三:Linux用户与用户组管理;】已经演示了【useradd】,【passwd】,【usermod】,【groupadd】,【groups】命令;本篇博客演示剩余的【chown】,【chmod】,【newgrp】命令;
三:案例
使用 【chown命令】更改目录或文件的属主和用户组;
因为,dev-document目录是root用户创建的,又因为dev-document目录是隶属于研发部的,自然dev-document目录管理权要由【root超级管理员】移交给【研发组(也就是developer用户组)的负责人员】(这儿假设d1用户,是developer研发组的负责人);
使用 【chmod命令】更改目录或文件的权限;
可以发现,dev-document目录原先的访问权限是【drwxr-xr-x】,即developer用户组以外的用户也可以访问并执行dev-document目录,这不是我们想要的样子。我们希望,developer用户组以外的其他用户,不能够访问dev-document目录;所以,使用【chmod命令】修改一下dev-document目录的权限;
修改dev-document目录权限以后,可以发现,不属于developer用户组的t1用户,是无法访问dev-document目录的;
说明
(1)上面案例中的750解释:看图好吧,很容易理解的;
(2)chmod命令常见的权限设置值:
又比如,研发团队的负责人d1,准备创建一个文件,公司的所有研发人员(也就是,所有developer用户组中的用户啦)都可以对其进行维护;
在这个code.md文档中,随便写点东西;
(上面例子也可以发现,某个用户创建的文件,其他用户对这个文件的默认权限是只读;)
为了,实现我们的目的:【公司的所有研发人员(也就是,所有developer用户组中的用户啦)都可以对其进行维护】,需要修改这个文件的权限;
然后,此时同属developer用户组的d2用户,就可以读写code.md文件了;
**使用 【newgrp命令】**切换用户当前用户组;
………………………………
首先, 使用【usermod命令】重新给d1用户分配用户组:为了能够演示,切换用户的当前用户组,先给d1用户重新分配用户组:
说明:
(1)上面的G是大写的G哦;大写的G就是一次性的给某个用户,赋予多个用户组;
(2)即使,d1用户已经属于developer用户组了,这儿还是需要写上developer;因为,usermod命令在执行的时候,其会删除d1用户之前的用户组,然后再重新添加;
(3)然后,就可以通过【groups d1】查看d1用户的所有用户组了;即,此时d1用户,同时存在于developer和testor两个用户组;
但是,我们给d1分配了新的用户组,如果想让其生效,需要关掉d1用户的连接,重新连接:
然后, 就可以使用【newgrp命令】切换d1用户的当前用户组了;
如果,d1想要访问testor用户组中下的资源,需要使用【newgrp命令】,将d1用户的当前组切换到testor用户组上:
sudo获取超级管理员权限
一:sudo命令介绍
(1) sudo是一个命令,(已经被授权的)普通用户,可以通过sudo命令去执行那些【“只有超级管理员root账户才能够执行”的命令】
●对于Linux系统,最高级用户root管理员账户,全局只有一个,root用户主要用于管理系统中的用户,用户组等系统中最关键的对象;root用户是全局唯一的,所以root用户的持有者(系统管理员)要无时无刻的对系统进行有效管理;
●但是,可以假设,比如root账户的持有者A(系统管理员),因故要有几天不能工作,此时由另一个同事B暂代“系统管理员的任务”,A总不能把root用户的密码告诉B吧(这涉及到个人隐私);
●此时,比较不错的做法是,A(通过root用户)创建一个新的用户,并为这个新用户进行超级管理员的授权,然后把这个新用户交给B;然后,B在这个新用户中,就可以使用sudo命令,来执行“只有超级管理员才能够执行的命令了”;
(2) 一个普通用户,只有被超级管理员root用户授权后,才能够使用sudo命令;
(PS:演示sudo ls时,也是如此;)
(3) visudo:(vi是只文本编辑器,sudo是sudo命令本身):超级管理root用户使用【visudo】来给某个普通用户授权;
二:案例
1.root管理员账户,使用【visudo】给某个普通用户d1授权
输入快捷命令【100gg】(其实就是vim文本编辑器,在普通模式下的一个快捷命令啦):快速定位到100行;
我们需要在100行的地方,编辑一些配置内容:(因为,visudo是通过vim编辑器打开的这个文件)按i进入(vim)的编辑模式,
当写完后,【Esc】切回到普通模式,然后【:wq】保存并退出vim;
然后,使用【visudo -c】:-c的意思是对【sudoers这个授权文件】的检查,因为这个文件太重要了,这个文件一旦出问题,就可能造成系统无法启动,或者无法远程连接的情况;所以,每次编辑完后,一定要调用【visudo -c】对这个文件进行格式检查;
此时,d1用户可以通过sudo命令去执行那些【“只有超级管理员root账户才能够执行”的命令】
2.被授权的d1用户,使用sudo命令
【useradd命令,是只有root管理员账户才能够调用的】:
(然后,可以发现,第二次使用sudo命令的时候,这儿就没再让输入密码了)
注:一个无伤大雅,但目前存在迷惑的点:sudo + 【普通用户就能执行的命令】
3.root管理员账户,使用【visudo】给某个普通用户d1授权后,同时让d1在使用sudo的时候,无需输入d1的密码
如何让d1用户,每次使用sudo的时候,不用输入d1的密码嘞?
当写完后,【Esc】切回到普通模式,然后【:wq】保存并退出vim;
验证,关闭d1连接,重新连接;
在实际中,建议少用sudo命令!
FireWall防火墙设置实战
一:防火墙简介
(1) 职能一:主动防御来自于外部网络的攻击;职能二:对内,服务器内部的网络资源对外暴露时,加以控制;
(2) ● CentOS6基于iptables(ip表):在七层协议中的网络层进行控制;
●CentOS7基于firewall:在七层协议中的应用层,即应用层防火墙;(应用层防火墙,可以更加细粒度的对防火墙进行设置,同时也可以对应用程序进行有效的控制)
(3) 【firewall-cmd命令】是CentOS中防火墙设置的核心命令;
二:案例演示:(以【对外开放Tomcat的端口】为例)
准备工作:在CentOS 7中安装Tomcat
(1)首先,获取Tomcat的源代码
(2)在CentOS7中,以【编译方式】安装Tomcat、启动Tomcat;
(【编译方式】安装软件,可以参考Linux入门十一:CentOS软件方式之:【编译方式】安装和卸载程序;(以安装Redis为例演示))
startup.sh是Tomcat在Linux中的启动脚本程序,这个脚本称之为shell(下篇博客会介绍shell);
(3)Tomcat启动成功后,如何访问?(会看到:Linux本机访问没问题,远程访问不行;(因为Linux没开放Tomcat的端口))
在Linux本机访问,没问题,但是如果远程访问呐?
之所以不能访问,是因为CentOS是有防火墙的;默认情况下,CentOS虚拟机并不对外开放8080端口,即【从远程,向虚拟机发送的所有8080端口的请求,都会被CentOS的防火墙挡住】;为解决这个问题,只需要设置防火墙放行8080端口就可以了;
CentOS 7 通过【firewall-cmd防火墙命令】设置端口开发
说明:【firewall-cmd命令】是防火墙的核心命令,通过这个命令可以对防火墙进行各种操作;
(1)设置单个端口的开放和关闭
【firewall-cmd —state】:查看防火墙是否已经开启:
【firewall-cmd —list-ports】:查看当前防火墙放行了哪些端口:
【firewall-cmd —zone=public —permanent —add-port=8080/tcp】:放行8080端口
【firewall-cmd —reload】:重载防火墙规则,使更改生效 ;
【firewall-cmd —zone=public —permanent —remove-port=8080/tcp】:不开放8080端口了,如何移除?
(2)设置一个端口范围的开放和关闭
【firewall-cmd —zone=public —permanent —add-port=8000-9000/tcp】:放行一个区域的端口:比如放行8000-9000的端口:
【firewall-cmd —zone=public —permanent —remove-port=8000-9000/tcp】:关闭一个区域的端口:
CentOS中部署的网络应用程序,比如Tomcat、redis、MySQL等,这些都是基于网络进行通信的,我们除了把这些软件安装好了以外,还需要在防火墙中放行对应的端口;
Bash Shell入门
说明:shell到底是啥? (本部分参考自:【C语言中文网】中的【Shell是什么?1分钟理解Shell的概念!】)
● Shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质;
● 简而言之,用户通过shell,可以在系统上完成一些操作;(而不用像在Windows上那些,各种使用鼠标键盘去操作);
一:shell简介
1.shell引入
(1) 【自己编写的一些脚本文件】经过【shell解释器这个程序】的解释,可以实现一些对系统的操作;
比如Windows中的bat:
写了一个测试用的search.bat:
这个search.bat脚本可以被Windows执行;双击这个文件就可以在Windows中执行了:
至于,search.bat中的代码,是由Windows中的解释程序去解析执行的;
对于Linux也是同理,Linux提供了(由C语言编写的)shell这个解释器,可以执行Linux中的脚本;让用户可以通过代码的方式,来批量的完成一些复杂的操作;
(2) 在Linux中,脚本一般是shell脚本,脚本文件一般是.sh文件;
(3) 在Linux中,解释执行【.sh脚本】的解释器有很多种;
2.Linux中解释器分类
(1) 【Bourne Shell】:发布时间比较长了,有些特性相对落后,已经很少用了;
(2) 【Bourne Again Shell】:即通常说的bash;bash是目前大多数Linux发行版所提供的默认的【shell脚本文件的解释器】;
【Bourne Again Shell】可以看成是【Bourne Shell】的升级版,其提供了很多额外的功能(比如自动补全,以及更加丰富的解释器特性)
(3) 【C Shell】、【K Shell】、【Shell for Root】都不太常用;
(4) 不同的shell解释器,都有自己独立的特性和相关的语法;即,比如针对【Bourne Again Shell】开发的shell脚本文件,使用【C Shell】可能会无法执行,因为不同的解释器的部分命令或语法是不同的;
(5) 在大多数情况下,使用【Bourne Again Shell】作为shell脚本的解释器;这也是CentOS默认的shell解释器;
二: 案例:以编写一个【下载、解压、启动Tomcat】的脚本为例
(1)首先,先清理掉/usr/local目录下的Tomcat文件,防止干扰
(2)然后,创建脚本文件
(3)按【i】进入编辑模式,编写如下内容:
说明:
(1)【echo命令】:在运行过程中,屏幕上显示其后面的文字;
(2)【wget命令】:从指定的网址下载对应的文件到当前目录;
(3)在解压Tomcat压缩包的时候,使用的是【zxf】而不是【zxvf】,没有使用v的目的是,这儿我们就不显示解压的过程了;
(4)解压后,进入到Tomcat的bin目录,执行startup.sh就行了;
(4)脚本写好后,按【Esc】退出编辑模式,然后:wq退出;
(5)那么这个脚本写好了,如何调用?