linux初识
cd /opt
进入opt目录tar -zxvf xx.tar.gz
解压./xx-install.pl
安装pwd
显示当前用户在哪个目录- linux中,隐藏文件是以.开头的
- ls 可以查看当前目录的内容,包括文件和文件夹
- ls -a 显示隐藏文件
- ls -l 单列(详细的)显示目录内容
- ls -al 混合显示
- ls -al /root 单列显示root的所有文件
linux目录结构介绍
- linux只有没有盘符,只有一个根目录
/
,windows中,我们可以有c,d,e盘,但是也可以改名为文件盘,游戏盘等等,但是在linux中,/
不可以修改名字 - 根目录下,有许多目录
- root : 系统管理员(超级权限者)的用户主目录
- home : 家目录,存放普通用户的主目录,每创建一个用户,家目录下会增加对应的一个文件夹
- bin : binary,放置常用的命令
- sbin : super binary ,系统管理员使用的系统管理程序
- etc : 配置文件,比如你安装了mysql,那么该目录下就有mysql的配置文件
- boot : linux启动的时候需要的核心文件,以及一些连接文件和映射文件
- dev : device,设备管理器,linux中一切皆文件,硬件也会映射成为一个文件来管理
- lib : 系统开机所需要的最基本的动态连接共享库,作用类似于win的ddl文件,几乎所有的应用程序都需要用到这些共享库
- lost+found : 一般为空,系统非法关机后,这里就有了一些文件,隐藏的,可以通过ls查看
- usr : 非常重要的目录,用户的很多应用程序和文件都放在这个目录下面,类似于win下的program files目录
- proc(不要动) : 虚拟目录,系统内存的映射,访问这个目录来获得系统信息
- srv(不要动) : service,该目录存放一些服务启动之后需要提供的数据
- sys(不要动) : linux2.6很大的一个变化,该目录下安装了2.6内核新出现的一个文件系统sysfs
- tmp : 存放临时文件
- media : linux会自动识别一些设备,例如u盘,光驱等等,当识别后,linux会把识别的设备挂到该目录下
- mnt : 系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将外部的存储挂在/mnt/上,然后进入该目录就可以查看里面的内容了,比如我们的共享文件夹
- opt : 给主机额外安装软件所摆放的内容,如安装oracle数据库就可以放置到该目录下,默认为空,注意,这里面存放的是安装文件,而不是安装后产生的软件
- /usr/local : 给主机额外安装软件所需的目录,一般是通过编译源码方式所安装的程序,安装后产生的软件就在这里
- var : 存放不断扩充的东西,经常被修改的目录放在这个目录下面,包括各种日志文件
远程登录xshell
- xshell,可以使得我们用户远程连接linux系统,因为实际开发中,linux并不会在本机,而是布置在远端,开发程序员需要远程登录linux系统并使用,这里就需要xshell
- 首先要知道linux的主机ip,我们可以在linux的终端输入
ifconfig
,来得知ip地址 - 然后打开xshell,建立连接,输入ip地址,然后输入对应的linux的用户名和密码(例如用户名root,密码root)
- 之后就可以远程操纵linux系统
文件的上传和下载xftp
- xftp使得我们可以在win和linux之间传输数据
- 建立连接的时候,记得要选择sftp协议,端口号为22
- 如果建立连接失败,检查linux的ip地址是否正确,是否改变过
vi和vim
-
vi和vim的三种模式
- 正常模式 : 以vim打开一个文件就进入了正常模式,在这个模式中,你可以使用
上下左右
按键来移动光标,你可以使用删除字符或删除整行
来处理文档内容,也可以使用赋值.粘贴
来处理你的文件数据 - 插入模式 : 按下
i I o O a A r R
字母后才可以进入编辑模式,一般按i就可以,摁esc
退出插入模式 - 命令行模式 : 输入
:
进入命令行模式,在这个模式中,可以提供你相关指令,完成读取,存盘,替换,离开vim,显示行号等动作- wq : 写入并退出
- q : 退出
- q! : 强制退出,不保存
- 正常模式 : 以vim打开一个文件就进入了正常模式,在这个模式中,你可以使用
-
写一个简单的c++程序并运行
- 首先,打开终端,输入
vim hello.cpp
- 然后摁
i
进入编辑模式,输入以下代码
#include<iostream> using namespace std; int main() { cout << "hello world" << endl; return 0; }
- 保存后,在终端中输入
g++ hello.cpp
, 就会生成一个 a.out 可执行文件(这里注意,wim平台下生成的应该是.exe文件) - 如果想限定生成的可执行文件的名称,使用代码
g++ hello.cpp -o hjl
即可 - 输入
./hjl
执行,终端输出hello world
- 首先,打开终端,输入
-
快捷键
- 拷贝当前行 yy , 拷贝当前行向下的5行-> 5yy ,并粘贴
- 删除当前行 dd , 删除当前行向下的5行-> 5dd
- 在文件中查找某个单词(命令行模式下 /关键字 回车就开始查找,输入n就是查找下一个)
- 设置文件的行号,取消文件的行号(命令行模式下 : set nu 和 :set nonu)
- 编辑/etc/profile文件,使用快捷键到该文档的最末行G和最首行gg
- 在一个文件中输入内容后 ,撤销
u
- 编辑/etc/profile文件,并将光标移动到 20 行 shift + g
关机&重启命令
shutdown -h now
立即进行关机 h->halt 停止shutdown -h 1
一分钟后关机shutdown -r now
现在重新启动计算机halt
关机reboot
重启sync
把内存的数据同步到硬盘
注意 :
不论是重新启动还是关机,首先要运行sync命令,把内存的数据写入到硬盘中
目前的shutdown/halt/reboot指令均会在关机前进行sync,但是小心驶得万年船
用户相关
用户登录和注销
- 基本介绍
- 登录的时候尽量不要使用root用户,其实实际开发中,我们也不会有root用户,root用户是系统管理员,有最大的权限,避免操作失误,可以利用平普通用户登录,登录后在用
sudo - 用户名
来切换成系统管理员身份,注意-和用户名之间有空格 - 在提示符下输入logout即可注销用户
- 登录的时候尽量不要使用root用户,其实实际开发中,我们也不会有root用户,root用户是系统管理员,有最大的权限,避免操作失误,可以利用平普通用户登录,登录后在用
- 使用细节
- logout注销指令在图形运行级别无效,在运行级别3下有效
- 运行级别这个概念,后面介绍
创建用户
useradd milan
创建用户名称为milan的用户- useradd -d /home/test king 创建名称为king的用户,对应的工作目录为 home/test 而不是默认的home/king
指定/修改密码
passwd milan
给用户milan设置密码
删除用户
- 删除用户milan,但是保留milan家目录
userdel milan
- 删除用户以及用户的目录
userdel -r milan
- 一般情况下,我们建议保留家目录
查询用户信息
- `id 用户名
切换用户
su - 要切换的用户名
- 细节说明 :
- 从权限高的用户切换到权限低的用户,不需要输入密码,反之需要
- 当需要返回原来用户时,使用exit/logout指令
查看第一次登录的用户信息
who am i
用户组
- 介绍 :
类似于角色,系统可以对有共性/权限的多个用户进行统一的管理
- 新增组 :
groupadd 组名
- 删除组 :
groupdel 组名
- 增加用户的时候直接进组 : `useradd -g 用户组 用户名,如果创建用户的时候没有指定组,那么会创建一个和用户名相同的组名,然后将用户放到该组
- 修改用户的组 :
usermod -g 新用户组名 用户名
例如usermod -g mojiao king
用户组和相关的文件
- etc/passwd :
用户的配置文件,记录用户的各种信息
每行的含义 :
用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录shell
- etc/shadow :
口令的配置文件
每行的含义 :
登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
- etc/group :
组(group)的配置文件,记录linux包含的组的信息
每行含义 :
组名:口令:组标识号:组内用户列表
运行级别
- 运行级别说明:
0 :关机
1 :单用户【找回丢失密码】
2:多用户状态没有网络服务
3:多用户状态有网络服务
4:系统未使用保留给用户
5:图形界面
6:系统重启
常用运行级别是 3 和 5 ,也可以指定默认运行级别, 后面演示
- 应用实例 : init [0123456] 应用案例: 通过 init 来切换不同的运行级别,比如动 5-3 , 然后关机。
在 centos7 以前, /etc/inittab 文件中 . 进行了简化 ,如下:
multi-user.target: analogous to runlevel 3
graphical.target: analogous to runlevel 5
# To view current default target, run: systemctl get-default
# To set a default target, run: systemctl set-default TARGET.target
在终端输入
systemctl set-default multi-user.target
找回root密码
- 如何找回root密码
帮助指令
- man获得帮助信息 例如 :
man ls
基本语法 : man[命令或配置文件](功能描述 : 获得帮助信息)
案例 : 查看ls命令的帮助信息
- help指令
基本语法 : help 命令(功能描述 : 获得shell内置命令的帮助信息)
- 应用实例 : 查看cd命令的帮助信息
- 百度帮助更直接
文件目录类
1 pwd
- 基本语法 : pwd
- 功能描述 : 显示当前工作目录的绝对路径
2 ls
- 基本语法 : ls
- 常用选项
- -a
- -l
- -h 方便人阅读的方式展示,比如将文件大小有bit变为M
3 cd指令
- 基本语法 : cd 参数(根据参数切换到指定目录)
- cd ~ ->回到家目录,如果只写cd,默认也是回到家目录
- cd … -> 回到上一级目录
- 这里需要理解绝对路径和相对路径
4 mkdir (make directory)
- 用于创建目录
- 基本语法 : mkdir [选项] 要创建的目录
- 常用选项 :
- -p 创建多级目录
- 应用实例 :
- 创建一个目录 /home/dog
mkdir /home/dog
- 创建多级目录 /home/animal/tiger
mkdir -p /home/animal/tiger
- 创建一个目录 /home/dog
5 rmdir (remake directory)
- 用于删除空目录(注意,首先是空的,其次是目录而不是文件)
- 基本语法 : rmdir [选项] 要删除的空目录
- 应用实例 : 删除目录 /home/dog
- 提示 : 如果要删除非空目录 ,需要使用
rm -rf 要删除的目录
但是使用该命令要非常的谨慎
6 touch指令
- touch指令创建空文件
- 基本语法 :
touch 文件名称
- 应用实例 : 创建一个空文件 hello.txt
touch hello.txt
7 cp指令
- cp指令拷贝文件到指定目录
- 基本语法 : cp [选项] source(源地址) dest(目的地址)
- 常用选项 : -r 递归复制整个文件夹
- 应用实例 :
- 将home/hello.txt 拷贝到 /home/bbb 目录下
cp /home/hello.txt bbb/
- 递归复制整个文件夹,将/home/bbb整个目录,拷贝到/opt目录下
cp -r /home/bbb /opt/
- 将home/hello.txt 拷贝到 /home/bbb 目录下
- 强制覆盖不提示的方法 : 因为如果目的地址以及存在源地址文件,那么这个时候拷贝会针对每个文件询问一次,是否确认覆盖,如果文件夹内容非常多的话,是非常麻烦的 使用命令 :
\cp -r /home/bbb /opt
就可以强制覆盖,不提示方法
8 rm指令
- rm指令移除文件或目录
- 基本语法 :
rm [选项] 要删除的文件或目录
- 常用选项 :
- -r : 递归删除整个文件夹,删除每个文件或目录的时候,都会询问确认删除吗?如果不想被询问,可以-f
- -f : 强制删除不提示
- 应用案例 :
- 将/home/hello.txt删除
rm /home/hello.txt
- 递归删除整个文件夹 /home/bbb
rm -r /home/bbb
- 强制删除目录
rm -rf /home/bbb
- 将/home/hello.txt删除
9 mv指令
- 移动文件与目录或给文件重命名
- 基本语法 :
- 重命名 :
mv oldNameFile newNameFile
- 移动文件 :
mv /temp/movefile /targetFolder
- 总是,如果是同一个目录,就是重命名,如果是不同目录,就是移动文件
- 重命名 :
- 应用案例 :
- 将home/cat.txt 文件重命名为 pig.txt
mv /home/cat.txt /home/pig.txt
- 将home/pig .txt文件移动到 /root 目录下
mv /home/pig.txt /root
,如果是mv home/pig.txt home/cat.txt
就是移动并重命名 - 移动整个目录,比如将 /opt/bbb 移动到 /home下
mv /opt/bbb /home
- 将home/cat.txt 文件重命名为 pig.txt
10 cat指令
- cat指令查看文件内容
- 基本语法 : cat [选项] 要查看的文件
- 常用选项 : -n 显示行号
- 应用实例 : /etc/profile 文件内容,显示行号
cat -n /etc/profile
- 使用细节 : cat只可以浏览文件,而不可以修改文件,为了浏览方便,一般会带上管道命令 |more
cat -n /etc/profile | more[进行交互]
- 管道命令 : 将上一个命令的结果交给下一个命令来处理
11 more指令
- more指令是一个基于vi编辑器的文本过滤器,他一次显示全屏幕的文本内容,而不是全部,你可以通过摁快捷键来继续处理,比如摁
enter
,就可以再看下一行,摁space
可以看下一页 - 基本语法 :
more 要查看的文件名
- 快捷键
- space : 下一页
- enter : 下一行
- q : 离开more,不再显示该文件内容
- ctrl + F : 向下滚动一屏
- ctrl + B : 返回上一屏
- = : 输出当前行的行号
- :f : 输出文件名和当前行号
12 less指令
- less指令用来分屏查看内容,与more指令相似但是不同之处在于,less在显示文件内容的时候,并不是一次性全部加载并显示,而是根据需要加载内容,对于大型文件有较高的效率
- 基本语法 :
less 要查看的文件
- 操作 :
1. space : 下一页
2. pagedown : 下一页
3. pageup : 上一页
4. /字串 : 向下寻找字串,n向下,N向上
5. ?字串 : 向上寻找字串,n向上,N向下
6. q : 离开 - 应用实例 : 使用less查看一个大型文件 /opt/杂文.txt
13 echo指令
- 输出内容到控制台
- 基本语法 :
echo [选项] [输出内容]
- 应用案例 :
- 使用echo指令输出环境变量和主机名称
echo $PATH
echo $HOSTNAME
- 使用echo指令输出hello,world!
echo hello,world!
- 使用echo指令输出环境变量和主机名称
14 head指令
- 显示文件的开头部分,默认情况,head指令显示文件的前10行
- 基本语法 :
head 文件
,显示文件的前10行head -n 5 文件
查看文件的前5行
15 tail指令
- 显示文件的尾部内容
- 基本语法
tail 文件
tail -n 5 文件
tail -f 文件
实时追踪该文档的所有更新,退出追踪摁ctrl + c
例如 : 实时监控mydate.txt,看看文件是否有变化,是否看到实时的追加 touch mydate.txt tail -f /heme/mydate.txt 这个时候打开另一个终端输入 : echo > hello world > /home/mydate.txt
16 >和>>
- />是输出重定向,>>是追加
- 基本语法 :
ls -l > 文件
列表的内容写入文件中ls -al >> 文件
列表的单列内容追加写入文件中cat 文件1 > 文件2
将文件1的内容覆盖到文件2echo 内容
>> 文件,将文件1的内容覆盖到文件2
- 应用实例 :
- 将/home下的目录列表写入到 /home/info.txt
ls -l > /home/info.txt
,如果info不存在,系统会为我们创建 - 将当前的日历信息 追加到 /home/mycal中 ``
- 将/home下的目录列表写入到 /home/info.txt
17 ln指令
- 软链接也称之为符号链接,类似于windows里面的快捷方式,主要存放了链接其他文件的路径
- 基本语法 :
ln -s [原文件或目录] [软链接名]
给原文件创建一个软连接 - 应用案例 :
- 在/home下创建一个软链接myroot,链接到/root目录
ln -s /root /home/myroot
- 删除软链接
rm /home/myroot
- 在/home下创建一个软链接myroot,链接到/root目录
- 细节说明 : 使用pwd查看目录的时候,仍然看到的是软链接所在目录
[root@hjl home]# ln -s /root /home/myroot
[root@hjl home]# cd /home/myroot
[root@hjl myroot]# pwd
/home/myroot 而不是 /root
18 history
- 查看已经执行过的命令,也可以执行历史命令
- 基本语法 :
history
- 应用实例 :
- 显示所有的历史命令
history
- 显示最近使用的10个历史命令
history 10
- 执行历史编号为5的指令
!5
- 显示所有的历史命令
时间日期类指令
1 date
- 显示当前日期
- 基本语法 :
- date (功能描述:显示当前时间)
- date +%Y(功能描述:显示当前年份)
- date +%m(功能描述:显示当前月份)
- date +%d(功能描述:显示当前是哪一天)
- date “+%Y-%m-%d %H:%M:%S”(功能描述:显示年月日时分秒)
- 应用案例
- 显示当前时间信息
date
- 显示当前时间年月日
date "+%Y-%m-%d"
- 显示当前时间年月日时分秒
date "+%Y %m %d %H:%M:%S
- 显示当前时间信息
2 date设置日期
- 基本语法 :
date -s 字符串时间
- 应用实例 :
- 设置系统当前时间 , 比如设置成 2020-11-03 20:02:10
date -s "2020-11-03 20:02:10"
- 设置系统当前时间 , 比如设置成 2020-11-03 20:02:10
3 cal
- 查看日历
- 基本语法 :
cal [选项]
如果不加选项,显示当月日历 - 应用案例
- 显示当前日历 :
cal
- 显示2020年日历 :
cal 2020
- 显示当前日历 :
搜索查找类
1 find
- find指令将从指定目录向下递归的遍历其各个子目录,将满足条件的文件或者目录显示在终端
- 基本语法 :
find [搜索范围] [选项]
搜索范围 : 在哪个目录下查找 - 选项说明 :
- -name<查询方式> 按照指定的文件名查找模式查找文件
- -user<用户名> 查找属于指定用户名的所有文件
- -size<文件大小> 查找指定的文件大小查找文件
- 应用实例
- 按文件名:根据名称查找/home 目录下的 hello.txt 文件
find /home -name hello.txt
- 按拥有者:查找/opt 目录下,nobody用户的文件
find /opt -user nobody
- 查找整个 linux 系统下大于 200M的文件(+n 大于 -n 小于 n 等于, 单位有 k,M,G)
find / -size +200M
- 按文件名:根据名称查找/home 目录下的 hello.txt 文件
2 locate
- locate 指令可以快速定位文件路径。locate 指令利用事先建立的系统中所有文件名称及路径的 locate 数据库实现快速定位给定的文件。Locate 指令无需遍历整个文件系统,查询速度较快。为了保证查询结果的准确度,管理员必须定期更新locate 时刻
- 基本语法 :
locate 搜索文件
- 特别说明 : 由于 locate 指令基于数据库进行查询,所以第一次运行前,必须使用 updatedb 指令创建 locate 数据库。
- 应用实例 :
- 请使用 locate 指令快速定位 hello.txt 文件所在目录
locate hello.txt
- 请使用 locate 指令快速定位 hello.txt 文件所在目录
3 which指令
- 可以查看某个指令在哪个目录下 比如ls指令
which ls
4 grep
- grep过滤查找,管道符,
|
,表示将前一个命令的处理结果输出传递给后面的命令处理。 - 基本语法 :
grep [选项] 查找内容 源文件
- 常用选项
- -n 显示匹配行和行号
- -i 忽略字母大小写
- 应用实例 :
- 请在 hello.txt 文件中,查找 “yes” 所在行,并且显示行号
- 写法1 :
cat /home/hello.txt | grep -n yes
- 写法2 :
grep -n yes /home/hello.txt
- 写法1 :
- 请在 hello.txt 文件中,查找 “yes” 所在行,并且显示行号
压缩和解压
1 gzip/gunzip 指令
- gzip 用于压缩文件, gunzip 用于解压的
- 基本语法 :
gzip 文件
(功能描述:压缩文件,只能将文件压缩为*.gz 文件)gunzip 文件.gz
(功能描述:解压缩文件命令)
- 应用实例 :
- gzip 压缩, 将 /home 下的 hello.txt 文件进行压缩
gzip /home/hello.txt
- gunzip 压缩, 将 /home 下的 hello.txt.gz 文件进行解压缩
gunzip /home/hello.txt.gz
- gzip 压缩, 将 /home 下的 hello.txt 文件进行压缩
2 zip/unzip 指令
- zip 用于压缩文件, unzip 用于解压的,这个在项目打包发布中很有用的
- 基本语法 :
zip [选项] XXX.zip
将要压缩的内容(功能描述:压缩文件和目录的命令)unzip [选项] XXX.zip
(功能描述:解压缩文件)
- 常用选项
- zip的 -r:递归压缩,即压缩目录
- unzip的 -d<目录> :指定解压后文件的存放目录
- 应用实例 :
- 将 /home 下的 所有文件/文件夹进行压缩成myhome.zip
zip -r /home/ myhome.zip
- 将 myhome.zip 解压到 /opt/tmp 目录下
unzip -d /opt/tmp /home/myhome.zip
- 将 /home 下的 所有文件/文件夹进行压缩成myhome.zip
3 tar 指令
- tar 指令 是打包指令,最后打包后的文件是 .tar.gz 的文件。
- 基本语法 :
tar [选项] XXX.tar.gz
打包的内容 (功能描述:打包目录,压缩后的文件格式.tar.gz) - 选项说明 :
- -c : 产生.tar打包文件
- -v : 显示详细信息
- -f : 指定压缩后的文件名
- -z : 对文档进行解压或压缩
- -x : 解包tar文件
- 应用实例
- 压缩多个文件,将 /home/pig.txt 和 /home/cat.txt 压缩成 pc.tar.gz
tar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt
注意,压缩的时候会保存目录架构,比如说我们的打包压缩命令是tar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt
,那么最后我们压缩的文件的目路结构就是/home/pig和cat - 将/home 的文件夹 压缩成 myhome.tar.gz
tar -zcvf myhome.tar.gz /home/
- 将 pc.tar.gz 解压到当前目录
tar -zxvf pc.tar.gz
- 将myhome.tar.gz 解压到 /opt/tmp2目录下
tar -zxvf /home/myhome.tar.gz -C /opt/tmp2
-C代表指定解压目录
- 压缩多个文件,将 /home/pig.txt 和 /home/cat.txt 压缩成 pc.tar.gz
组管理
- 组的基本概念 : 在 linux 中的每个用户必须属于一个组,不能独立于组外。在 linux 中每个文件 有所有者、所在组、其它组的概念。
- 所有者 : 一般为文件的创建者,谁创建了该文件,就自然的成为该文件的所有者。
- 所在组 : 当某个用户创建了一个文件后,这个文件的所在组就是该用户所在的组(默认)。
- 其他组 : 除文件的所有者和所在组的用户外,系统的其它用户都是文件的其它组
1 所有者
- 一般为文件的创建者,谁创建了该文件,就自然的成为该文件的所有者。
查看文件的所有者
- 指令
ls –ahl
- 应用实例 :
修改文件的所有者 chown -> change owner
- 指令 :
chown 用户名 文件名
- 应用实例 : 使用 root 创建一个文件 apple.txt ,然后将其所有者修改成 tom
chown hjl apple.txt
- 注意 : 当文件的所有者修改后,该文件的所在组不会改变
2 组的创建
- 指令 :
groupadd 组名
- 应用实例 :
- 创建一个组 monster
groupadd monster
- 创建一用户 fox ,并放入monster组中
useradd -g monster fox
- 创建一个组 monster
3 所在组
查看文件/目录所在组
- 指令 : ls –ahl
- 应用实例 : 使用 fox 来创建一个文件,看看该文件属于哪个组? monst就是所在组
-rw-r--r--. 1 fox monster 0 8月 24 11:38 ok.txt
修改文件/目录所在组
- 指令 :
chgrp 组名 文件名
chgrp -> change group - 应用实例 : 使用 root 用户创建文件 orange.txt ,看看当前这个文件属于哪个组,然后将这个文件所在组,修改到 fruit 组。
touch orange.txt
ls -l
groupadd fruit
chgrp fruit orange.txt
显示 :
-rw-r--r--. 1 root fruit 0 8月 24 11:50 orange.txt
4 其他组
改变用户所在组
- 在添加用户时,可以指定将该用户添加到哪个组中,同样的用 root 的管理权限可以改变某个用户所在的组
- 指令 :
usermod –g 新组名 用户名
usermod –d 目录名 用户名
改变该用户登陆的初始目录。特别说明:用户需要有进入到新目录的权限。
- 应用案例 : 将 zwj 这个用户从原来所在组,修改到 wudang 组
usermod -g wudang zwj
权限管理
ls -l 中显示的内容如下:
-rwxrw-r-- 1 root root 1213 Feb 2 09:39 abc
1. 第一列10个数字说明
1. 第 0 位确定文件类型(d, - , l , c , b)
l 是链接,相当于 windows 的快捷方式
d (directory)是目录,相当于 windows 的文件夹
c (character)是字符设备文件,鼠标,键盘
b (block)是块设备,比如硬盘
- 普通文件
2. 第 1-3 位确定所有者(该文件的所有者)拥有该文件的权限。---User
3. 第 4-6 位确定所属组(同用户组的)拥有该文件的权限,---Group
4. 第 7-9 位确定其他用户拥有该文件的权限 ---Other
2. 第二列 :硬链接数,目录,子目录数
3. 第三列 : 所属用户
4. 第四列 : 所属组
5. 第五列 : 大小(B)
6. 第六列 : 最后的修改时间
7. 第七列 : 名称
注意 : rwx可用数字表示为: r=4,w=2,x=1 因此 rwx=4+2+1=7 , 数字可以进行组合
rwx 权限详解,难点
rwx 作用到文件
- [ r ]代表可读(read): 可以读取,查看
- [ w ]代表可写(write): 可以修改,但是不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除该文件.
- [ x ]代表可执行(execute):可以被执行
rwx 作用到目录
- [ r ]代表可读(read): 可以读取,ls 查看目录内容
- [ w ]代表可写(write): 可以修改, 对目录内创建+删除+重命名目录
- [ x ]代表可执行(execute):可以进入该目录
修改权限-chmod
- 通过 chmod 指令,可以修改文件或者目录的权限。
第一种方式 : + 、-、= 变更权限
- u:所有者 g:所有组 o:其他人 a:所有人(u、g、o 的总和)
- chmod u=rwx,g=rx,o=x 文件/目录名
- chmod o+w 文件/目录名
- chmod a-x 文件/目录名
- 案例 :
- 给 abc 文件 的所有者读写执行的权限,给所在组读执行权限,给其它组读执行权限。
chmod u=rw,g=rx,o=rx abc
- 给 abc 文件的所有者除去执行的权限,增加组写的权限
chmod u-x,g+w,o+w adc
- 给 abc 文件的所有用户添加读的权限
chmod a+r adc
- 给 abc 文件 的所有者读写执行的权限,给所在组读执行权限,给其它组读执行权限。
第二种方式:通过数字变更权限
- r=4 w=2 x=1 rwx=4+2+1=7
- 指令 :
chmod u=rwx,g=rx,o=x 文件目录名
- 案例 : 将 /home/abc.txt 文件的权限修改成 rwxr-xr-x, 使用给数字的方式实现:
chmod 755 /home/abc.txt
修改文件所有者-chown
chown newowner 文件/目录
改变所有者chown newowner:newgroup 文件/目录
改变所有者和所在组- -R 如果是目录 则使其下所有子文件或目录递归生效
- 案例 :
- 请将 /home/abc.txt 文件的所有者修改成 tom
chown king /home/abc.txt
- 请将 /home/test 目录下所有的文件和目录的所有者都修改成 tom
chown -R king /home/test
- 请将 /home/abc.txt 文件的所有者修改成 tom
修改文件/目录所在组-chgrp
chgrp newgroup 文件/目录
【 改变所在组】- 案例 :
- 请将 /home/abc .txt 文件的所在组修改成 shaolin (少林)
chgrp shaolin /home/abc.txt
- 请将 /home/test 目录下所有的文件和目录的所在组都修改成 shaolin(少林)
chgrp -R shaolin /home/test
- 请将 /home/abc .txt 文件的所在组修改成 shaolin (少林)
最佳实践-警察和土匪游戏
police , bandit
jack, jerry: 警察
xh, xq: 土匪
- 创建组
groupadd police
groupadd bandit
- 创建用户
useradd -g police jack
useradd -g police jery
useradd -g bandit xh
useradd -g bandit xq
- jack 创建一个文件,自己可以读 r 写w,本组人可以读,其它组没人任何权限 首先 jack 登录 ;
touch jackFile.txt
chmod 640 jackFile.txt
- jack 修改该文件,让其它组人可以读, 本组人可以读写
chmod o=r,g=wr jackFile.txt
- xh 投靠 警察,看看是否可以读写
- 测试,看看 xh 是否可以读写,xq 是否可以, 小结论,就是如果要对目录内的文件进行操作,需要要有对该目录的 相应权限
- 示意图
- 注意 : 小结论,就是如果要对目录内的文件进行操作,需要要有对该目录的 相应权限
定时任务调度
crontab定时任务调度
crontab
进行 定时任务的设置- 概述 : 是指系统在某个时间执行的特定的命令或程序。
- 分类 :
- 系统工作 : 有些重要的工作必须周而复始地执行。如病毒扫描等
- 个别用户工作 : 个别用户可能希望执行某些程序,比如对mysql 数据库的备份。
- 基本语法 :
crontab [选项]
- 常用选项 :
- -e : 编辑crontab定时任务
- -l : 查询crontab任务
- -r : 删除当前用户所有的crontab任务
- 快速入门 :
设置任务调度文件:/etc/crontab
设置个人任务调度。执行 crontab –e 命令。
接着输入任务到调度文件
如:*/1 * * * * ls –l /etc/ > /tmp/to.txt
意思说每小时的每分钟执行 ls –l /etc/ > /tmp/to.txt 命令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WnmqtffP-1630734433338)(…/images/5ab156a8f447acd157ece50b000698dab7d2b1df3365971d1af66c4460d80196.png)]
- 应用案例 :
- 每隔 1 分钟,就将当前的日期信息,追加到 /tmp/mydate 文件中
- 每隔 1 分钟, 将当前日期和日历都追加到 /home/mycal 文件中
先写脚本my.sh date >> /tmp/mycal cal >> /tmp/mycal 之后给my.sh增加可执行权限 chmod u+x my.sh crontab -e 增加一句话 */1 * * * * /home/my.sh
- 每天凌晨 2:00 将mysql 数据库 testdb ,备份到文件中
at定时任务
- 基本介绍
1) at 命令是一次性定时计划任务,at 的守护进程 atd 会以后台模式运行,检查作业队列来运行。
2) 默认情况下,atd 守护进程每 60 秒检查作业队列,有作业时,会检查作业运行时间,如果时间与当前时间匹配,则 运行此作业。
3) at 命令是一次性定时计划任务,执行完一个任务后不再执行此任务了
4) 在使用 at 命令的时候,一定要保证 atd 进程的启动 , 可以使用相关指令来查看 ps -ef | grep atd //可以检测 atd 是否在运行
- at命令格式 :
at [选项] [时间]
Ctrl + D
结束 at 命令的输入, 输出两次 ps -ef
检测当前有哪些运行的进程- 应用实例 :
- 2 天后的下午 5 点执行 /bin/ls /home
[root@hjl ~]# at 5pm + 2 days at> /bin/ls /home<EOT> job 1 at Sat Aug 28 17:00:00 2021 [root@hjl ~]# atq 1 Sat Aug 28 17:00:00 2021 a root
- atq 命令来查看系统中没有执行的工作任务
atq
- 明天 17 点钟,输出时间到指定文件内 比如 /root/date100.log
at 5pm tomorrow
date > /root/date100.log
- 2 分钟后,输出时间到指定文件内 比如 /root/date200.log
at now + 2 minutes
date > /root/date200.log
- 删除已经设置的任务 ,
atrm 编号
Linux 磁盘分区、挂载
linux分区
- 原理介绍 :
- Linux 来说无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构 , Linux 中每个分区都是用来组成整个文件系统的一部分。
- Linux 采用了一种叫“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录 联系起来。这时要载入的一个分区将使它的存储空间在一个目录下获得。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XFENgdqA-1630734433341)(…/images/73db2a647201386f7c7ac9152906824eb59bcbcc88dae553b3b7853eb68aab9d.png)]
- 硬盘说明 :
- Linux 硬盘分 IDE 硬盘和 SCSI 硬盘,目前基本上是 SCSI 硬盘
- 对于 IDE 硬盘,驱动器标识符为“hdx~”,其中“hd”表明分区所在设备的类型,这里是指 IDE 硬盘了。“x”为盘号(a 为 基本盘,b 为基本从属盘,c 为辅助主盘,d 为辅助从属盘),“~”代表分区,前四个分区用数字 1 到 4 表示,它们是主分区或扩展分区,从 5 开始就是逻辑分区。例,hda3 表示为第一个 IDE 硬盘上的第三个主分区或扩展分区,hdb2 表示为第二个 IDE 硬盘上的第二个主分区或扩展分区。
- 对于 SCSI 硬盘则标识为“sdx~”,SCSI 硬盘是用“sd”来表示分区所在设备的类型的,其余则和 IDE 硬盘的表示方法 一样
- 查看所有设备挂载情况 :
lsblk
或者lsblk -f
挂载案例
- 如何增加一块硬盘
- 虚拟机添加硬盘
- 分区
- 格式化
- 挂载
- 设置可以自动挂载
- 分区命令
- 指令 :
fdisk /dev/sdb
- 开始分区 :
- m 显示命令列表
- p 显示磁盘分区 同 fdisk –l
- n 新增分区
- d 删除分区
- w 写入并退出
- 说明 : 开始分区后输入 n,新增分区,然后选择 p ,分区类型为主分区。两次回车默认剩余全部空间。最后输入w 写入分区并退出,若不保存退出输入 q。
- 指令 :
[root@hjl ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0x074210b3 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):m
命令操作
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
g create a new empty GPT partition table
G create an IRIX (SGI) partition table
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
分区号 (1-4,默认 1):1
起始 扇区 (2048-2097151,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-2097151,默认为 2097151):
将使用默认值 2097151
分区 1 已设置为 Linux 类型,大小设为 1023 MiB
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@hjl ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 2G 0 part [SWAP]
└─sda3 8:3 0 17G 0 part /
sdb 8:16 0 1G 0 disk
└─sdb1 8:17 0 1023M 0 part
sr0 11:0 1 1024M 0 rom
- 格式化磁盘 : 以为上面的步骤之后,我们输入
lsblk -f
会发现,系统没有给新的分区设置uuid- 指令 :
mkfs -t ext4 /dev/sdb1
- 注意 : ext4是分区类型
- 指令 :
- 挂载 : mount,以为上面的步骤之后,我们输入
lsblk -f
会发现,系统没有给新的分区设置挂载点- 将一个分区与一个目录联系起来,所以我们首先应该创建一个目录,然后才挂载
- 指令 :
mount 设备名称 挂载目录
- 例如:
mount /dev/sdb1 /newdisk
- umount 设备名称 或者 挂载目录
- 例如:
umount /dev/sdb1
或者umount /newdisk
- 设置自动挂载,在上面步骤结束后,如果重启系统,会发现之前设置的挂载点失效了,所以我们要设置自动挂载,也就是永久挂载
- 通过修改/etc/fstab 实现挂载,添加完成后 执行
mount –a
即刻生效
- 通过修改/etc/fstab 实现挂载,添加完成后 执行
查询系统整体磁盘使用情况
df -h
,df -h /目录
可以查看对于目录的磁盘占用情况,默认为当前目录
[root@hjl /]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda3 17G 5.7G 11G 37% /
devtmpfs 895M 0 895M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 11M 900M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda1 976M 144M 766M 16% /boot
.host:/ 238G 157G 81G 67% /mnt/hgfs 这个这么大,是我们设置的虚拟目录,所以显示的是我们windows对于磁盘大小
tmpfs 182M 4.0K 182M 1% /run/user/42
tmpfs 182M 28K 182M 1% /run/user/0
查询指定目录的磁盘占用情况
du -h
- 选项
- -s 指定目录占用大小汇总
- -h 带计量单位
- -a 含文件
- –max-depth=1 子目录深度
- -c 列出明细的同时,增加汇总值
- 应用实例 : 查询 /opt 目录的磁盘占用情况,深度为 1
[root@hjl opt]# du -h --max-depth=1 /opt
4.0K /opt/ccc
4.0K /opt/rh
20K /opt/tmp
96M /opt/tmp2
163M /opt/vmware-tools-distrib
315M /opt ->这是汇总
-- 连带文件显示
[root@hjl opt]# du -ha --max-depth=1 /opt
4.0K /opt/ccc
4.0K /opt/rh
54M /opt/VMwareTools-10.3.22-15902021.tar.gz
3.5M /opt/杂文.txt
20K /opt/tmp
96M /opt/tmp2
163M /opt/vmware-tools-distrib
315M /opt
-- 显示总大小
[root@hjl opt]# du -hac --max-depth=1 /opt
4.0K /opt/ccc
4.0K /opt/rh
54M /opt/VMwareTools-10.3.22-15902021.tar.gz
3.5M /opt/杂文.txt
20K /opt/tmp
96M /opt/tmp2
163M /opt/vmware-tools-distrib
315M /opt
315M 总用量
磁盘使用指令
- 统计/opt 文件夹下文件的个数
ls -l /opt | grep "^-" | wc -l
[root@hjl opt]# ll
总用量 58676
drwxr-xr-x. 2 root root 4096 8月 23 21:59 ccc
drwxr-xr-x. 2 root root 4096 10月 31 2018 rh
drwxr-xr-x. 3 root root 4096 8月 24 10:51 tmp
drwxr-xr-x. 3 root root 4096 8月 24 11:10 tmp2
-rw-r--r--. 1 root root 56414224 3月 25 2020 VMwareTools-10.3.22-15902021.tar.gz
drwxr-xr-x. 9 root root 4096 3月 25 2020 vmware-tools-distrib
-rw-r--r--. 1 root root 3642757 8月 24 08:40 杂文.txt
[root@hjl opt]# ls -l /opt | grep "^-"
-rw-r--r--. 1 root root 56414224 3月 25 2020 VMwareTools-10.3.22-15902021.tar.gz
-rw-r--r--. 1 root root 3642757 8月 24 08:40 杂文.txt
[root@hjl opt]# ls -l /opt | grep "^-" | wc -l
2
- 统计/opt 文件夹下目录的个数
ls -l /opt | grep "^d" | wc -l
- 统计/opt 文件夹下文件的个数,包括子文件夹里的
ls -lR /opt | grep "^-" | wc -l
- 统计/opt 文件夹下目录的个数,包括子文件夹里的
ls -lR /opt | grep "^d" | wc -l
- 以树状显示目录结构 tree 目录 , 注意,如果没有 tree ,则使用
yum install tree
安装tree /home/
NAT网络配置
网络配置原理图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-myxQsdMn-1630734433343)(…/images/efea682b7a26539d4fde94700284861b531dc4a4b288ec5f74ae5c9fd85fd5c0.png)]
查看网络 IP 和网关
- 查看网络ip
- windows下在cmd窗口输入
ipconfig
- linux在终端输入
ifconfig
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zO9sci1T-1630734433350)(…/images/6a9894367604902cf2eec036c418052f59564ffb7fbb3b468c5af1c2217b1cc2.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DwUkAXcr-1630734433353)(…/images/03004875cf34d5a4d411edc8ffa0befb345ea6587b21634fb1ea4195ac4de1f5.png)]
- windows下在cmd窗口输入
- 查看网关
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3cenyexi-1630734433355)(…/images/f929d6470a832211d18b075750efddebb2c94603e53590f39c854c71236b66f4.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RG9jLR25-1630734433357)(…/images/c234e38965addcce627363cc3c927e592e64e22b44e31c1831ef7ff50f4353e6.png)] ping 目的主机
,测试当前服务器是否可以连接目的主机
linux网络环境配置
- 第一种方法 : 自动获取(linux的地址会变化)
- 登陆后,通过界面的来设置自动获取 ip,特点:linux 启动后会自动获取 IP,缺点是每次自动获取的 ip 地址可能不一样
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U2lWOmaO-1630734433361)(…/images/92fbe7b8facbd0fa00d65544736c70eefe0085209aef9d8d9c2463367377ecf4.png)]
- 登陆后,通过界面的来设置自动获取 ip,特点:linux 启动后会自动获取 IP,缺点是每次自动获取的 ip 地址可能不一样
- 第二种方法 : 指定ip
- 直接修改配置文件来指定 IP,并可以连接到外网(程序员推荐)
- 编辑
vim /etc/sysconfig/network-scripts/ifcfg-ens33
要求:将 ip 地址配置的静态的,比如: ip 地址为 192.168.200.130
ifcfg-ens33 文件说明
DEVICE=eth0 #接口名(设备,网卡)
HWADDR=00:0C:2x:6x:0x:xx #MAC地址
TYPE=Ethernet #网络类型(通常是 Ethemet)
UUID=926a57ba-92c6-4231-bacb-f27e5e6a9f44 #随机 id
#系统启动的时候网络接口是否有效(yes/no)
ONBOOT=yes
# IP 的配置方法[none|static|bootp|dhcp](引导时不使用协议|静态分配 IP|BOOTP 协议|DHCP 协议) BOOTPROTO=static
#IP 地址
IPADDR=192.168.200.130
#网关
GATEWAY=192.168.200.2
#域名解析器
DNS1=192.168.200.2
- 修改后
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="a11c3585-6021-4ace-9997-ba53c0fb6618"
DEVICE="ens33"
ONBOOT="yes"
#IP 地址
IPADDR=192.168.200.130
#网关
GATEWAY=192.168.200.2
#域名解析器
DNS1=192.168.200.2
- 重启网络服务或者重启
service network restart
、reboot
主机名和host映射
- 设置主机名:
- 为了方便记忆,可以给 linux 系统设置主机名, 也可以根据需要修改主机名
- 指令
hostname
: 查看主机名 - 修改文件在 /etc/hostname 指定
- 修改后,重启生效
- 设置 hosts 映射
- 之前我们都是输入
ping 192.168.200.130
来检测是否ping通,如果你想通过host来ping,即输入ping hjl
,就需要设置host映射
- windows下 :
C:\Windows\System32\drivers\etc\hosts
文件指定即可
# Copyright (c) 1993-2009 Microsoft Corp. # # This is a sample HOSTS file used by Microsoft TCP/IP for Windows. # # This file contains the mappings of IP addresses to host names. Each # entry should be kept on an individual line. The IP address should # be placed in the first column followed by the corresponding host name. # The IP address and the host name should be separated by at least one # space. # # Additionally, comments (such as these) may be inserted on individual # lines or following the machine name denoted by a '#' symbol. # # For example: # # 102.54.94.97 rhino.acme.com # source server # 38.25.63.10 x.acme.com # x client host # localhost name resolution is handled within DNS itself. # 127.0.0.1 localhost # ::1 localhost #127.0.0.1 activate.navicat.com 192.168.200.130 hjl # 加上这一行即可
- 在linux下 : 在
/etc/hosts
文件 指定 添加192.168.200.128 surface4
- 之前我们都是输入
- 主机名解析机制分析 : 例如,用户在浏览器输入了www.baidu.com
- 浏览器检查浏览器缓存有没有该域名解析ip地址
- 没有去dns缓存查
- 没有去本地hosts文件查
- 没有去互联网当中的dns域名服务器查:dns是分级的,是一组服务器
本地域名服务器 根域名服务器 顶级(二级,三级)域名服务器 权威域名服务器
- 还没有找到就返回域名不存在
进程
基本介绍
- 在 LINUX中,每个执行的程序都称为一个进程。每一个进程都分配一个 ID号(pid,进程号)。=>windows => linux
- 每个进程都可能以两种方式存在的。前台与后台,所谓前台进程就是用户目前的屏幕上可以进行操作的。后台进程 则是实际在操作,但由于屏幕上无法看到的进程,通常使用后台方式执行。
- 一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中。直到关机才才结束。
ps显示系统执行的进程
ps
命令是用来查看目前系统中,有哪些正在执行,以及它们执行的状况。可以不加任何参数.
[root@hjl ~]# ps
PID TTY TIME CMD
19583 pts/2 00:00:00 bash
20007 pts/2 00:00:00 ps
# pid : 进程识别号
# tty : 终端机号
# time : 此进程消耗的cpu时间
# cmd : command 进程名 执行该进程的指令
- 选项 :
- -a : 显示当前终端的所有进程信息
- -u : 以用户的格式显示进程信息
- -x : 显示后台进程运行的参数
System V展示风格
USER:用户名称
PID:进程号
%CPU:进程占用 CPU的百分比
%MEM:进程占用物理内存的百分比
VSZ:进程占用的虚拟内存大小(单位:KB)
RSS:进程占用的物理内存大小(单位:KB)
TT:终端名称,缩写 .
STAT:进程状态,其中 S-睡眠,s-表示该进程是会话的先导进程,N-表示进程拥有比普通优先级更低的优先级,R正在运行,D-短期等待,Z-僵死进程,T-被跟踪或者被停止等等
STARTED:进程的启动时间
TIME:CPU时间,即进程使用 CPU的总时间
COMMAND:启动进程所用的命令和参数,如果过长会被截断显示
kill杀死进程
kill [选项] 进程号
(功能描述:通过进程号杀死/终止进程)killall 进程名称
(功能描述:通过进程名称杀死进程,连带的杀死其子进程,也支持通配符,这在系统因负载过大而变得很慢时很有用)- 常用选项
-9
, 强迫进程立即停止,比如要踢掉某个非法用户,终止远程登录服务sshd,终止多个gedit,强制杀掉一个终端 - 案例 :
- 案例 1:踢掉某个非法登录用户 kill 进程号–>
kill 11421
- 案例 2: 终止远程登录服务 sshd, 在适当时候再次重启 sshd 服务–>
kill sshd 对应的进程号
;
重启sshd.service -->/bin/systemctl start sshd.service
- 案例 3: 终止多个 gedit , -->
killall gedit
- 案例 4:强制杀掉一个终端, -->
kill -9 bash
对应的进程号
- 案例 1:踢掉某个非法登录用户 kill 进程号–>
pstree查看进程树
pstree [选项]
,可以更加直观的来看进程信息- 选项 :
- -p :显示进程的 PID
- -u :显示进程的所属用户
服务管理
基本介绍
- 介绍 : 服务(service) 本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如(mysqld , sshd,防火墙等),因此我们又称为守护进程,是 Linux 中非常重要的知识点。
- 例如 : 启动network->
service network start
- 注意 : 在 CentOS7.0 后 很多服务不再使用 service ,而是 systemctl (后面专门讲),如果指令 :
ls -l /etc/init.d/
可以查看还可以用service控制的服务
查看服务名 :
1. `setup` 即可,之后就会进入一个窗口
![图 6](../images/ff9ce83b4d3748fe5c3e473b41403eb20df555a536fadcfb3464c6d27fa29275.png)
2. /etc/init.d 看到 service 指令管理的服务 `ls -l /etc/init.d`
服务器运行级别(runlevel)
- Linux 系统有 7 种运行级别(runlevel):常用的是级别 3 和 5
1. 运行级别 0:系统停机状态,系统默认运行级别不能设为 0,否则不能正常启动
2. 运行级别 1:单用户工作状态,root 权限,用于系统维护,禁止远程登陆
3. 运行级别 2:多用户状态(没有NFS),不支持网络
4. **运行级别 3**:完全的多用户状态(有NFS),无界面,登陆后进入控制台命令行模式
5. 运行级别 4:系统未使用,保留
6. **运行级别 5**:X11 控制台,登陆后进入图形GUI 模式
7. 运行级别 6:系统正常关闭并重启,默认运行级别不能设为 6,否则不能正常启动
- 修改当前系统的默认运行级别 :
1. 获取运行级别 : `systemctl get-default`
2. 修改运行级别 : `systemctl set-default multi-user.target` 修改为3级别
- multi-user.target : 3 多用户命令行界面
- graphical.target : 5 图形界面
chkconfig
- chkconfig指令可以显示,服务在不同运行级别下的自启动状态
- 查看服务
chkconfig --list
[root@hjl ~]# chkconfig --list
注:该输出结果只显示 SysV 服务,并不包含
原生 systemd 服务。SysV 配置数据
可能被原生 systemd 配置覆盖。
要列出 systemd 服务,请执行 'systemctl list-unit-files'。
查看在具体 target 启用的服务请执行
'systemctl list-dependencies [target]'。
netconsole 0:关 1:关 2:关 3:关 4:关 5:关 6:关
network 0:关 1:关 2:开 3:开 4:开 5:开 6:关
vmware-tools 0:关 1:关 2:开 3:开 4:开 5:开 6:关
比如network服务,在运行级别3的时候是开启的,在运行级别1的时候是关闭的
- 修改服务在某一级别的自启动状态 :
chkconfig --level 3 network off/on
systemctl
- 基本语法:
systemctl [start | stop | restart | status] 服务名
- 例如关闭防火墙 :
systemctl stop firewalld.service
- 例如关闭防火墙 :
- systemctl 指令管理的服务在 /usr/lib/systemd/system 查看
- systemctl可以设置服务的自启动状态 :
systemctl list-unit-files
查看服务开机启动状态,可以使用grep过滤
[root@hjl ~]# systemctl list-unit-files | grep firewalld.service firewalld.service enabled
systemctl enable 服务名
: 设置服务开机启动systemctl disable 服务名
: 关闭服务开机启动systemctl is-enabled 服务名
: 查询某个服务是不是自启动的
[root@hjl ~]# systemctl is-enabled firewalld.service enabled
- 注意细节 :
- 关闭或者启用防火墙后,立即生效。[telnet 测试 某个端口即可]
- 这种方式只是临时生效,当重启系统后,还是回归以前对服务的设置。
- 如果希望设置某个服务自启动或关闭永久生效,要使用
systemctl [enable|disable] 服务名
防火墙
- 防火墙开启,这个时候有一个请求,那么会有以下操作
- 看请求的服务是否开启
- 如果开启,看该请求的端口是否处于打开状态,打开状态则允许访问,关闭状态则不允许访问
- 如果请求的服务为关闭状态,那么不允许访问
- 防火墙关闭,这个时候有请求,那么直接看请求的服务是否打开即可
firewall指令,负责在防火墙开启的情况下打开端口
- 在真正的生产中,我们往往是需要把防火墙打开的,但是问题来了,如果我们把防火墙打开,那么外部请求数据包就不能跟服务器直接通讯,这个时候,我们就需要打开对应的端口,让外部请求通过端口跟服务器通讯
- firewall 指令
- 注意 : 查看协议 :
netstat -anp
- 打开端口 :
firewall-cmd --permanent --add-port=端口号/协议
- 关闭端口 :
firewall-cmd --permanent --remove-port=端口号/协议
- 重新载入,才能生效 :
firewall-cmd --reload
- 查询端口是否开放:
firewall-cmd --query-port=端口/协议
- 注意 : 查看协议 :
top动态监控进程
指令
- top 与 ps 命令很相似。它们都用来显示正在执行的进程。Top 与 ps 最大的不同之处,在于 top 在执行一段时间可以更新正在运行的的进程。
- 基本语法 :
top [选项]
- 选项 :
- -d 秒数 : 指定top命令每隔几秒更新,默认是3秒
- -i : 使top不现实任何闲置或僵死进程
- -p : 通过指定监控进程id来仅仅监控某个进程的状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-REQXgZlN-1630734433363)(…/images/40bdbe1e987e51b80b4e055e2f2ce43d1dcb866eadafea96124310e6a858beec.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2JztUfNo-1630734433365)(…/images/140238df9afbdab5944fe70ee3ba8692d64b7db3e9b99a3183e31bd94b32221b.png)]
- 注意 : 僵死进程–>进程已经死掉,但是内存没有释放
交互操作
- 交互操作
- P : 以cpu使用率排序,默认就是此项
- M : 以内存的使用率排序
- N : 以pid排序
- q : 退出top
- 案例 :
- 案例 1.监视特定用户, 比如我们监控 tom用户 :
- top:输入此命令,按回车键,查看执行的进程。
- u:然后输入“u”回车,再输入用户名,即可,
- 案例 2:终止指定的进程, 比如我们要结束 tom登录
- top:输入此命令,按回车键,查看执行的进程。
- k:然后输入“k”回车,再输入要结束的进程 ID号,之后可能还要求你输入一个信号量,一般输入
9
强制kill即可
- 案例 3:指定系统状态更新的时间(每隔 10 秒自动更新), 默认是 3 秒
top -d 10
- 案例 1.监视特定用户, 比如我们监控 tom用户 :
netstat监控网络状态
- 基本语法 :
netstat [选项]
- 选项 :
- -an 按一定顺序排列输出
- -p 显示哪个进程在调用
- 应用案例 : 请查看服务名为 sshd 的服务的信息。
netstat -anp | grep sshd
rpm和yum
rpm
- 介绍
rpm用于互联网下载包的打包及安装工具,它包含在某些 Linux 分发版中。它生成具有.RPM扩展名的文件。RPM
是RedHat Package Manager(RedHat 软件包管理工具)的缩写,类似windows 的 setup.exe,这一文件格式名称虽然打上 了RedHat 的标志,但理念是通用的。
Linux 的分发版本都有采用(suse,redhat, centos 等等),可以算是公认的行业标准了。
指令
- 查询指令 :
rpm -qa
,例如 : 查看是否安装了firefoxrpm -qa | grep firefox
一个 rpm包名:firefox-60.2.2-1.el7.centos.x86_64
名称:firefox
版本号:60.2.2-1
适用操作系统: el7.centos.x86_64 表示 centos7.x 的 64 位系统
如果是 i686、i386 表示 32 位系统,noarch 表示通用
rpm -q 软件包名
: 查询软件包是否安装 例如rpm -q firefox
rpm -qi 软件包名
: 查询软件包信息rpm -ql 软件包名
: 查询软件包中的文件rpm -ql firefox
rpm -qf 文件全路径名
: 查询文件所属的软件包rpm -qf /etc/passwd
[root@hjl ~]# rpm -qf /etc/passwd
setup-2.8.71-10.el7.noarch
[root@hjl ~]# rpm -qf /root/install.log
错误:文件 /root/install.log:没有那个文件或目录
- 卸载rpm包 :
rpm -e RPM包的名称
- 应用案例 : 删除firefox软件包
rpm -e firefox
- 细节 :
- 如果其它软件包依赖于您要卸载的软件包,卸载时则会产生错误信息。
如: $rpm -e foo
removing these packages would break dependencies:foo is needed by bar-1.0-1 - 如果我们就是要删除 foo 这个 rpm 包,可以增加参数 --nodeps ,就可以强制删除,但是一般不推荐这样做,因为依 赖于该软件包的程序可能无法运行
如:$rpm -e --nodeps foo
- 如果其它软件包依赖于您要卸载的软件包,卸载时则会产生错误信息。
- 应用案例 : 删除firefox软件包
- 安装 rpm包 :
rpm -ivh RPM包全路径名称
- 参数说明 :
- i=install 安装
- v=verbose 提示
- h=hash 进度条
- 应用实例 : 演示卸载和安装 firefox 浏览器 :
rpm -e firefox
;rpm -ivh firefox
- 参数说明 :
yum
- Yum 是一个 Shell 前端软件包管理器。基于RPM包管理,能够从指定的服务器自动 下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。
指令
- 查询 yum服务器是否有需要安装的软件 :
yum list|grep xx
软件列表 - 安装指定的 yum包 :
yum install xxx
下载安装
- 案例 : 请使用 yum的方式来安装 firefox -->
rpm -e firefox
;yum list | grep firefox
;yum install firefox
搭建Java EE环境
- 准备好jdk安装包存放的地方,应该存放在 /opt/jdk, opt目录就是linux存放额外安装包的地方
mkdir /opt/jdk
,注意这里不需要加-r
,以为opt目录以及存在,所以这里创建的不是多级目录 - 解压jdk压缩包
tar -zxvf jdk-8u261-linux-x64.tar.gz
- 将解压后的内容,放置到/usr/local/java下,因为usr/local就是linux下额外安装内容的存放位置
mv /opt/jdk /usr/local/java
- 之后
cd /usr/local/java/jdk/bin
,bin下存放和java有关的指令,这个时候输入./java -version
就可以查看jdk版本信息 - 但是一旦切换目录,我们就无法使用java有关的指令,如果想使用,必须输入非常长的安装路径,所以,我们需要就行环境变量的配置,和系统配置有关的配置文件都在/etc下
vim /etc/profile
,在文件的最下面输入export JAVA_HOME=/usr/local/java/jdk1.8.0_261 export PATH=$JAVA_HOME/bin:$PATH
- 这个时候我们输入
echo $PATH
依然不会显示我们刚刚配置的环境变量的路径,我们需要刷新 source /etc/profile
即可,之后我们可以在任意路径下使用java有关指令
- 简单的java代码
vim ./Hello.java
public class Hello{ public static void main(String[] args){ System.out.println("hello world"); } }
javac Hello.java
就会产生编译后的.class文件java Hello
就会在终端输出hello world
,注意,这里不要写java文件的后缀名
tomcat安装
cd /opt/tomcat/
- 解压tomcat压缩包 :
tar -zxvf apache-tomcat-8.5.59.tar.gz
cd /opt/tomcat/apache-tomcat-8.5.59
cd bin/
./startup.sh
开启tomcat服务- 之后,在浏览器输入
192.168.200.128
,发现无法跳转,这是因为我们没有开启tomcat对应的8080端口,防火墙拦截了 firewall-cmd --permanent --add-port=8080/tcp
开启端口号firewall-cmd --reload
重新载入,不然端口还是没有开启firewall-cmd --query-port=8080/tcp
检查看8080端口开启没有- 之后浏览器就可以正常访问
- 接下来写一个简单的html
192.168.200.128:8080
cd /opt/tomcat/apache-tomcat-8.5.59/webapps/ROOT
进入tomcat部署文件的默认路径- 然后在这个目录下创建一个简单的html页面
- 在浏览器输入
192.168.200.128:8080/hjl.html
这里的hjl.html就是刚刚写的简单的html页面
搭建mysql环境
- 老样子,将压缩包解压到/opt/mysql/下
- 如果你是centos系统,该系统会自带一个类mysql数据库,会和mysql冲突,要先删除
rpm -qa | grep mari
查询是否有该数据库rpm -e --nodeps mariadb-libs
卸载
- 刚才解压完,我们会发现有很多的rpm安装包,安装其中四个安装包
rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm
- 运行
systemctl start mysqld.service
,启动mysql服务 - mysql安装好后会给mysql的root用户自动创建一个复杂的默认密码,我们要先查看该密码
grep "password" /var/log/mysqld.log
,然后修改该密码,因为不修改初始密码,我们无法进行任何操作 mysql -u root -p默认密码
登录mysql,之后set password for 'root'@'localhost' =password('新密码');
来修改密码flush privileges
使得修改生效,一般如果是对mysql进行了配置修改,最好使用一次该代码,否则很可能修改暂时不生效- 之后就可以进行对mysql的正常操作了,如果你想在windows中对linux虚拟机的mysql操作,首先,你需要在linux虚拟机内,打开mysql的端口,然后,进入mysql数据库,输入以下代码
use mysql;
update user set host = '%' where user = 'root';
flush privileges
- 进行如上的操作是为了允许远程登录mysql,mysql默认不允许远程登录
- 如果你发现,在linux虚拟机的musql中创建的表格,无法插入中文字符,那是因为安装的mysql的默认字符集是lati乱七八糟的,我们需要修改为utf8才可以正常使用,具体方法各位百度
shell编程
学习目的
- Linux 运维工程师在进行服务器集群管理时,需要编写 Shell 程序来进行服务器管理。
- 对于 JavaEE 和 Python 程序员来说,工作的需要,你的老大会要求你编写一些 Shell 脚本进行程序或者是服务器的维 护,比如编写一个定时备份数据库的脚本。
- 对于大数据程序员来说,需要编写 Shell 程序来管理集群
- 什么是shell : 我们书写的指令比如
mkdir /opt/jdkk/
,是无法直接被linux内核理解并执行的,所以,linux内核和指令之间存在一个shell,shell就是一个命令行解释器,会负责将我们的指令,解释成为linux内核可以理解并执行
shell脚本的执行方式
- 格式要求 :
- 脚本要以
#!/bin/bash
开头 - 脚本要有可执行权限,也就是rwx中的x
- 脚本文件名后缀约定俗成为
.sh
- 脚本要以
- 编写第一个shell脚本 : 创建一个shell脚本,输出hello world!
#!/bin/bash echo "hello world"
- 执行shell脚本有两种方式
- 第一种 : 首先,给.sh文件赋予x权限,然后
./hello.sh
即可 - 第二种 : 不用给.sh赋予权限,直接
sh hello.sh
- 第一种 : 首先,给.sh文件赋予x权限,然后
shell变量
#!bin/bash
#案例1 : 定义变量
A=100
# 输出变量需要加上$符号
echo \$A=$A
#案例2 : 撤销变量
unset A
echo "\$A=$A"
#案例3 : 声明静态的变量B=2,不可以撤销
readonly B=2
echo "B=$B"
unset B #这里会报错反设定,因为静态变量不可以撤销
- shell变量命名规则
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。5A=200(×)
- 等号两侧不能有空格
- 变量名称一般习惯为大写, 这是一个规范,我们遵守即可
环境变量
vim /etc/profile
- 再文件的最下面,输入
export 变量名=变量值
- 之后,退出文件,输入
source /etc/profile
,更新 - 之后在终端输入
echo $环境变量名
即可输出对应的变量值
获取命令行的参数消息
$n
n为1/2/3/4等等数字,如果n>10,则因写成格式类似于${10}
,可以获得命令行的第n个参数$*
获取命令行全部参数,将全部参数当作一个整体$@
获取命令行全部参数,但是会将每个参数区分对待$#
获取命令行中参数的个数
#!/bin/bash
echo "$1 $2 $3"
echo "所有的参数为$*"
echo "$@"
echo "参数的个数$#"
预定义变量
- shell设计者实现准备好的变量,可以直接使用
- $$ 当前进程的pid
- $! 后台运行的最后一个进程的pid
- $? 最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变 量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了
#!/bin/bash
echo "当前执行的进程 id=$$"
#加&代表以后台的方式运行一个脚本,并获取他的进程号
/root/shcode/myshell.sh &
echo "最后一个后台方式运行的进程 id=$!"
echo "执行的结果是=$?"
运算符
- 有三种运算表达式书写方式
$((运算表达式))
$[运算表达式]
expr 表达式
注意,表达式中,运算符两边必须用空格隔开- 在expr方式中,*应该写为*
#!/bin/bash
#案例1:计算(2+3)*4的值
#使用第一种方式
RES1=$(((2+3)*4))
echo res1=$RES1
#第二种方式:推荐
RES2=$[(2+3)*4]
echo res2=$RES2
#第三种方式,不推荐,注意,运算符号两边必须有空格,并且*必须写成\*
TEMP=`expr 2 + 3`
echo TEMP=$TEMP
RES3=`expr $TEMP \* 4`
echo RES3=$RES3
#案例2:计算命令行的两个参数的和
RES4=$[$1+$2]
echo RES4=$RES4
条件判断
=
字符串比较- 整数比较
- -lt 小于
- -le 小于等于 little equal
- -eq 等于
- -gt 大于
- -ge 大于等于
- -ne 不等于
- 按照文件权限进行判断
- -r 有读的权限
- -w 有写的权限
- -x 有执行的权限
- 按照文件类型进行判断
- -f 文件存在并且是一个常规的文件
- -e 文件存在
- -d 文件存在并是一个目录
#!/bin/bash
#案例 1:"ok"是否等于"ok" 判断语句:使用 =
if [ "ok" = "ok" ]
then
echo "equal"
fi
#案例 2:23 是否大于等于 22 判断语句:使用 -ge
if [ 23 -ge 22 ]
then
echo "大于等于"
fi
#案例 3:/root/shcode/aaa.txt 目录中的文件是否存在 判断语句: 使用 -f
if [ -f /root/shcode/aaa.txt ]
then
echo "文件存在"
fi
if else
#!/bin/bash
#单分支
if[ $1 -ge 60 ]
then
echo "不及格"
fi
#案例:请编写一个 shell 程序,如果输入的参数,大于等于 60,则输出 "及格了",如果小于 60,则输出 "不及格"
if [ $1 -ge 60 ]
then
echo "及格了"
elif [ $1 -lt 60 ]
then
echo "不及格"
fi
case
#!/bin/bash
#案例1 : 当命令行参数是 1 时,输出 "周一", 是 2 时,就输出"周二", 其它情况输出 "other"
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other..."
;;
esac
for
#!/bin/bash
#案例 1 :打印命令行输入的参数 [这里可以看出$* 和 $@ 的区别]
#注意,$*是吧输入的参数当作一个整体,所以只会输出一句话
for i in "$*"
do
echo "number is $i"
done
#$@是吧输入的参数当作一个整体,所以会输出多句话
echo "=================================="
for i in "$@"
do
echo "number is $i"
done
#!/bin/bash
#案例2 : 从 1 加到 100 的值输出显示
#定义一个变量SUM负责保存1到100的和
SUM=0
for(( i=1; i<=$1; i++))
do
#写上你的业务代码
SUM=$[$SUM+i]
done
echo $SUM
while
#!/bin/bash
#案例 1 :从命令行输入一个数 n,统计从 1+..+ n 的值是多少?
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+i]
#i自增
i=$[$i+1]
done
echo $SUM
read读取控制台输入
- -p:指定读取值时的提示符;
read -p "请输入一个数NUM1=" NUM1
- -t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。。
read -t 3 -p "请输入一个数NUM2=" NUM2
#!/bin/bash
#案例 1:读取控制台输入一个NUM1 值
read -p "请输入一个数NUM1=" NUM1
echo "你输入的NUM1=$NUM1"
#案例 2:读取控制台输入一个NUM2 值,在 10 秒内输入
read -t 3 -p "请输入一个数NUM2=" NUM2
echo "你输入的NUM2=$NUM2"
系统函数
- basename 一般用于获取文件名称,返回完整路径最后 / 的部分,常用于获取文件名,由三部分组成
basename 路径 后缀名
如果加上后缀名,你们最后得到的文件名称,会再删除掉尾部的匹配的后缀[root@hjl shcode]# basename /home/aaa/test.txt test.txt [root@hjl shcode]# basename /home/aaa/test190219012.txt test190219012.txt [root@hjl shcode]# basename /home/aaa/test190219012.txt txt test190219012. [root@hjl shcode]# basename /home/aaa/test190219012.txt .txt test190219012 [root@hjl shcode]# basename /home/aaa/test190219012.txt 012.txt
- dirname 一般用于获取文件路径,返回完整路径最后 / 的前面的部分,常用于返回路径部分
[root@hjl shcode]# dirname /home/aaa/test.txt /home/aaa
自定义函数
#!/bin/bash
#函数getSum可以返回两个参数的和
#定义函数
function getSum() {
SUM=$[$n1+$n2]
echo "SUM=$SUM"
}
#输入两个值
read -p "请输入n1=" n1
read -p "请输入n2=" n2
#调用自定义函数
getSum $n1 $n2
~