Linux中的权限、进程、服务、网络的管理与防火墙

查看权限

使用 ls -l, 或者 ls 命令查看目录下的文件, 第一列就是文件或者目录的权限位:

[test@ubuntu: ~]$ ls -l
-rw-rw-r-- 1 test test    0 Sep 23 16:18 file.log
drwxrwxr-x 2 test test 4096 Sep 23 15:55 study

第1位:代表文件类型

  • - 普通文件
  • d 目录文件
  • l 链接文件(快捷方式)

注意:系统的文件类型多达十几种,但常用的就3种,比如 /dev 硬件设备目录中有 c 和 b 开头的,字符和块设备文件,都是系统正常运转才会使用到的文件,不可以动的文件。

第2到9位:权限标识

2-4位: 属主权限 user

5-7位: 属组权限 group

7-10位: 其他人权限 other

符号 说明
r read可读, 如果目录没有 r 权限, 则不能使用 ls 查看目录内容
w write可写, 如果目录没有 w 权限, 则不能在目录创建文件
x excute可执行, 如果目录没有 x 权限, 则不能通过 cd 进入改目录

修改权限

chmod 命令可以修改权限, 格式如下:

chmod [-R] 权限 文件

-R 参数可选, 递归给目录里面的所有的文件和目录进行设置

file.log 的所有者 ux 执行权限:

[test@ubuntu: ~]$ chmod u+x file.log

file.log 的所有者 u 去掉 x 执行权限:

[test@ubuntu: ~]$ chmod u-x file.log

file.log 的所属组和其他人都加入 权限:

[test@ubuntu: ~]$ chmod g+w,o+w file.log

以上稍微有点麻烦,以下有稍微简单的, 给所有者添加 读写执行 权限:

[test@ubuntu: ~]$ chmod u=rwx file.log

这种方法还是不够简单,推荐使用数字一般代表标准执行权限:

[test@ubuntu: ~]$ chmod 755 file.log

一般表示标准只读权限:

[test@ubuntu: ~]$ chmod 644 file.log

表示所有权限, 任何人可以读写执行:

[test@ubuntu: ~]$ chmod 777 file.log

特别注意:不可以给目录赋予 777 权限,容易被攻击

说明:

7 表示所有者的权限 4+2+1 读写执行都有, 等同于 u=rwx

5 表示所属组的权限 4+1 读和执行权限, 等同于 g=rx

5 第二个5表示其他人的权限 4+1 读和执行权限, 等同于 o=rx

符号 说明
u user 表示该文件的所有者
g group 表示与该文件的所有者属于同一组 (group) 者,即用户组
o other 表示其他以外的人
a all 表示这三者皆是
+ 增加权限
撤销权限
= 设定权限
4 等同于 r, 读权限
2 等同于 w, 写权限
1 等同于 x, 执行权限

修改所属主/组

ls -l 查看的文件信息, 第一列是权限, 第二列是所属主, 第三列是所属组:

通过 chown 命令, 可以修改文件的所属主和所属组, 命令格式:

chown [-R] 用户名 文件名

或者所属主和所属组一起修改:

chown [-R] 用户名:组名 文件名

-R 参数是可选项, 仅适用于目录, 递归为目录里面的所有文件都修改

file.log 文件的所有者改为 tom :

[test@ubuntu: ~]$ chown tom file.log

file.log 文件的所有者改为 test, 所属组修改为 tom :

[test@ubuntu: ~]$ chown test:tom file.log

通过 chgrp 命令, 可以修改文件的所属组, 命令格式:

chgrp [-R] 用户名 文件名

-R 参数可选, 做递归修改

进程管理

进程是一个具有一定独立功能的程序,它是操作系统动态执行的基本单元。

进程管理主要有三个方面:

  1. 判断服务器是否健康
  2. 查看所有正在运行的进程
  3. 强制终止进程

查看进程

ps 命令可以查看进程

常用参数有:

  • -a 显示所有前台进程
  • -u 显示用户名
  • -x 显示所有后台进程
  • -A 显示所有进程
  • -e 显示所有进程
  • -f 显示程序间的关系

BSD 格式显示, 列出目前所有的正在内存当中的程序:

[test@ubuntu ~]$ ps -aux

各列参数说明:

列名 说明
USER 该进程属于那个使用者账号
PID 该进程的进程ID号
%CPU 该进程使用掉的 CPU 资源百分比
%MEM 该进程所占用的物理内存百分比
VSZ 该进程使用掉的虚拟内存量 (Kbytes)
RSS 该进程占用的固定的内存量 (Kbytes)
TTY 该进程是在那个终端机上面运作,若与终端机无关,则显示 ? 。 另外,tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序
STAT 该程序目前的状态。
START 该进程被触发启动的时;
TIME 该进程实际使用 CPU 运作的时间
COMMAND 该程序的实际指令

其中 STAT 的常见的状态字符有:

  • D 无法中断的休眠状态(通常 IO 的进程);
  • R 正在运行可中在队列中可过行的;
  • S 处于休眠状态;
  • T 停止或被追踪;
  • W 进入内存交换 (从内核2.6开始无效);
  • X 死掉的进程 (基本很少见);
  • Z 僵尸进程;
  • < 优先级高的进程
  • N 优先级较低的进程
  • L 有些页被锁进内存;
  • s 进程的领导者(在它之

下有子进程);

  • l 多线程,克隆线程(使用 CLONE_THREAD, 类似 NPTL pthreads);
  • + 位于后台的进程组;

ps 与 grep 常用组合用法,查找特定进程:

[test@ubuntu ~]$ ps -aux | grep ssh

以标准的格式显示, 显示所有进程信息,连同命令行:

[test@ubuntu ~]$ ps -ef

各列参数说明:

列名 说明
UID 用户ID、但输出的是用户名
PID 进程的ID
PPID 父进程ID
C 进程占用CPU的百分比
STIME 进程启动到现在的时间
TTY 该进程在那个终端上运行,若与终端无关,则显示? 若为pts/0等,则表示由网络连接主机进程。
CMD 命令的名称和参数

ps 与 grep 常用组合用法,查找特定进程:

[test@ubuntu ~]$ ps -ef | grep ssh

查看进程树:

pstree 可以查看进程树, -p 参数可以显示进程 pid:

[test@ubuntu ~]$ pstree -p

终止进程

kill 命令可以通过 pid 终止进程, 格式如下

kill [-9] pid

-9 为可选参数, 表示强制pkill 命令可以通过 进程名 终止一类进程, 格式如下:

pkill [-9] 进程名

-9 为可选参数, 表示强制

前后台进程

前台进程:

使用之后不可以操作别的命令等命令,完成之后再次操作其他命令:

[test@ubuntu ~]$ ping -c 20 www.baidu.com

ping的过程中输入其他命令,ping的命令不会停止,但等到ping结束了,你路上执行的命令就会再执行

后台进程:

不需要等待进程结束就可以使用别的命令,后台进程使用需要在命令后面加上&

[test@ubuntu ~]$ ping -c 20 www.baidu.com >> result.log &

系统实时监控 top

top 可以插查看系统运行状态, 每几秒更新一次:

[test@ubuntu ~]$ top

可以使用的按键:

  • z 可以切换颜色
  • q 退出
  • M 按内存排序(大写)
  • P 按cpu排序(大写)

更多参数,请参考:TOP命令各参数详解

系统实时监控

htop 推荐使用 htop 命令来查看系统运行状态:

[test@ubuntu ~]$ htop

可以进行的操作:

  • 鼠标点击表头, 可以按照指定字段排序
  • 鼠标选中某个进程, 输入 i, 可以查看进程使用的文件
  • q 键可以退出
  • F5 使进程信息在扁平化列表和层次结构之间切换显示
  • F4 搜索指定的进程
  • F2 可以进行个性化设置
  • F9 可以杀死选中的进程

扩展:

一般你进入到一个命令里面, 想要退出的话, 可以看看终端中提示的退出键是什么, 如果没有的话,可以依次尝试:

  • q
  • Esc
  • exit
  • Ctrl + c

什么是服务

linux系统中有些程序在启动之后持续在后台运行,等待用户或其他应用程序调用,此类程序就是服务(service)

大多数服务都是通过守护进程(daemon)实现的。守护进程一旦开启,就在后台运行并时刻监视着系统前台。

运行级别

运行级别是操作系统当前正在运行的功能级别,用来设置不同环境下所运行的程序和服务。

sysVinit 使用运行级别和对应的链接文件启动和关闭系统服务。

默认的 RunLevel(在 /etc/inittab 文件设置)现在被默认的 Target 取代,位置是/etc/systemd/system/default.target ,通常符号链接到 graphical.target(图形界面)或者 multi-user.target(多用户命令行)。

看一下 sysVinitsystemd 的对比:

System V init 运行级别  systemd 目标名称    作用 
0   runlevel0.target, poweroff.target   关机
1   runlevel1.target, rescue.target 单用户模式
2   runlevel2.target, multi-user.target 等同于级别 3
3   runlevel3.target, multi-user.target 多用户的文本界面
4   runlevel4.target, multi-user.target 等同于级别 3
5   runlevel5.target, graphical.target  多用户的图形界面
6   runlevel6.target, reboot.target 重启 emergency    emergency.target    紧急 Shell

运行级别有 0-6

emergency 八个运行级别, 使用 runlevel 命令可以查看当前系统的运行级别:

[test@ubuntu: ~]$ runlevel

在 Ubuntu 中, 2-5并没有任何区别

ubuntu 没有 /etc/inittab, 但是可以在 /etc/default/grub 修改运行级别

服务管理

service

命令

service 命令可以管理服务通过 man service 查看解释为:service 运行一个位于 /etc/init.d/ 目录下的脚本

SCRIPT,或者是位于 /etc/systemdservice 单元(unit)

下面看看/etc/init.d/ 目录下有哪些脚本:

可以看到, 我们用于远程登录的 ssh 服务也在这个里面,

绿色的说明这些都

是可执行文件, 所以我们也可以直接执行这些可执行文件来管理我们的服务, 比如重启 ssh 服务:

[test@ubuntu: ~]$ sudo /etc/init.d/ssh restart

常用的命令有:

  • status 查看服务状态
  • stop 停止服务
  • start 启动服务
  • restart 重启服务

也可以通过 service 命令, 可以管理这些服务 比如, 查看服务的状态:

[test@ubuntu: ~]$ service ssh status

停止服务:

[test@ubuntu: ~]$ sudo service ssh stop

启动服务:

[test@ubuntu: ~]$ sudo service ssh start

重启服务:

[test@ubuntu: ~]$ sudo service ssh restart

查看所有服务:

[test@ubuntu: ~]$ service --status-all

+ 号表示服务已启动, - 号表示服务未启动

Systemd

Systemd 是一系列工具的集合,其作用也远远不仅是启动操作系统,它还接管了后台服务、结束、状态查询,以及日志归档、设备管理、电源管理、定时任务等许多职责,并支持通过特定事件(如插入特定 USB 设备)和特定端口数据触发的 On-demand(按需)任务。

Systemd 可以管理所有系统资源,不同的资源统称为 Unit(单元)。

单元的目录位于 /etc/systemd/system, 其中主要的文件类型有四种:

.mount

.mount文件定义了一个挂载点,[Mount] 节点里配置了 What, Where, Type三个数据项

.service

.service 文件定义了一个服务,分为[Unit]

[Service][Install]三个小节

  • [Unit] Unit单元描述, 执行条件等
  • [Service] 变量所在文件, 执行启动脚本等
  • [Install] 服务别名等

.target

.target 定义了一些基础的组件,供.service文件调用

.wants

.wants文件定义了要执行的文件集合,每次执行,.wants文件夹里面的文件都会执行

Unit 文件按照 Systemd 约定,应该被放置指定的三个系统目录之一中。这三个目录是有优先级的,如下所示,越靠上的优先级越高。因此,在三个目录中有同名文件的时候,只有优先级最高的目录里的那个文件会被使用:

  • /etc/systemd/system:系统或用户自定义的配置文件
  • /run/systemd/system:软件运行时

生成的配置文件

  • /usr/lib/systemd/system:系统或第三方软件安装时添加的配置文件。

Ubuntu 系统中 /libusr/lib 的软连接,所以等同于 /usr/lib/systemd/system

查看一下 /usr/lib/systemd/system 里面都有什么:

[test@ubuntu: ~]$ ls /usr/lib/systemd/system

可以看到,我们安装的第三方服务, 都在这个目录里面, 包括我们之前使用的 ssh

systemctl 命令管理 systemd 的资源 Unit, 它兼容了 service 命令, 所以我们也可以使用这个命令来管理我们的服务:

查看所有服务状态:

[test@ubuntu: ~]$ sudo systemctl list -units --type=service

启动服务:

[test@ubuntu: ~]$ sudo systemctl start ssh.service

停止服务:

[test@ubuntu: ~]$ sudo systemctl stop ssh.service

重启服务:

[test@ubuntu: ~]$ sudo systemctl restart ssh.service

重新加载服务配置文件:

[test@ubuntu: ~]$ sudo systemctl reload ssh.service 

查询服务运行状态:

[test@ubuntu: ~]$ sudo systemctl status ssh.service

开启自启动

查询服务是否开机启动:

[test@ubuntu: ~]$ sudo systemctl is-enabled ssh.service 

开机运行服务:

[test@ubuntu: ~]$ sudo systemctl enable ssh.service

取消开机运行:

[test@ubuntu: ~]$ sudo systemctl disable ssh.service

自定义一个服务

我们尝试来自定义一个服务, 编写服务脚本文件:

[test@ubuntu: ~]$ sudo vim /etc/init.d/hello

写入内容:

#!/bin/bashecho "hello"

添加到启动脚本中去:

[test@ubuntu: ~]$ sudo update-rc.d -f hello defaults

-f 强制, 即时执行服务:

[test@ubuntu: ~]$ sudo service hello

移除服务:

[test@ubuntu: ~]$ sudo update-rc.d hello remove

删除服务脚本:

[test@ubuntu: ~]$ sudo rm /etc/init.d/hello

安装文件 ftp 服务

vsftpd 服务器(very secure FTP daemon)是ftp服务器的一种,安全性比其他的FTP服务器要高一些

安装 vsftpd 服务器:

[test@ubuntu: ~]$ sudo apt-get install vsftpd

查看 /etc/init.d, 可以看到多了一个 vsftpd 服务:

[test@ubuntu: ~]$ ls /etc/init.d/

浏览器输入服务器的地址 ftp:192.168.10.12 (你自己服务的ip), 用服务器的用户名和密码, 登录之后就可以使用 ftp 服务了:

当然这样直接使用, 不是很安全, 我们可以创建不同的用户, 并且对文件服务器的目录进行设置:

编辑 vsftpd.conf 配置文件:

[test@ubuntu: ~]$ sudo vim /etc/vsftpd.conf

在最后一行添加:

local_root=/home/test/study

这个目录写你服务器上存在的目录

重启 vsftpd 服务:

[test@ubuntu: ~]$ sudo service vsftpd restart

之后浏览器中再次访问, 进入的目录就改变了

常用网络管理命令

ifconfig

查询本机网络信息, 如果不能使用这个命令, 要安装一下 net-tools :

[test@ubuntu: ~]$ sudo apt install -y net-tools

直接使用

ifconfig 命令查看网卡状态:

[test@ubuntu: ~]$ ifconfig

里面对我们来说有用的就是一个 IP,一个子网掩码,因为我们需要用 ip 来访问服务器

这个命令还可以临时设置ip, 格式是:

ifconfig 网卡名 ip

临时设置ip:

[test@ubuntu: ~]$ ifconfig enp0s8 192.168.10.22

临时设置ip, 重启后无效

route

route 命令可以查看网关, -n 参数不执行DNS反向查找,直接显示数字形式的IP地址:

[test@ubuntu: ~]$ route -n

ip

ip 是个命令, ip 命令的功能很多!基本上它整合了 ifconfig 与 route 这两个命令,不过 ip 的功能更强大。

比如查看ip参数:

[test@ubuntu: ~]$ ip addr

比如查看路由网关:

[test@ubuntu: ~]$ ip route

ping

ping 命令可以探测网络是否通顺,-c 参数指定探测次数, 不写次数无限测试, 可以用 ctrl + c 终止,格式是:

ping -c 次数 ip(也可以是域名) 

如探测是否可以请求到百度:

[test@ubuntu: ~]$ ping -c 10 www.baidu.com

如果探测不通, 再换一个目标试试, 如果还是不通, 那可能是你的网络配置有问题

netstat

netstat 查看网络状态命令, 是用的比较频繁的一个命令, 在说这个命令之前, 我们先搞清楚几个概念

ip

门牌号, 每个设备都有一个唯一的ip(广域网中唯一,局域网中唯一), 通过ip, 可以定位到具体的一个设备, 比如某一台电脑(服务器)

端口号

在一个电脑(服务器)上, 运行着很多服务和应用程序, 比如 ssh 服务, ftp 服务, http 服务等等, 每个服务都会监听唯一的一个端口号

通过 ip 可以定位具体的电脑(服务器),通过端口号,就可以指定要访问这台电脑(服务器)上的哪个服务

通过 ip + 端口号, 就能具体访问到一个电脑(服务器)上的一个具体的服务了

端口号的范围是 0—65535, 一些常用的服务有默认的端口号,比如:

  • ssh 服务默认端口是 22
  • http 服务默认端口是 80 (https是443)
  • mysql 服务默认端口是 3306

tcp

经过三次握手之后建立连接, 进行通讯

优点: 安全可靠

缺点: 慢

很像打电话,你在吗?我在啊, 我准备给你发信息,好发吧!

udp

不经过三次握手, 直接通讯

优点: 快

缺点: 不可靠

很暴躁,像发短信,直接扔数据给对方, 不管你收到收不到

搞清楚这几个概念

之后, 再来看看 netstat 命令

常用参数有:

  • -t 查看tcp端口
  • -u 查看udp端口
  • -l 以ip和端口号显示,不用域名和服务名显示
  • -a 查询所有连查询本机开启的所有端口:
[test@ubuntu: ~]$ netstat -tuln

比如查看22端口是否被占用:

[test@ubuntu: ~]$ netstat -tuln | grep 22

查询所有网络连接,包括监听的,包括已经连接的:

[test@ubuntu: ~]$ netstat  -an

假如有几百个人都在连接,我不能一个一个数吧?

这时候可以使用 wc 统计命令, 比如查看所有连接中的:

[test@ubuntu: ~]$ netstat -an | grep ESTABLISHED

配合 wc 统计命令统计行数, 一行就是一个连接:

[test@ubuntu: ~]$ netstat -an | grep ESTABLISHED | wc -l

-l 只统计行数

本机网络管理

Ubuntu 18.04 之前, 管理网络的服务是 network, 网卡的配置文件是 /etc/network/interfaces, 从 Ubuntu 18.04 以后, 包括 Ubuntu 18.04, 启用了新的网络管理 NetworkManager, 提供了netplan命令, 其配置文件是在/etc/netplan/00-installer-config.yaml

00-installer-config.yaml 每个机器的文件名不一定相同, 具体视情况而定

如果想修改网卡的配置, 可以编辑这个文件; 如果新增加了网卡, 也可以在这个这个文件进行配置

在讲系统的安装的时候, 有详细的说过, 可以回去看看

编辑 /etc/netplan/00-installer-config.yaml:

[test@ubuntu: ~]$ sudo vim /etc/netplan/00-installer-config.yaml

配置文件各参数说明:

  • renderer: 指定网络方案,可为networkNetworkManager
  • enp0s3:网络接口名称, 可以通过 ip addr 或者 ifconfig 查看
  • dhcp4和dhcp6:接受IPv4和IPv6接口的dhcp属性,yes或no, 是否自动分配 ip
  • addresses:接口的静态地址序列。
  • gateway4: 默认网关的IPv4地址。
  • Nameservers: Nameservers的IP地址序列。

注意: 在修改这个配置文件的时候, 一定要注意大小写和格式

各参数配置如图:

除非你有需要, 不然不要按照这个改, 这只是展示完整的配置给大家看, 不然网关配置不对, 不能访问公网ip了

修改完这个配置之后, 使用 natplan 命令让配置生效:

[test@ubuntu: ~]$ sudo sudo netplan apply

--debug 参数可以显示应用配置详情, 有问题可以直接看到:

[test@ubuntu: ~]$ sudo netplan --debug apply

防火墙

安装

Ubuntu20.04 一般都默认安装了UFW(UncomplicatedFirewall),它是一款轻量化的工具,主要用于对输入输出的流量进行监控。如果没有安装,请用下面的命令安装:

[test@ubuntu: ~]$ sudo apt install ufw

查看状态

正常情况安装以后应该是默认禁止状态的,可以使用命令查看状态:

[test@ubuntu: ~]$ sudo ufw status

显示 Status: inactive, 不活动的, 说明未开启

开启/关闭

开启防火墙, 重启的时候也会自动启动:

[test@ubuntu: ~]$ sudo ufw enable

设置防火墙规则, 使用默认 allow 模式, 也即是只有运行的服务或者端口才能对外开放:

[test@ubuntu: ~]$ sudo ufw default deny

关闭防火墙命令:

[test@ubuntu: ~]$ sudo ufw disable

开放服务/端口

如果你需要开放某些服务,再使用sudo ufw allow 命令开启,举例如下:

sudo ufw allow service | port

例如开启 ssh 服务:

[test@ubuntu: ~]$ sudo ufw allow ssh

开放 3306 端口:

[test@ubuntu: ~]$ sudo ufw allow 3306

允许指定ip访问所有端口:

[test@ubuntu: ~]$ sudo ufw allow from 192.168.10.1

允许指定的IP段通过tcp协议访问特定端口:

[test@ubuntu: ~]$ sudo ufw allow proto tcp from 192.168.10.0/24 to any port 22

禁用服务/端口

把上面的 开放服务/端口 例子中的 allow 换成 deny 即可:

比如禁用 8080 端口:

[test@ubuntu: ~]$ sudo ufw deny 8080

关闭服务/端口

有两种方法可以删除 UFW 规则:

  • 按规则说明(添加规则时候的内容)
  • 按规则编号

按规则说明, 就是我们添加规则时候的输入的内容

比如删除 ssh 的允许规则:

[test@ubuntu: ~]$ sudo ufw delete allow ssh

比如删除 8080 的禁用规则:

[test@ubuntu: ~]$ sudo ufw delete deny 8080

但是有时候, 规则说明特别长的时候, 不是特别容易记住, 这时候可以通过查看, 得到规则编号, 然后删除指定编号的的规则

查看规则编号:

[test@ubuntu: ~]$ sudo ufw status numbered 

删除指定编号的规则:

[test@ubuntu: ~]$ sudo ufw delete 2

最后, 记得关闭防火墙, 因为我们现在处于学习阶段, 使用的虚拟机, 暂时不用开启防火墙

删除所有规则, 并关闭防火墙:

[test@ubuntu: ~]$ sudo ufw reset
扒皮猴社区版权所有,转载请标注出处!
扒皮猴 » Linux中的权限、进程、服务、网络的管理与防火墙

发表评论