Linux初级工程师应知应会
权限管理
1. Linux用户及权限
1. Linux用户和组
Linux中的用户
Linux是一个多用户系统,Linux允许使用者在Linux系统上通过规划不同类型、不同层级的用户,并公平的分配系统资源与工作环境。不仅如此,和Windows不同的是,Linux允许不同的用户同时登录主机,同时使用主机的资源,因此Linux被称为多用户系统。
Linux以“用户与用户组”的概念,建立用户与文件权限之间的联系,保证系统能够充分考虑每个用户的隐私保护,很大程度上保障了Linux作为多用户系统的可行性。
root用户
root用户在Linux计算机中拥有全部权限。
在Linux中执行涉及到系统的命令一般都需要root权限,尤其是影响系统文件的命令。
由于root权限如此强大,所以建议只有必要时才使用,而不是直接以root用户身份进行登录,这样可以避免重要系统文件意外受损。
使用root用户创建新的用户,并授予必要的权限,在日常工作中使用对应的普通用户进行工作。
系统用户
除了日常操作的用户以外,还会有一些其他用户,这些用户默认无法登陆系统。
这些用户的存在主要是为了满足系统进程对文件属主的需求。
用户组
在linux中可以创建用户组来管理用户。
根据功能分类,可以分为:管理员组和普通用户组。
按类别分类,可以分为:基本组和附加组,一个用户只能有一个基本组,但可以有多个附加组。
按组本身的类别分类:公共组和私有组。私有组只有一个用户,且组名和用户名一致;公共组会有多个用户。
2. Linux权限构成
Linux的权限组成
Linux下权限可以分为三类:User权限(u),Group权限(g),Other权限(o)
- User权限表示文件所有者;
- Group权限表示文件所有者所在的组
- Other表示所有其他用户
Linux的权限分类
Linux将权限分为Read(读),Write(写),Execute(执行)三个不同的基本类别
- Read读权限表示:
针对目录,有读权限就代表能对此目录有列表功能,就是可以执行ls命令进行查看,另外还有cp的功能。
针对文件,有读权限就代表能对此文件有阅读功能,可以通过cat等命令查看文件内容。
- Write写权限表示:
针对目录,有写权限就代表着在此目录下创建文件和目录,可以通过touch,mkdir等命令创建文件和目录,另外还可以删除此目录下的文件。
针对文件,有写权限就代表着对此文件可以写入新的内容和修改文件内容。
- Execute执行权限表示:
针对目录,有执行权限就代表能进入此目录,利用cd等命令进入此目录。
针对文件,有执行权限就代表可以执行此文件。
3. Linux文件与文件夹权限
1. 文件与文件夹权限
在Linux中,可以使用umask查看当前用户的默认权限,创建文件/目录时会遵循该权限。
文件夹权限和文件权限的不同,会导致在使用命令操作文件时,有所不同。
文件权限
对于文件而言,
-r表示文件的内容可以被读取
-w表示这个文件的内容可以被修改(w只授予文件修改的权限,如果需要删除/重命名,则需要有目录的w权限)
-x表示文件可以被执行,一般情况下,.sh文件需要有这个权限
文件夹权限
对于文件夹而言,
-r表示可以查看此文件夹下的文件名列表
-w表示可以对此文件夹下的文件进行删除/重命名/移动
-x表示可以将此文件夹作为working dir,或者说表示可以cd到这个文件夹中
文件及文件夹权限实例
2. 修改文件权限
chmod命令可以修改文件权限
3. 文件的属组和属主
chown命令可以修改文件的属主
chgrp命令可以修改文件的属组
4. 特殊权限
SUID
SUID是Set UID的简称,它会出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限。
- 用个例子来了解SUID
- SUID的使用需要满足以下四点
- SUID只对二进制文件有效
- 调用者对该文件有执行权
- 在执行过程中,调用者会暂时获得该文件的所有者权限
- 该权限只在程序执行的过程中有效
SGID
SGID是Set GID的简称,它出现在文件所属组权限的执行位上面,它対普通二进制文件和目录都有效;
SGID作用于文件上时,在执行该文件时,用户将获得该属组的权限;
SGID作用于目录上时,在该目录下创建的文件,都将属于这个目录所属的组。
SBIT
SBIT即Sticky Bit,它出现在其他用户权限的执行位上,它只能用来修饰一个目录。
当某一个目录拥有SBIT权限时,则任何一个能够在这个目录下建立文件的用户,该用户在这个目录下所建立的文件,只有该用户自己和root可以删除,其他用户均不可以。
如何设置SUID,SGID,SBIT
- 数字方式
SUID,SGID,SBIT有自己对应的权限数字
SUID - 4
SGID - 2
SBIT - 1
设定权限只需要将对应的权限数字相加即可
在设置权限时,需要将特殊权限数字放在最前面,如果原文件权限为755,需要添加SUID权限,就执行 chmod 4755 filename
- 命令方式
chmod u+s testfile # 为testfile文件加上SUID权限
chmod g+s testdir # 为testdir目录加上SGID权限
chmod o+t testdir # 为testdir目录加上SBIT权限
服务管理
1. Linux下的init进程
1. init进程
对于Linux系统的运行来说,init程序是最基本的程序之一。
一个好的Linux发行版本通常随带有一个init的配置,这个配置适合于绝大多数系统的工作,在这样一些系统上不需要对init做任何事。
通常,只有你在碰到诸如串行终端挂住了、拨入(不是拨出)调制解调器,或者你希望改变缺省的运行级别时才需要关心init。
init进程是所有Linux进程的父进程,它的进程号是1。
2. init进程的实现
- OpenRC:OpenRC是一个基于依赖的init系统,它用C语言和遵循POSIX的shell写成,这使得它在BSD和Linux系统上可以使用。
- Systemd: Systemd是一套中央化系统及设置管理程序(init),其包括有守护进程、程序库以及应用程序。
- Upstart: Upstart是一个基于事件的init程序,用于替代传统的init(多种类Unix计算机操作系统启动时用于执行任务的程序)。
- Sysvinit: Sysvint就是system V风格的init系统,顾名思义,它源于System V系列Unix。它提供了比BSD风格init系统更高的灵活性。是已经风行了几十年的Unix int系统,一直被各类Linux发行版所采用。
2. Systemd
systemd服务是一种以.service结尾的单元(unit)配置文件,用于控制由systemd控制或监控的进程。简单说,用于后台以守护精灵(daemon)的形式运行程序。
systemd广泛应用于新版本的RHEL、SUSE Linux Enterprise、CentOS、Fedora和openSUSE中,用于替代旧有的服务管理器service。
1. Systemd的常用命令
systemctl command xxx.service # 其中command可以是start、stop、restart、disable、enable等,比如:
systemctl start httpd.service # 启动Apache服务
systemctl enable mariadb.service # 将MariaDB服务设为开机启动
2. 查看系统已有的Systemd配置文件
Systemd的配置文件都放置在/etc/systemd/system/ 目录下
- Systemd配置文件
[Unit] # 这个项目与此unit的解释、执行服务相依性有关
Description=OpenBSD Secure Shell server
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target audit.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755
[Install] # 这个项目说明此unit要挂载哪个target下面
WantedBy=multi-user.target
Alias=sshd.service
Systemd的Unit
在Systemd中,所有引导过程中systemd要控制的东西都是一个单元。基本的用法如下
- Description:代表整个单元的描述,可根据需要任意填写。
- Wants:本单元启动了,它“想要”的单元也会被启动。但是这个单元若启动不成功,对本单元没有影响。
- Requires:这个单元启动了,那么它“需要”的单元也会被启动;它“需要”的单元被停止了,它自己也活不了。但是请注意,这个设定并不能控制启动顺序,因为它“需要”的单元启动也需要时间,若它“需要”的单元启动还未完成,就开始启动本单元,则本单元也无法启动,所以不建议使用这个字段。
- OnFailure:若本单元启动失败了,那么这个单元作为折衷。
- Befor/After:指定启动顺序。
Systemd的Service
在定义完了Systemd用来识别服务的单元后,我们来定义服务本体。基本的用法如下:
- Type:服务的类型,各种类型的区别如下所示
- simple:默认,这是最简单的服务类型。意思就是说启动的程序就是主体程序,这个程序要是退出那么一切皆休。
- forking:标准Unix Daemon使用的启动方式。启动程序后会调用fork()函数,把必要的通信频道都设置好之后父进程退出,留下守护精灵的子进程。
- oneshot:适用于那些被一次性执行的任务或者命令,它运行完成后便了无痕迹。因为这类服务运行完就没有任何痕迹,我们经常会需要使用RemainAfterExit=yes。意思是说,即使没有进程存在,Systemd也认为该服务启动成功了。同时只有这种类型支持多条命令,命令之间用;分割,如需换行可以用\。
- dbus:这个程序启动时需要获取一块DBus空间,所以需要和BusName= 一起用。只有它成功获得了DBus空间,依赖它的程序才会被启动。
- ExecStart:在输入的命令是start时候执行的命令,这里的命令启动的程序必须使用绝对路径,比如你必须用/sbin/arp而不能简单的以环境变量直接使用arp。
- ExecStop:在输入的命令是stop时候执行的命令,要求同上。
- ExecReload:这个不是必需,如果不写则你的Service就不支持restart命令。ExecStart和ExecStop是必须有的。
Systemd的Install
服务编写完之后还需要被systemd装载,定义安装单元各个字段如下:
- WantedBy:设置服务被谁装载,一般设置为multi-user.target
- Alias:为service设置一个别名,可以使用多个名字来操作服务
- Also:在安装这个服务时候还需要其他的服务
编写一个简单的systemd配置文件
[root@m1 ~]# cd /etc/systemd/system
[root@m1 system]# vim alibaba.service
[Unit]
Description=Write Something
Wants=network-online.target
After=network.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=touch /tmp/alibaba
ExecStop=rm -f /tmp/alibaba
[Install]
WantedBy=multi-user.target
[root@m1 system]# systemctl start alibaba.service
[root@m1 system]# systemctl status alibaba.service #此时/tmp目录下alibaba文件生成
● alibaba.service - Write Something
Loaded: loaded (/etc/systemd/system/alibaba.service; disabled; vendor preset: disabled)
Active: active (exited) since Fri 2021-07-02 15:48:47 CST; 1min 6s ago
Process: 24765 ExecStart=/usr/bin/touch /tmp/alibaba (code=exited, status=0/SUCCESS)
Main PID: 24765 (code=exited, status=0/SUCCESS)
Jul 02 15:48:47 m1 systemd[1]: Starting Write Something...
Jul 02 15:48:47 m1 systemd[1]: Started Write Something.
[root@m1 system]# systemctl stop alibaba.service #此时/tmp目录下alibaba文件被删除
3. CronTab定时任务
crontab是用来定期执行程序的命令。
当安装完成操作系统之后,默认便会启动此任务调度命令。
crond命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。
1. crontab常用命令介绍
- crontab -l 列出目前的日程表
- crontab -e 编辑当前日程表
- crontab -r 删除当前日程表
- crontab -u xx -l 列出xx用户的日程表
2. crontab语法介绍
[root@m1 ~]# crontab -l
no crontab for root
[root@m1 ~]# crontab -e
* * * * * echo "123/r/n" >> /tmp/crontabtest
[root@m1 ~]# crontab -l
* * * * * echo "123/r/n" >> /tmp/crontabtest
[root@m1 ~]# systemctl restart crond.service
[root@m1 ~]# cd /tmp/
[root@m1 tmp]# ls
crontabtest systemd-private-e656c944ad394e25b2303a9d994376a5-chronyd.service-vQyECi vmware-root_869-3988752892
[root@m1 tmp]# more crontabtest
123/r/n
123/r/n
123/r/n
123/r/n
[root@m1 tmp]# crontab -r
[root@m1 tmp]# crontab -l
no crontab for root
3. crontab的常用工具
crontab.guru
4. crontab的注意事项
新创建的cron任务,不会马上执行,至少要过2分钟后才可以,当然你可以重启cron来马上执行。
crontab中的命令需要写成绝对路径。
4. Supervisor
Supervisor是用python开发的一套通用的进程管理程序,能将一个普通的命令行进程变成后台daemon,并监控进程状态,异常退出时能自动重启。
Supervisor可以很方便的管理批量进程,不仅支持启动、重启、关闭、重载,还支持监控进程,进程意外僵死后可自动拉起。
1. Supervisor的安装
yum install -y epel-release
yum install -y supervisor
echo_supervisord_conf > /etc/supervisord.conf
supervisord -c /etc/supervisord.conf
2. Supervisor配置管理
Supervisor的主进程配置文件放置在/etc/supervisord.conf
用户定义的项目进程配置文件放置在/etc/supervisord.d/conf.d目录下
[program:echo hi]
command=