Linux
1 介绍
-
Linux 是一个开源、免费的操作系统,具有很强的稳定性、安全性、以及处理多并发的能力,目前大多数企业级应用甚至是集群项目都部署运行在 Linux 操作系统上,很多软件公司考虑到开发成本都首选Linux,Linux 在中国软件公司得到了广泛的使用。
-
Linux 的主要发行版本有以下几种:
Ubuntu(乌班图)、RedHat(红帽)、CentOS、Debain(蝶变)、Fedora、SuSE、OpenSUSE、红旗Linux(国产)。
我们使用 CentOS 进行学习。
2 安装
- VMware12 虚拟机。
- CentOS 镜像系统。
3 Linux 的目录结构
- /:Linux 系统的根目录。
- root:该目录为系统管理员目录,root 是具有超级权限的用户。
- bin:存放常用的命令文件,如cd、ls等等。
- sbin:存放系统管理员使用的系统管理命令。
- home:用户的主目录,每创建一个用户都会生成一个该用户对应的家目录:/home/用户名/,一般该目录名以用户的账号命名,叫作用户的家(根)目录;用户登录以后,默认打开自己的家目录。
- lib:这个目录存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件,几乎所有的应用程序都需要用到这些共享库。
- etc:这个目录存放 Linux 系统的所有配置文件。
- usr:Linux 的系统资源目录,里面存放的是一些系统可执行文件或者系统的一些文件库。
- boot:这个目录存放启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。
- tmp:该目录用来存放临时文件。
- dev:dev是 Device(设备)的缩写,该目录下存放的是 Linux 的外部设备,Linux 中的设备也是以文件的形式存在。
- media:识别出的外设设备挂在在该目录下。
- mnt:系统提供该目录是为了让用户临时挂载别的文件系统,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容。
- opt:存放 Linux 中额外安装的软件的安装包。
- /usr/local/:安装包安装成功之后解析出的所有程序文件所在的目录。
- var:存放在不断扩充的东西,例如将那些经常被修改的文件存放在该目录下,如运行的各种日志文件等。
- bin ->usr/bin:存放系统预装的可执行程序,这里存放的可执行文件可以在系统的任何目录下执行。
4 远程操作工具
- Xshell:远程终端。
- Xftp:远程文件传输。
5 vi 和 vim 编辑器
vi 和 vim 是 Linux 提供的文本编辑器。
- 三种模式:
模式 | 进入方法 |
---|---|
正常模式 | vim 文件名 ,进入正常模式。若文件存在,则打开文件;若文件不存在,则新建并打开文件。正常模式下只能进行读操作。 |
编辑模式 | 在正常模式下,按a 或i ,进入编辑模式,按ESC ,退出编辑模式。在编辑模式下可以进行读写操作。 |
命令模式 | 在正常模式下,输入: ,进入命令模式。命令模式下,输入 q :文件没有做任何修改时退出;wq :保存并退出;q! :不保存强制退出。 |
- 快捷键:
快捷键 | 功能 |
---|---|
yy | 复制光标所在行 |
nyy | 复制光标所在行向下 n 行(包括光标所在行) |
p | 粘贴到光标所在行的下一行 |
dd | 删除光标所在行 |
ndd | 删除光标所在行向下 n 行(包括光标所在行) |
u | 撤销上一次操作 |
gg | 跳转到首行 |
G | 跳转到尾行 |
/xxx | 搜索 xxx,在命令模式下使用 |
set nu | 显示行号,在命令模式下使用 |
set nonu | 关闭行号,在命令模式下使用 |
注意:前8个快捷键在正常模式下使用,后3个快捷键在命令模式下使用。
将光标移动到第n行:
(1)set nu 显示行号
(2)输入 n
(3)按下 shift + g
6 用户管理
root 账户,具有 Linux 系统的最高权限,可以进行用户管理操作。
在 root 账户下,使用命令:
-
useradd 用户名
:添加用户。
该命令执行后,会有三个操作:
(1)创建用户
(2)创建用户根目录 /home/用户名
(3)创建主组,组名为用户名,并把该用户添加到该组中。
也可以在创建用户时,指定用户根目录:useradd -d /home/目录名 用户名
。 -
passwd 用户名
:为用户设置密码。密码不能少于7位,不能过于简单,不能是单词的组合。 -
userdel -r 用户名
:删除用户以及用户根目录。userdel 用户名
:只删除用户,不删除用户根目录。 -
id 用户名
:查看用户信息。主要用于查看用户的组信息。 -
su 用户名
:切换用户。从 root 切换到普通用户可以直接切换;从普通用户切换到 root 或者普通用户之间相互切换需要输入密码。 -
logout
:注销。只在使用 xshell 这种远程控制软件操作 linux 系统时生效,注销后会同时断开与服务器的远程连接;在 linux 系统本机上输入该命令时无效。 -
whoami
:查看当前用户。 -
usermod -g 新组名 用户名
:改变用户所在组。 -
usermod -d 新家目录名 用户名
:改变用户的家目录。注意:为防止使用root账户登录时权限过大,可以使用普通用户登录, 在有需要使用更高权限时,使用su命令切换到管理员账户。
7 组
组是 Linux 中,进行权限管理的基本方式。可以将具有相同权限的用户放在同一个组中,便于管理。
groupadd 组名
:新建组。groupdel 组名
:删除组。gpasswd -a 用户名 组名
:将用户添加到组中。gpasswd -d 用户名 组名
:将用户从组中删除。useradd -g 组名 用户名
:创建用户时指定用户所在组(此时不会创建默认组)。
8 用户和组相关的文件以及 linux 的运行级别
8.1 用户和组相关的文件
/etc/passwd
:用户配置文件(存储用户的相关信息),【文件中每行含义】用户名:密码(已加密):用户id:组id:家目录:shell/etc/group
:组配置文件(存储组相关信息),【文件中每行含义】组名:密码(已加密):组id:组内用户列表(一般不显示)/etc/shadow
:口令配置文件(存储口令相关信息,文件内容以加密形式存在)
8.2 linux 的运行级别
Linux 系统有7个运行级别:
级别 | 含义 |
---|---|
0 | 关机 |
1 | 单用户(找回密码或不小心设置成0或6级时可以使用) |
2 | 多用户无网络 |
3 | 多用户有网络 |
4 | 保留 |
5 | 图形界面 |
6 | 重启 |
-
/etc/inittab
:该文件是系统运行级别的配置文件 -
init [012356]
:修改运行级别,注意4为保留,不可用。root 密码丢失,如何找回密码? 原理:单用户模式下,以root身份登录,不需要输入密码。 步骤:开机时,在引导界面快速多次敲击enter键,进入新界面,按下e键之后,选择kernel行, 再次按下e键,进入到配置文件界面,输入1(运行级别设置为1:单用户),回车,最后按下b键, 系统重新启动,之后可以使用passwd命令修改root密码。详细步骤可以百度搜索。 ------------------------------------------------------------------------------ 注意:上述方法仅限于能够直接操作linux服务器,远程控制软件不可以(因为忘记密码,连接不上服务器)。 因为只有能够直接接触到linux本机的人员才可以使用上述方法修改密码,所有该人员一定是具备了很高的 权限,所以对linux系统本身的安全性不会构成额外的威胁。
9 系统命令
-
shutdown now
:立即关机,同halt
。 -
shutdown -h 时间
:定时关机。时间可以为数字,单位为分钟;也可以为具体时间,如17:00。 -
shutdown -r now
:立即重启。 -
shutdown -c
:取消上一条 shutdown 命令。 -
reboot
:立即重启。 -
sync
:把内存的数据同步到磁盘。注意:关机或重启之前,建议先sync同步一下数据,以免数据丢失。
10 帮助命令
man 命令名
:查看该命令的系统说明文档。分屏显示,Enter
:下一行,空格
:下一页,q
:退出。help 命令名
:查看该命令的开发注释。
11 目录、文件操作
11.1 pwd、ls
pwd
:查看当前所在目录的全路径。ls [选项] [目录名]
:查看指定目录下的所有目录和文件。ls
:查看当前目录。ls /home
:查看 home 目录。ls -a /home
:查看 home 目录下 (包括隐藏和虚拟的) 所有目录和文件。ls -l /home
:以列表形式展示 home 目录下的所有目录和文件。ls -al /home
:以列表形式展示 home 目录下(包括隐藏和虚拟的)所有目录和文件。
11.2 cd
cd 目录名
:切换目录。- 绝对目录:从盘符根路径开始。Linux 只有一个根路径 /。如,
cd /home/mcc
:进入 mcc 目录。 - 相对目录:从当前目录开始。假设当前在 home 目录,
cd mcc
:进入 mcc 目录。 ~
:绝对目录,当前用户的根目录。~ = /home/用户名。cd ~
:进入用户根目录。..
:相对目录,当前目录的上一级目录。cd ..
:进入上一级目录。.
:相对目录,当前目录。cd ./xxx = cd xxx
:进入当前目录下的 xxx 目录。
11.3 mkdir、rmdir
mkdir [选项] 目录名
:创建单级目录。如,mkdir ./dir
:在当前目录下创建 dir 目录。mkdir -p 目录名/目录名
:创建多级目录。mkdir -p ./dir1/dir2
:在当前目录下创建 dir1 和 dir2 目录(这两个目录之前都不存在)。rmdir 目录名
:删除一个空目录,删除非空目录见11.6。
11.4 touch
touch 文件名列表(多个文件名用空格隔开)
:创建一个或多个空文件。如,touch text1.txt text2.txt
。创建后,如果需要编写内容,可以用 vi 或 vim 打开。
vi 或 vim 创建的文件会默认直接打开。如果需要创建之后马上打开编辑,可以使用 vi 或 vim 创建;如果只需要创建,不需要打开,可以使用 touch 创建。
11.5 cp
cp [选项] sourceFile dest
:将 sourceFile 复制到 dest (复制单个文件)。如,cp text.txt dir/textcp.txt
:将 text.txt 复制到当前目录下 dir 文件夹下,文件名为 textcp.txt。cp -r sourceDir dest
:将 sourceDir 以及其中的文件,复制到 dest (复制目录和目录中的文件)。如,cp -r dir /home/mcc/
,将 dir 目录和其中的文件,复制到 /home/mcc/ 下。
注意:使用 cp 复制文件(目录)时,若有同名文件(目录)会逐个提醒是否覆盖原文件(有几个重名就提醒几次),若不需要提示,全部覆盖原文件,可以使用命令\cp
。
11.6 rm
rm 文件名 文件名...
:删除文件。会提示是否确认删除。rm -f 文件名 文件名...
:强制删除文件。不提示是否确认删除。rm -r 目录名
:删除目录以及目录中的文件。会提示是否确认删除。执行流程:先进入到目录中,删除目录中的全部文件,再删除该目录。rm -rf 目录名
:强制删除目录以及目录中的文件。不提示是否确认删除。
11.7 mv
命令 | 结果 |
---|---|
mv file dir | (1)dir 存在,将 file 移动到 dir 下。 (2)dir 不存在,将 file 重命名为 dir。 |
mv dir1 dir2 | (1)dir2 存在,将 dir1,包括其中的子目录和文件,移动到 dir2 下。 (2)dir2 不存在,将 dir1 重命名为 dir2。 |
mv file1 file2 | 将 file1 重命名为 file2,若 file2 已经存在,则会将 file2 覆盖。 |
11.8 cat
cat [选项] 文件名
:以只读形式,查看文件内容。cat -n 文件名
:显示行号。
11.9 more
more 文件名
:以只读、全屏方式,按页显示文件内容。
11.10 less
less 文件名
:分屏查看文件内容,功能与 more 指令类似。less 指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示加载内容,在显示大型文件时具有较高的效率。
11.11 head
head 文件名
:默认查看文件的前 10 行内容。head -n num 文件名
:查看文件的前 num 行内容。如,head -n 5 test.txt
:查看 test.txt 的前 5 行内容。
11.12 tail
tail 文件名
:默认查看文件的最后 10 行内容。tail -n num 文件名
:查看文件的最后 num 行内容。如,tail -n 5 test.txt
:查看 test.txt 的最后 5 行内容。tail -f 文件名
:实时追踪该文件的所有更新。
11.13 echo
echo 输出内容
:在控制台输出变量或常量的内容。其中,变量要用$变量名
表示。如,echo $PATH
:输出环境变量值;echo Hello, Linux
:输出 Hello, Linux。
11.14 >、>>
查看命令 > 文件
:写入。将查看命令查出的结果保存到指定文件中。若文件不存在,则新建文件再保存;若文件存在,则直接保存。若两次操作指定的文件相同,则后一次查看的结果会覆盖前一次。如,ls > res.txt
:将当前目录下的所有目录名和文件名,保存到 res.txt 中。如果再执行,ls test.txt > res.txt
:则会覆盖文件中原有内容,将本次查看结果保存到 res.txt 中。查看命令 >> 文件
:追加。与 > 类似,只不过新的查看结果会追加在文件的原有内容之后,不会覆盖。
12 日期与时间
日期与时间:
date
:查看系统的日期与时间。date +%Y
:查看年份。date +%m
:查看月份。date +%d
:查看日期。date '+%Y-%m-%d %H:%M:%S'
:以 年-月-日 时:分:秒 的格式查看系统日期和时间。date -S '年-月-日 时:分:秒'
:设置系统日期和时间。
日历:
cal
:查看当前月份的日历。cal 年份
:查看某一年的日历。
13 搜索目录与文件
find:
find [搜索范围] [搜索标准] 关键字
:按条件搜索。- 搜索标准:
-name
:按名称查找,默认,文件或目录所在的路径也在搜索范围之内。-size
:按大小查找。-user
:按用户权限查找。 - 举例:
- 查找当前目录下名称中包含 a 的 txt 文件:
find *a*.txt = find -name *a*.txt
。其中,*
是 Linux 系统中的通配符。 - 查找当前目录下所有名称包含 d 的目录和文件:
find *d*
。 - 查找 etc 目录下所有 txt 文件:
find /etc *.txt
。 - 查找 etc 目录下文件大小小于 5M 的 txt 文件:
find /etc -size -5M -name *.txt
。 - 查找 etc 目录下,所有者是 mcc 的目录和文件:
find /etc -user mcc
。
- 查找当前目录下名称中包含 a 的 txt 文件:
注意:+ 表示大于,- 表示小于,不写表示等于。
locate:
locate 关键字
:在 Linux 系统的目录树中查找满足条件的目录和文件。
因为新建的目录和文件不能及时同步到目录树中,因此使用该命令之前,需要先同步目录树:updatedb
,再使用 locate 命令查找。
14 过滤查找
查看或搜索命令 |grep [选项] 过滤条件
:对查看或搜索的结果进行进一步过滤。
选项:-n
,显示匹配行的行号;-i
,匹配时忽略大小写。
注意:grep xxx是将所有名称包含xxx的记录都过滤出来。|
:管道符,表示将前一个命令的处理结果,传递给后面的命令处理。- 举例:
find *.txt |grep a
:查找名称包含 a 的 txt 文件。
cat text.txt |grep -ni abc
:查找 text.txt 中的 abc(忽略大小写),并显示 abc 所在行号。
15 压缩
15.1 gzip、gunzip
gzip 被压缩文件名
:压缩单个文件,后缀名为.gz
,并删除被压缩的文件。gunzip gz压缩包名
:解压 gz 压缩包,解压完成后删除压缩包。
15.2 zip、unzip
zip 压缩包名 被压缩文件列表或目录列表
:压缩单个或多个文件和目录,后缀名为.zip
。不会删除被压缩的文件和目录。unzip 压缩包名
:将压缩包解压到当前目录下。原压缩包不会被删除。unzip 压缩包名 -d 解压目录
:将压缩包解压到指定目录下。
15.3 tar
tar -zcvf 压缩包名 被压缩文件列表或目录列表
:压缩单个或多个文件和目录,后缀名为.tar.gz
。不会删除被压缩的文件和目录。tar -zxvf 压缩包名
:将压缩包解压到当前目录下。原压缩包不会被删除。tar -zxvf 压缩包名 -C 解压目录
:将压缩包解压到指定目录下。- 选项说明:
-c:压缩
-x:解压
-z:打包同时压缩
-f:指定压缩后的文件名
-v:显示详细信息
-C:指定解压到哪个目录
16 文件、目录与组的关系
在 Linux 系统中,每个用户都有一个主组,主组时是创建用户时必须要指定的,并且不能修改。每个用户可以有多个额外组,这些额外组表示用户的其他权限。
对于文件和目录来说,每个文件和目录都有自己的所有者和组,只有所有者和相同组的用户,才有操作权限。
使用命令ls -l
查看文件和目录的所有者、所在组。
16.1 修改文件或目录的所有者
chown 新的所有者 文件或目录名
:不会修改目录内的文件(目录)的所有者。chown -R 新的所有者 文件或目录名
:修改文件或目录的所有者,包括目录内的文件和目录。chown [-R] 新的所有者:新的所在组 文件或目录名
:同时修改所有者和所在组。
16.2 修改文件或目录的所在组
chgrp 新的所在组 文件或目录名
:不会修改目录内的文件(目录)的所在组。chown -R 新的所在组 文件或目录名
:修改文件或目录的所在组,包括目录内的文件和目录。
17 权限管理
17.1 文件和目录的权限
对于用户来说,一个用户只有一个主组,但可以有多个副组。
对于文件和目录来说,一个文件或目录只能有一个所有者,一个所在组。
文件和目录的权限:
类型 | 权限 |
---|---|
文件 | (1)读 read:查看文件,如 cat、more、less、head、tail 等。 (2)写 write:编辑文件,如 vi、vim 等。 (3)执行 execute:运行可执行文件(.sh 文件)。 |
目录 | (1)读 read:查看目录内容,如 ls 等。 (2)写 write:在目录内创建、删除、重命名子目录或文件等。如 mkdir。 (3)执行 execute:进入该目录,如 cd 等。 |
17.2 查看权限
使用ls -l
查看文件和目录的权限:
r
:读权限。w
:写权限。x
:执行权限。
17.3 修改权限
如果要修改一个文件或目录的权限,那么该用户必须具有对这个文件或目录的w
权限。
如果要删除一个文件或目录,那么该用户必须具有对这个文件或目录的上层目录的w
权限。
修改权限:
chmod
:修改文件或目录权限。u
、g
、o
、a
:分别对应所有者、同组用户、其他组用户、所有用户。+
、-
、=
:分别对应添加、删除、设置某个权限。r
、w
、x
:分别对应读、写、执行权限。- 举例:
(1)删除 test.txt 同组用户的编辑权限:chmod g-w test.txt
;
(2)删除 test.txt 同组用户的读取和编辑权限:chmod g-rw test.txt
;
(3)为 test.txt 的同组用户添加执行权限,并删除其他用户的读取权限:chmod g+x,o-r test.txt
。
17.4 用数字的方式修改权限
rwx 权限可以用数字的和来表示:r-4, w-2, x-1
若权限为读和写,则可以使用 6,来代替 rw。
注意,如果使用数字设置权限,则必须将 u、g、o 的权限同时设置,也就是说必须三组数字一起使用。
举例:
将 test.txt 所有者权限设置为 rwx,同组用户为 rw,其他用户没有任何权限:chmod 760 test.txt
。
18 网络配置
-
获取 ip 地址,网关,DNS。如果是自己的电脑,按照下面的方法查看,如果是公司服务器,则公司会提供,只需设置进去就可以。
-
网络的配置文件在 /etc/sysconfig/network-scripts 目录下:
cd /etc/sysconfig/network-scripts
-
使用 vi 或 vim 编辑器打开配置文件,进行配置。
-
配置完成后,要重启 Linux 系统,才会生效:
reboot
。 -
配置完成后,可以使用:
ifconfig
,查看 ip 地址。
19 进程管理
-
查看进程:
查看 Linux 系统正在运行的进程:ps -ef
。
可以通过过滤功能,查看指定进程是否运行:ps -ef | grep xxx
。 -
关闭进程:
使用命令:ps -ef
,查看进程的 PID
使用命令:kill -9 PID
,关闭 PID 进程。
killall 进程名
:支持通配符,例如关闭所有名称以a开头的进程:killall a*
。 -
使用查看进程命令之后显示的信息及其含义:
USER:用户名
PID:进程号
%CPU:占用CPU的百分比
%MEM:占用内存的百分比
VSI:占用虚拟内存的大小kb
RSS:占用物理内存的大小kb
TTY:使用的终端
STAT:运行状态 S-sleep,R-run,Z-zoom僵死
START:启动时间
TIME:占用CPU时间
20 服务管理
systemctl [start|stop|restart|reload|status|enable] 服务名称
start:开启服务。
stop:停止服务。
restart:重启服务。
reload:重新加载数据、配置文件等。
status:查看服务状态。
enable:将服务设置为开机启动。
防火墙服务:firewalld
21 软件包管理
21.1 RPM 包
- 查看当前系统中已经安装的 RPM 包:
rpm -qa
,查看是否安装 xxx 包:rpm -qa | grep xxx
。 - 安装 RPM 包:
rpm -ivh xxx.rpm
。 - 卸载 RPM 软件:
rpm -e 软件名称
。
21.2 YUM 包
YUM 包基于 RPM 包,类似于 Maven,不需要处理软件包之间的依赖关系,通过执行 YUM 命令,系统会自动去 YUM 服务器上下载所有依赖。不需要预先将软件包下载到本地。
- 查看当前系统中已经安装的 RPM 包:
yum list installed
,查看是否安装 xxx 包:yum list installed | grep xxx
。 - 安装 RPM 包:
yum install 软件名称
。 - 卸载 RPM 软件:
yum remove 软件全名
。
22 搭建 JavaEE 开发环境
22.1 安装 jdk
- 使用 Xftp 软件,将 Linux 版本的 jdk 安装包传输到 /opt 目录下。
- 进入到 /opt 目录下,使用命令:
tar -zxvf jdk压缩包名称 -C 解压路径
,将 jdk 压缩包解压。 - 进入到 /etc 目录下,在
profile
文件中进行环境变量的配置。 - 配置环境变量:
JAVA_HOME=jdk安装路径 PATH=$JAVA_HOME/bin:$PATH CLASSPATH=$JAVA_HOME/lib:. export JAVA_HOME PATH CLASSPATH
- 重启 Linux 系统:
reboot
或重新加载 profile 配置文件:source profile
。 - 输入:
java -version
,查看 jdk 是否安装成功。
22.2 安装 tomcat
- 使用 Xftp 软件,将 Linux 版本的 tomcat 安装包传输到 /opt 目录下。
- 进入到 /opt 目录下,使用命令:
tar -zxvf jdk压缩包名称 -C 解压路径
,将 tomcat 压缩包解压。 - 进入到 tomcat 安装目录下的 bin 目录,执行
startup.sh
文件,启动 tomcat 服务器。 - 使用:
ps -ef | grep tomcat
,查看是否存在 tomcat 进程,如果存在,则代表已经启动了 tomcat 服务器。也可以在浏览器中,输入 http://localhost:8080,看能否访问到页面。 - 如果要在外部浏览器访问 Linux 的 tomcat 服务器,如在 Windows 系统上访问,则需要关闭 Linux 的防火墙服务:
systemctl stop firewalld
,之后在 Windows 的浏览器中输入:http://Linux的ip地址:8080
,就可以访问。
22.3 安装 MySQL
- 检查 Linux 中是否安装了 mariadb:
yum list installed | grep mariadb
,如果安装了,需要卸载:yum remove mariadb全称
。
- 使用 Xftp 软件,将 Linux 版本的 mysql 安装包传输到 /opt 目录下。
- 进入到 /opt 目录下,使用命令:
tar -zxvf mysql压缩包名称 -C 解压路径
,将 mysql 压缩包解压。 - 由于 mysql 解压之后的目录名很长,不方便后续使用,所以重命名 mysql 目录名:
mv 原目录名 新目录名
,注意,新目录之前不能存在,否则会将原目录移动到新目录下,而不是重命名。这里假设重命名后的目录名为:mysqlDir。 - 在 mysqldir 下,创建存放数据的目录 data:
mkdir data
。该目录用来存放数据库文件,数据库的表等数据都放在 data 目录下。 - 创建用来执行
mysqld
命令的 Linux 用户:groupadd mysql
、useradd -g mysql mysql
。该用户专门用来执行 mysql 的 mysqld 命令,此命令用来初始化 msyql 的基本信息。 - 初始化 mysql,使用 mysqld 命令初始化数据库的基本信息。在 mysqlDir/bin 目录下,使用命令:
./mysqld --initialize --user=mysql --datadir=/opt/mysqlDir/data --basedir=/opt/mysqlDir
。该命令执行后,会生成一个临时的 mysql 数据库 root 用户的密码,先将改密码记录下来,后续第一次登录 mysql 时需要使用。
- 开启 mysql 的安全功能。该功能将客户端和服务器之间传输的数据进行加密,通过证书提供了身份验证机制。在 mysqlDir/bin 目录下,使用命令:
./mysql_ssl_rsa_setup --datadir=/opt/mysqlDir/data
,开启该功能。 - 修改 mysql 安装目录的权限。由于安装 mysql 是在 root 账户下安装的,所以之前新建的,用于管理 mysql 的账户并不具有最高权限。因此,要修改 mysql 安装目录,即 mysqlDir 的所有者为 mysql,所在组为 mysql,并开放所有权限。在 mysqlDir 的上级目录下执行命令:
chown -R mysql:mysql /opt/mysqlDir/
、chmod 777 /opt/mysqlDir/
。 - 启动 mysql。在 mysqlDir/bin 目录下,使用命令:
./mysqld_safe &
,启动 mysql 服务,其中 & 表示后台启动。使用:ps -ef | grep mysql
,查看 mysql 服务是否启动成功。 - 登录 mysql。在 mysqlDir/bin 目录下,使用命令:
./mysql -u用户名 -p
,输入初始化密码,登录 mysql。其中,-u 表示使用哪个账户登录 mysql,-p 表示使用密码登录。 - 修改密码。登入 mysql 后,使用命令:
show databases;
,第一次使用时,会提示修改密码。使用命令:alter user '用户名'@'主机域名或ip' identified by '新密码';
,如alter user 'root'@'localhost' identified by 'mcc';
,修改用户密码。 - 授权远程访问 mysql。在没有授权之前只能在本机访问 mysql,授权远程访问之后,就可以让其他计算机通过网络访问 Linux 上的 mysql。
(1)登入 mysql 后,使用命令:grant all privileges on *.* to 用户名@'%' identified by '密码';
,授权远程访问。其中*.*
的第一个*
表示所有数据库,第二个*
表示所有的数据表,% 表示 ip 地址,也可以指定具体的 ip 地址,如 root@localhost、root@192.168.235.130 等。
(2)更新权限信息,使用命令:flush privileges;
,刷新权限。
(3)关闭防火墙:systemctl stop firewalld
。可以使用:systemctl status firewalld
,查看防火墙是否关闭成功(Active inactive(dead))。
(4)远程连接 mysql。在其他计算机的数据库软件上,如 Windows 上的 SQLyog,输入 Linux 系统的 ip 地址,端口号:3306,授权了远程访问的用户名和密码,即可远程连接 Linux 上的 mysql。 - 关闭 mysql。在 mysqlDir/bin 目录下,使用命令:
./mysqladmin -u用户名 -p shutdown
,输入密码,关闭 mysql 服务。使用:ps -ef | grep mysql
,查看 mysql 服务是否关闭成功。
23 shell 编程
23.1 格式要求
以 #!/bin/bash
开头,每一行不需要以分号结尾,且 shell 文件需要有可执行权限。
例如:编写一个 shell 程序,输出 Hello World!。
vim shell.sh
#!/bin/bash
echo "Hello World!"
赋予可执行权限:chmod +x shell.sh(每个用户都赋予了执行权限)
执行:./shell.sh(假设在当前目录下)
(以后台运行的方式执行脚本:./xxx.sh &
)
输出:Hello World!
若不赋予 shell 文件可执行权限,需要使用sh + 脚本路径
的方式执行。
23.2 变量
23.2.1
在引用变量时,需要使用$变量名
。
显示当前 shell 中的所有变量:set
。set | more
-
系统变量/环境变量
PATH、HOME、PWD、USER等。
系统/环境变量所有的 shell 脚本都可以使用。
例如:输出PATH的值,echo “PATH = $PATH” -
用户变量
(1)定义变量:变量=值。
注意:等号两侧不要写空格。
用户变量只有当前的 shell 脚本可以使用。
(2)撤销变量:unset 变量
。
(3)声明静态变量:readonly 变量
。
注意:静态变量不能撤销。 -
变量命名规则
字母、数字、下划线组成;开头不能是数字;等号两侧不能有空格。
习惯将变量名全大写。
将命令运行的结果赋值给变量:
A=`ls -l 目录`
A=$(ls -l 目录)
两种写法等价,例如:
将home目录下的所有文件的查看结果赋值给变量H
H=`ls -l /home` 或 H=$(ls -l /home)
- 将用户变量转换为系统/环境变量
系统/环境变量是不能直接添加的,可以使用下面的步骤将用户变量转换为系统/环境变量:
export 变量=值 (将变量输出为系统/环境变量)
source 配置文件 (让修改后的配置信息生效) source /etc/profile
所有的系统/环境变量都存储在 /etc/profile 文件中,
export 的作用就是将变量写入到 profile 文件中,
source 的作用是重新加载 profile,使系统/环境变量生效。
23.2.2 位置参数变量和预定义变量
- 位置参数变量
shell 脚本能够获取到命令行中输入的参数信息,即:命令行输入的执行命令中带有一些参数,这些参数能够被 shell 脚本中的代码获取到。
代码 | 作用 |
---|---|
$n | n = 0,1,2,…,其中 $0 代表命令本身,$1-$9 表示第一到第九个参数, 10以上(含10)的参数需要使用大括号 ${10} |
$* | 命令行中的所有参数,看成一个整体,返回的参数个数为1 |
$@ | 命令行中的所有参数,每个参数独立看待,返回的参数个数为n |
$# | 命令行中所有参数的个数 |
在 for 循环时,遍历输出命令行中所有的参数,假设命令行命令为:./shell 13 27 36,如果使用 $*,则只会打印一行数据:13 27 36,如果使用 $@,则会打印三行数据:13 \n 27 \n 36。
例:编写一个 shell 脚本,在命令行中获取各个参数的信息
#!/bin/bash
echo "$0 $1 $2"
echo "$*"
echo "$@"
echo "$#"
执行:./shell.sh 30 60
结果:
./shell 30 60
30 60
30 60
2
- 预定义变量
shell 设计者预先定义的变量,可以直接在 shell 脚本中使用(类似环境变量)。
变量 | 作用 |
---|---|
$$ | 当前进程的进程号 |
$! | 后台运行的最后一个进程的进程号 |
$? | 最后一次执行的命令的返回状态。 若 $?=0,表示上一个命令执行正确;若非0,表示执行不正确 |
23.3 运算符
格式:
(1)$((运算式))
或$[运算式]
。
(2)expr m + n
,+ 两侧要有空格。
(3)expr 命令可以使用的运算符还有:减:-
,乘:\*
,除:/
,取余:%
等。
推荐使用中括号形式。
例1:计算 (2+3)x4 的值。
#!/bin/bash
# 第一种方式$(())
RESULT1=$(((2+3)*4))
# 第二种方式
RESULT2=$[(2+3)*4]
# 第三种方式
TEMP=`expr 2 + 3`
RESULT3=`expr $TEMP \* 4`
# 第三种方式使用了将命令运行的结果赋值给变量
# 也可以改写成 TEMP=$(expr 2 + 3) RESULT3=$(expr $TEMP \* 4)
例2:求命令行输入的两个参数的和。
#!/bin/bash
# 假设命令行输入的命令是:./shell.sh 12 15
SUM=$[$1+$2]
23.4 条件判断
- 语法:
[_条件判断语句_]
,注意,语句前后要有空格,这里用下划线表示空格。
当 [ ] 内不是具体的判断语句时,如 [1],那么只要 [ ] 内非空就返回 true,可以用 $? 验证,0 为 true,>1 为 false。
例如:
```powershell
[ abc ] true
[] false
[ condition ] && echo "ok" || echo "no"
# 因为[]内有内容,所以返回true,整个语句最后的返回值由后面的部分决定。
```
- 常用的判断条件:
数值类比较 | 作用 | 文件权限及 类型判断 | 作用 |
---|---|---|---|
= | 比较两个字符串 | -r | 读 |
-lt | 小于 | -w | 写 |
-le | 小于等于 | -x | 执行 |
-eq | 等于 | -f | 文件存在并且 是一个普通文件 |
-gt | 大于 | -e | 文件存在 |
-ge | 大于等于 | -d | 目录存在 |
-ne | 不等于 |
例:
# “ok” 是否等于 “ok”
[ "ok"="ok" ]
# 23是否大于等于22
[ 23 -ge 22 ]
# /root/install.log 是否存在
[ -e /root/install.log ]
23.5 流程控制
23.5.1 if 判断
# 语法
if[_条件判断语句_]
then
程序
elif[_条件判断语句_]
then
程序
...
fi # 表示if判断结束
例:读取控制台输入的参数,若大于60,输出合格,否则输出不及格。
#!/bin/bash
if[ $1 -ge 60 ]
then
echo "及格"
elif[ $1 -lt 60 ]
then
echo "不及格"
fi
23.5.2 case 语句
# 语法
case $变量名 in
"值1")
程序1
;;
"值2")
程序2
;;
...
*)
程序 # *代表如果不是以上几种情况的话,则执行本程序
;;
esac
23.5.3 for 循环
# 语法1
for 变量 in "值1" "值2"... # 注意,这里的变量不需要使用 $ 引用
do
程序
done
# 语法2
for(初始值;循环条件;变化量) # 注意,这种形式的for循环可以使用< > i++ i--等
do
程序
done
例1:打印命令行输入的参数。
#!/bin/bash
# 写法1
for i in "$*"
do
echo "the number is: $i"
done
# 写法2
for j in "$@"
do
echo "the number is: $j"
done
假设命令行输入:./xxx.sh 1 2 3
写法1输出:
the number is 1 2 3
写法2输出:
the number is 1
the number is 2
the number is 3
例2:计算1到100所有数字相加的和。
#!/bin/bash
RESULT=0
for(i=0;i<=100;i++) # 只有这种for循环可以使用<=,i++这种写法
do
RESULT=$[$RESULT+$i] # 不是命令赋值给变量,是单纯的运算符运算
# RESULT=$(expr $RESULT + $i)
done
23.5.4 while 循环
# 语法
while[_条件判断语句_]
do
程序
done
例:从命令行输入一个数字n,计算1+…+n的和。
#!/bin/bash
SUM=0
i=0
while[ $i -le $1 ]
do
i=$[$i+1]
SUM=$[$SUM+$i]
done
23.6 read 读取控制台输入
read
是指在脚本运行过程中与控制台互动,读取控制台输入的信息,类似于 C++ 的 cin,不是最开始输入命令行命令执行脚本时的那些参数。
参数:
-p
:指定在控制台显示的提示信息。
-t
:指定读取时等待的时间,单位秒。
例:
read -t 10 -p "请输入一个数:" num
:在控制台上打印提示信息“请输入一个数”,用户在10s内输入数字,用 num 接收。
23.7 函数
函数分为系统函数和自定义函数
- 系统函数:
basename:返回完整路径最后 / 后面的部分(不包括/),常用来获取文件名。
basename [pathname] [suffix]
basename [string] [suffix]
basename 会删掉 pathname 或 string 中所有的前缀以及最后一个 /,然后将剩下的字符串返回。
若指定了 suffix,则 basename 还会将所有的 suffix 去除。
其中,suffix:是否保留拓展名。
例:返回 /home/aaa/text.txt 的文件名
basename /home/aaa/text.txt 返回:text.txt
basename /home/aaa/text.txt .txt 返回:text
dirname:与 basename 相反,返回完整路径最后 / 前面的部分(不包括/),常用于返回路径。
例:返回 /home/aaa/text.txt 的路径
dirname /home/aaa/text.txt 返回:/home/aaa
- 自定义函数
#!/bin/bash
# 语法
function funname() {
语句;
[return xxx;]
}
调用函数时,直接写函数名 + 要传入的参数即可。
例:编写一个函数,计控制台输入的两个参数的和。
#!/bin/bash
function getSum() {
sum=$[$num1+$num2]; # 调用控制台传入的两个参数num1, num2
# 因为shell函数没有形参,因此变量名必须一致
echo "和为:$sum"
# return sum;
}
# 读取控制台输入
# 因为shell函数没有形参,因此变量名必须一致
read -p "清输入第一个数:" num1
read -p "清输入第二个数:" num2
# 调用getSum
getSum $num1 $num2
# sum=getSum $num1 $num2
#echo "$sum"
24 Ubuntu
- su 和 sudo 的区别:
su + 用户名:切换用户。
sudo + 命令:以超级管理员 root 身份执行命令。
使用 su 时,需要输入对方的密码才能成功切换,会造成安全隐患。如切换的用户是 root 用户时,会造成 root 用户密码的泄露,这种问题在有多个用户都需要使用 root 权限时更加明显,并且切换到 root 账户之后,会获得 root 账户的所有权限,危险很大。
使用 sudo 时,会提示输入本账户的密码,输入正确之后以 root 权限执行命令,并且 sudo 命令会生成记录日志,日志中记录了哪些用户使用 root 权限执行了哪些命令。此外,sudo 还可以在配置文件中配置哪些用户可以使用 sudo 命令获得 root 权限,保证了系统的安全性。
- apt:
apt(Advanced Packaging Tool,安装包管理工具),类似 CentOS 的 yum。
命令 | 作用 |
---|---|
sudo apt-get update | 更新源:修改 sources.list 文件内容之后, 使用该命令使新配置生效。 |
sudo apt-get install package | 安装包 |
sudo apt-get install package --reinstall | 重新安装包 |
sudo apt-get remove package | 删除包 |
sudo apt-get source package | 下载该包的源代码 |
sudo apt-get upgrade package | 更新已安装的包 |
sudo apt-cache show package | 获取包的相关信息,如说明、大小、版本等 |
由于 Ubuntu 服务器在国外,下载安装包时间很久,可以通过国内镜像的方式进行下载,下面是教程:
清华镜像源:http://mirrors.tuna.tsinghua.edu.cn/
因为 apt 命令在执行时会先去 /etc/apt/sources.list 文件中指定的服务器上搜索安装包链接,所以为了加速,只需要将服务器地址修改为清华镜像源即可。
使用命令:echo "" > sources.list
,清空 sources.list 文件内容,之后将清华镜像源的配置命令全部粘贴到 sources.list 中即可。
小技巧:清空文件内容echo "" > 文件名
。
- 安装 ssh:
Ubuntu 默认没有安装 ssh 服务,可以通过下面步骤安装:
(1)安装:sudo apt-get install openssh-server
,执行命令之后,会在系统上安装 ssh 的客户端和服务端。
(2)启动:service sshd restart
,启动 sshd 服务,监听 22 号端口。