Linux系统
1、Linux系统简介
- Linux是一个系统,类似Windows:免费、可靠、安全、稳定、多平台
- Linux系统主要在企业服务器中用的多
- Linux最初由芬兰程序员:林纳斯·托瓦兹 (Linux之父)开发出来的
- Linux分为Linux内核与Linux发行版
- 常见的Linux发行版(几十种):centos、ubuntu、redhat
Linux内核:内核指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件,是Linux操作系统最基础的部分
Linux发行版:在内核的基础上增加一些终端操作程序、常用应用软件、图形操作界面,一般用的都是发行版
2、安装Linux
有条件的可以购买一台云服务器用于学习,腾讯云新用户一台1c2g的服务器一年也就50块,适合用于学习。
如果没有条件的话,也可以在自己电脑上岸一个虚拟机软件vmware ,使用此软件虚拟出一台设备,用此设备安装Linux。
安装vm和Linux的教程网上很多,建议安装vm15
网络模式:在安装VMWare软件时,会多出两个网络连接设置(VMnet1 | VMnet8)
在安装虚拟机时,需要设置网络连接方式:
- 仅主机:虚拟机只能与缩主计算机进行通信,不能连接外网,虚拟机与主机的通信使用的是VMnet1这块网卡
- NAT模式 :虚拟机可以与主机通信,虚拟机也可以上网,同时与其它虚拟机也可以通信。需要使用VMnet8虚拟网卡与主机通信
- 桥接模式 :虚拟机与主机是平等关系,也就是网络中一台电脑,需要一个独立的IP地址,此模式也会生成一块虚拟网卡VMnet0
一般用NAT模式。
3、Linux相关配制
3.1 配制静态IP
这里是用于配置通过vm安装Linux网络环境的,配置之后Linux可以与主机通信并且联网,云服务器不需要配置。
# 查看设备网络状态
nmcli #提示 ens33 disconnected
#进入目录配制静态的IP地址:
cd /etc/sysconfig/network-scripts/
# 使用vi命令在命令模式修改:ifcfg-ens33文件
vi ./ifcfg-ens33
-------------------------------------------
输入 i / a 进入编辑模式(此模式下可以对文件进行编辑 --INSERT)
BOOTPROTO=static # 默认为dhcp -- 动态分配IP地址
ONBOOT=yes # 开机自动连接
IPADDR=192.168.223.131 # C类地址网段为223,可能会不一样),通过vm的编辑 -- 虚拟网络编辑器修改
GATEWAY=192.168.223.2 # 本机网关地址
NETMASK=255.255.255.0 # C类地址的子网掩码,是固定的
DNS1=114.114.114.114 #国内DNS服务器
DNS2=8.8.8.8 # 谷歌DNS服务器
# 保存修改: 第1步:按ESC退出编辑模式;第2步:再输入:wq(保存并退出)
# 修改后,不会立刻有效,需要重启网卡服务(centos6,7与8都不一样)
nmcli connection (c) reload # centos8:
service network restart # centos6
systemctl network restart # centos7
# 如果可以ping通,则证明IP地址配制正确,可以联网
ping www.baidu.com
3.2 连接Linux终端
连接Linux终端的软件有很多,推荐使用国产的finalshell,不仅免费,而且还可以传输文件,省去了安装ftp。
当然也可以使用其他软件,例如xshell,如果想要传输文件的话,需要安装配套软件xftp
3.3 Linux传输文件
**方法一:**通过 FTP软件实现上传
FTP :文件传协议,所有FTP软件都遵循此协议,实现文件上传
推荐软件:xftp,winscp等
**方法二:**通过xshell上传的插件实现
xshell有一个上传的插件,安装后,可以直接通过xshell实现上传
# 在线安装软件命令:
yum -y intall 程序名 # 例如yum -y intall vim
# xshell的上传插件:lrzsz
yum -y install lrzsz
# 安装完毕后,输入rz + 回车,直接拖动文件到xshell实现上传
3.4、Linux目录结构
Linux系统没有window系统磁盘分区的概念,Linux系统有一个根目录 " / "表示,Linux 系统中一切都是文件
各目录的作用:
目录 | 描述 |
---|---|
/ | 整个系统的根目录 |
/bin | 作为基础系统所需要的最基础的命令都放在这里,例如cat、ls、cp等,面向所有用户 |
/sbin | 和bin类似,是一些可执行文件,只有管理员用户才能使用 |
/boot | Linux的内核及引导系统程序需要的文件,一般是一个独立的分区 |
/dev | 设备文件存储的位置,如sda1,sda2 |
/home | 用户工作目录和个人配置文件,如个人环境变量等,每个账号在该目录下都有一个自己的目录 |
/lib | 库文件的存放地,bin和sbin需要的库文件,类似Windows的dll文件 |
/media | 可拆卸的媒介挂载点,如CD-ROMs、U盘等,系统默认会挂载到这里来 |
/mnt | 临时挂载的文件系统。比如cdrom,U盘等,直接插入光驱无法使用,要先挂载后才能使用 |
/opt | 安装第三方软件的目录 |
/proc | 一个虚拟的文件系统,操作系统运行时,进程状态及内核信息(比如CPU、硬盘分区、内存信息等)归档为文本存储正在该目录下。该目录只能看不能改,包括管理员 |
/root | root用户的工作目录 |
/tmp | 系统的临时文件,一般系统重启时会删除 |
/usr | 不是user的简称,其实是Unix System Resource,存储软件程序的,类似Windows的ProgramFiles,包含绝大多数的用户工具和应用程序 |
/etc | 系统的配置文件存放地,一些服务器的配置文件也在这里 |
/var | 变量文件,唉正常运行的系统中其内容不断变化的文件,如日志,脱机文件和临时电子邮件文件,有时是一个单独的分区,如果不单独分区,有可能会把整个分区充满 |
/srv | srv可以视为service的缩写,一些网络服务启动之后,这些服务所需要取用的资料目录 |
小结:
- /root:目录为超级管理员(root)的家目录,每一个账号登录系统默认进入的就是当前用户的家目录
- /home:普通用户的家目录
- /opt 与 /usr :此2个目录下主要放安装程序
- /bin:放linux基础命令,普通用户与管理员都可以访问
- /sbin:超级管理员使用的命令放在此目录
- /etc:linux系统或者相关程序的配制文件放在此目录下
- /boot:Linux系统启动引导程序
- /lib与/lib64:bin或 sbin命令程序依赖的类库
- /dev:系统设置所存放的路径,linux系统一切都是文件
- /mnt:设备临时挂载目录
- /media:外接设置默认挂载目录
4、Linux基本命令
4.1、关机与重启
# 关机
shutdown -h now
poweroff
init 0
# 重启
reboot
shutdown -r now
init 6
# 注销账号
logout
exit
4.2、文件与目录
目录
# 当前目录
.
# 上一级目录
..
# 根目录
/
# 打印当前路径
pwd
查看文件与目录
# 查看简要(详细)文件与目录
ls [-l]
ll
# 示所有目录和文件,包含隐藏,在linux系统中隐藏文件以"." 开始
ls [-a]
切换目录
# 回到指定目录
cd 目录名
# 回到当前用户的家目录
cd ~
创建目录
mkdir [-p] 目录名
删除目录(文件)
rm [-rf] 目录名(文件名)
创建文件
touch 文件名
复制文件
cp 源文件 目录位置
移动文件、文件命名
mv 源文件路径 目标路径
查看文件
cat 文件名
head [-n] 文件名
less 文件名 # 查看大文件,按q退出
输出重定向和追加
ll > ./1.txt # 如果再次运行,会替换原内容
ll >> ./1.txt # 追加模式
echo:输出语句
# 将语句输出到指定文件
echo "hello:echo" >> ./2.txt
# 直接输出到控制台
echo "hello,world"
echo $PATH
快捷方式(软链接)
快捷方式只是对源文件的一个引用,删除快捷方式并不会删除源文件
在Linux系统中,快捷方式称为软链接
ln -s 源文件 快捷方式
history
# 输出指定行数的历史命令
history [-n]
history 10
4.3、日期与日历
date
cal
cal 2020
cal 3 2020
4.4、帮助指令
man 需要帮助的命令
需要帮助的命令 --help
4.5、vi、vim
vim三种工作模式:
命令模式、编辑模式、底行模式
命令模式:
yy # 复制行
p # 粘贴
dd # 删除行
x # 删除光标所在位置字符
u # 撤销
h # 前移光标
l # 后移光标
k # 向上移
j # 向下移
gg # 光标移到第一行
$ # 行尾(shift+4)
^ # 行首 (shift+6)
编辑模式:
命令模式进入编辑模式:i a o
底行模式:
# 编辑模式进入底行模式:ESC键
:w # 写入文件
:q # 退出
:wq # 写入并退出
:q! # 强行退出
:set nu # 显示行号
4.6、账号管理
root:超级管理员,可以创建普通账号,账号与密码的相关信息是存放在文件中的
账号信息文件:/etc/passwd
密码文件:/etc/shadow
cat /etc/passwd
# 用户名:密码:UID(用户ID):GID(组ID):描述性信息:主目录:默认Shell
root:x:0:0:this is administractor user:/root:/bin/bash
# 用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段
root:$6$9HIJ20EvEfenjuAk$epvtFJQj.SmFJoSjIsMn3bz8qJHrBNOEkyG/8/1RT05hZ/4/zdLpdJ/n/hlrcGMUoGRNkSKskcZy5eYR0wDOn1::0:99999:7:::
组文件:/etc/group
组密码文件: /etc/gshadow
cat /etc/group
# 组名:密码:GID
user02:x:1002:
# 组名:加密密码:组管理员:组附加用户列
user02:!::
创建用户的默认设置文件:/etc/login.defs
添加账号
useradd 账号名
设置密码
passwd 账号
删除账号
userdel [-r] 账号
修改账号信息
# usermod [-参数] 内容 账号
usermod -d "/home/user01desk" user01
usermod -c "this is user01 desc" user01
查看账号
id [账号名]
whoami
who am i
w
users
切换账号
注:从普通用户切换到管理员,需要输入密码,反之,不需要
su 账号
退出账号
exit
4.7、账号组管理
Linux系统中的账号是属于某一个组的,是基于组管理的。
默认在创建账号时,会自动创建一个组,组名与账号名称相同,在实际维护中,应该先有组,再给组添加账号
添加组
groupadd 组名
删除组
groupdel 组名
修改组
groupmod [参数] 组名
-g GID # 修改组ID
-n 新组名 # 修改组名
添加账号指定组
useradd -g 组名 账号名称
向组中添加账号
注:在 Linux系统中,一个账号可以属于多个组
gpasswd –a 账号 组名
从组中删除账号
gpasswd –d 账号 组名
改变文件所属用户与组
chown 用户 [-R] 文件|目录
chgrp 组名 文件名
4.8、压缩与解压
Linux系统中支持多种压缩格式,其中最常用的压缩格式:gz、tar和zip
tar
-c: 建立压缩档案
-x: 解压
-z:是否同时具有有gzip属性
-j: 是否同时具有bzip2属性
-v:显示所有过程
-f: 使用档案名字,切记,这个参数是最后一个参数
tar -cvf etc.tar /user01 -- 打包
tar -czvf etc.tar.gz /user01 -- 打包并压缩
tar -zxvf ./etc.tar.gz -- 解压
4.9、文件权限
输入ll
后,会显示如下信息
-rw-r--r--. 1 user01 user01 110 4月 25 05:43 1.txt
drwxr-xr-x. 6 root root 67 12月 6 13:57 data
lrwxr-xr-x. 9 root root 145 12月 6 14:05 server
开头第一位:
- -:表示该文件是一个文件
- d:表示该文件是一个目录
- l:表示该文件是一个软链接
2-10位:每三个为一组,分别表示拥有者、所属组和其他组的权限
其中:
- r:read,拥有读的权限
- w:write,拥有写的权限
- x:execute,拥有执行的权限
我们经常可以看到说给某某某文件加上777的权限,那这777又是什么意思呢?
r可以用4来表示,w可以用2来表示,x可以用1来表示,那4+2+1=7,也就是说,一个7代表的就是rwx权限,777就是rwxrwxrwx权限。
更改文件权限:
chmod命令可以用来更改文件权限
chmod [-cfvR] [--help] [--version] mode file...
其中,mode为权限设定字符串,格式如下:
[ugoa...][[+-=][rwxX]...][,...]
其中:
- u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
- + 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
- r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。
其他参数说明:
- -c : 若该文件权限确实已经更改,才显示其更改动作
- -f : 若该文件权限无法被更改也不要显示错误讯息
- -v : 显示权限变更的详细资料
- -R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)
- –help : 显示辅助说明
- –version : 显示版本
4.10、文本搜索
在文件中基于关键字查找:grep (支持正则表达式)
grep "linux" ./1.txt
grep -i "linux" ./1.txt
grep -i -o "linux" ./1.txt
grep -i -o -n "linux" ./1.txt
4.11、防火墙
# 查看防火墙
systemctl status firewalld
firewall-cmd --state
# 防火墙版本
firewall-cmd --version
# 关闭防火墙,重启系统,防火墙仍会打开
systemctl stop firewalld
# 启动防火墙
systemctl
start firewalld
# 开机禁用防火墙
systemctl disable firewalld
# 开机启用防火墙
systemctl enable firewalld
------------------------------------------------------------
# 下载防火墙命令
apt install firewalld
# 列出当前开放的端口
firewall-cmd --list-ports
# 列出当前zones
firewall-cmd --get-zones
# 列出当前包含eth0的Zone
firewall-cmd --get-zone-of-interface=eth0
# 开放1191端口
firewall-cmd --add-port 1191/tcp
# 重新启动后,发出以下命令以打开端口1191进行TCP通信。 使用此命令可以使更改持久化
firewall-cmd --permanent --add-port 1191/tcp
# 开放多个端口
firewall-cmd --permanent --add-port 60000-61000/tcp
# 停止或开启防火墙
systemctl stop firewalld
systemctl start firewalld
4.12、杀死进程
kill -9 进程号
5、Linux运行级别
linux运行有6个级别,定义在:/etc/inittab
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
运行级别2:多用户状态(没有NFS)
运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11控制台,登陆后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
在centos8版本中,通过:systemctl get-default 可以查看系统运行的级别
6、安装软件
6.1、安装 JDK
可以直接一键安装:
yum install -y java-1.8.0-openjdk-devel.x86_64
6.2、安装mysql
- 第一步:下载mysql
https://dev.mysql.com/downloads/mysql/5.7.html#downloads
- 第二步:解压
# 改解压后的文件夹名称为:mysql(可以不改)
tar -zxvf ./mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz
- 第三步:创建mysql组及mysql账号
groupadd mysql
useradd -r -g mysql mysql
- 第四步:创建mysql数据目录并赋予权限
mkdir -p /data/mysql #创建目录
chown mysql:mysql -R /data/mysql #将目录及子目录拥有者改为mysql
- 第五步:编写mysql配置my.cnf
vim /etc/my.cnf
--------------------------------------------------------------------------------------
[mysqld]
bind-address=192.168.223.131 # 虚拟机ip
port=3306
user=mysql
basedir=/opt/mysql
datadir=/data/mysql
socket=/tmp/mysql.sock
log-error=/data/mysql/mysql.err
pid-file=/data/mysql/mysql.pid
#character config
character_set_server=utf8
symbolic-links=0
explicit_defaults_for_timestamp=true
- 第六步:初使化mysql
./mysqld --defaults-file=/etc/my.cnf --basedir=/opt/mysql/ --datadir=/data/mysql/ --user=mysql --initialize
- 第七步:查看mysql root账号密码
cat /data/mysql/mysql.err
---------------------------------------------------------------------------------------
2020-05-09T21:34:21.882105Z 0 [Warning] InnoDB: New log files created, LSN=45790
2020-05-09T21:34:21.998486Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2020-05-09T21:34:22.067781Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: d8c499ff-923c-11ea-b3d8-000c29648ef8.
2020-05-09T21:34:22.068825Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2020-05-09T21:34:23.364092Z 0 [Warning] CA certificate ca.pem is self signed.
2020-05-09T21:34:23.817345Z 1 [Note] A temporary password is generated for root@localhost: fGnlOdT>o6Mt
- 第八步:启动mysql
service mysql start
# 抛出错误:Failed to start mysql.service: Unit mysql.service not found.
# 解决方法:cp /opt/mysql/support-files/mysql.server /etc/init.d/mysql
ps -ef|grep mysql
- 第九步:修改root账号密码
./mysql -uroot -pfGnlOdT>o6Mt #以默认密码,登录mysql(fGnlOdT>o6Mt)
SET PASSWORD = PASSWORD('root'); #设置密码为root
ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER; #密码永不过期
FLUSH PRIVILEGES; #刷新
- 第十步:远程连接
use mysql #访问mysql库
update user set host = '%' where user = 'root'; #使root能再任何host访问
FLUSH PRIVILEGES;
- 问题
./mysql -uroot -p
# 在本机出现以下问题:
# ./mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory -- 系统确少libncurses.so.5...相关库
yum install -y libncurses*
6.3、安装Tomcat
Tomcat web服务器的运行,需要系统安装好JDK
www的端口默认为80,所以在正常访问网页时,不需要加上80端口
- 下载Tomcat
http://tomcat.apache.org/
- 解压Tomcat
tar -zxvf ./apache-tomcat-8.5.54.tar.gz
- 启动Tomcat
./startup.sh
- 测试
http://192.168.223.132:8080/
7、SHELL脚本编程
脚本(script) :是嵌入到某一个环境中一段程程序(实现特定的业务),脚本程序也是需要用语言写的,在Linux中,shell脚本可以支持多种语言
脚本语言相对面向对象的语言来说,没有严格的语法,同时提供的语言功能很简单
都有基本相同的一些语法常量、变量、运算符、函数、数组、流程控制…
7.1、helloworld
#第一行:指定脚本的解释器
#!/bin/bash
echo "hello,world"
运行shell脚本程序
chmod +x ./s1.sh
sh ./s1.sh
7.2、注释(#)
在shell中,注释与java的不一样,java的是用//,shell里面是用#
7.3、常量与变量
变量:在定义时,直接赋值即可,不需要指定类型,在访问变量时,需要通过**$变量名或者${变量名}**
常量:与变量类似,不过一般常量用大写,而且定义后一般不会改动
- 单引号与双引号区别:单引号中的任何字符都会原样输出,在单引号中引用 变量是无效的
- 变量分类:shell中有三种类型的变量:局部变量(local)、全局变量、环境变量(o)
- 特殊变量
变量 | 含义 |
---|---|
$0 | 当前脚本的文件名 |
$n | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第1个参数是$1,第2个是$2。 |
$# | 传递给脚本或函数的参数个数。 |
$* | 传递给脚本或函数的所有参数。 |
$@ | 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。 |
$? | 上个命令的退出状态,或函数的返回值。 |
$$ | 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 |
7.4、运算符
表达式语法:
# 语法一:
`expr $a + $b`
# 语法二:
$((a+b))
a=10
b=10
d=$((a+b))
# 语法三:let 表达式
let d=a+b
- 算术运算符
- 关系运算符
- 布尔运算符
- 字符串运算符
- 文件测试运算符
path=/root/s3.sh
if [ -w $path ]
then
echo "可写"
else
echo "不可写"
fi
# 该文件的权限
-r -x -w -e -f -d .............
7.5、数组
数组的思想与JAVA语言是一样的,语法不一样,操作基本一样的
# 声明
nameArray=(tom jack marry)
echo ${nameArray[0]}
#获取所有元素
echo "${nameArray[*]} -- ${nameArray[@]}"
#获取数组长度
echo "${#nameArray[*]} -- ${#nameArray[@]}"
#遍历数组元素
for((i=0;i<${#nameArray[*]};i++))
do
echo "nameArray[$i]=${nameArray[$i]}"
done
7.6、函数
与C语言中函数很相似,与java的方法也差不多
在 shell脚本中,接收用户通过控制输入的信息:read指令
语法:read [-t 10 ] -p 提示信息 变量名
read -p "请输入名称:" name
7.7、流程序控制
-
选择结构
IF语句
CASE语句(等效于SWITCH)
-
循环结构
FOR循环
WHILE循环