跟随狂神学Java-42,Linux

跟随狂神学Java

作者:joker2yue
链接:https://github.com/Joker2Yue/Joker2Yue-Blog
来源:Github
著作权归原作者所有。商业转载请联系原作者获得授权,非商业转载请注明出处。
第四十二:Linux

“知识的最大敌人不是无知,而是对知识的错觉。”

【狂神说Java】服务器购买及宝塔部署环境说明_哔哩哔哩_bilibili

【狂神说Java】Linux最通俗易懂的教程阿里云真实环境学习_哔哩哔哩_bilibili

蚂蚁课堂

阿里云服务器详解(配置选择/使用入门) – 阿里云百科 (aliyunbaike.com)

Linux 教程 | 菜鸟教程 (runoob.com)

入门概述


为什么要学习Linux

​ linux诞生了这么多年,以前还喊着如何能取代windows系统,现在这个口号已经小多了,任何事物发展都有其局限性都有其天花板。就如同在国内再搞一个社交软件取代腾讯一样,想想而已基本不可能,因为用户已经习惯于使用微信交流,不是说技术上实现不了解而是老百姓已经习惯了,想让他们不用,即使他们自己不用亲戚朋友还是要用,没有办法的事情。

​ 用习惯了windows操作系统,再让大家切换到别的操作系统基本上是不可能的事情,改变一个人已经养成的习惯太难。没有办法深入到普通老百姓的生活中,并不意味着linux就没有用武之地了。在服务器端,在开发领域linux倒是越来越受欢迎,很多程序员都觉得不懂点linux都觉得不好意思,linux在开源社区的地位依然岿然不动。

​ 尤其是作为一个后端程序员,是必须要掌握Linux的,因为这都成为了你找工作的基础门槛了,所以不得不学习!

​ 我们之前已经讲了JavaSE, MySQL 、前端( HTM L 、 CSS 、 JS )、 JavaWeb 、 SSM 框架、 SpringBoot 、Vue 、 SpringCloud 、MybatisPlus、Git等技术

​ 后面要学习消息队列(Kafuka、RabbitMQ、RockeetMQ)、缓存(Redis)、搜索引擎(ES),集群分布式,就会使用到Linux相关知识


说明

​ 基于CentOS 7 学习


Linux简介

​ Linux 内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。

​ Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX(可移植操作系统接口) 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。

​ Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。


Linux发行版

​ Linux 的发行版说简单点就是将 Linux 内核与应用软件做一个打包。

img

​ 目前市面上较知名的发行版有:Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS 等。

img


Linux应用领域

​ 今天各种场合都有使用各种 Linux 发行版,从嵌入式设备到超级计算机,并且在服务器领域确定了地位,通常服务器使用 LAMP(Linux + Apache + MySQL + PHP)或 LNMP(Linux + Nginx+ MySQL + PHP)组合。

​ 目前 Linux 不仅在家庭与企业中使用,并且在政府中也很受欢迎。

  • 巴西联邦政府由于支持 Linux 而世界闻名。
  • 有新闻报道俄罗斯军队自己制造的 Linux 发布版的,做为 G.H.ost 项目已经取得成果。
  • 印度的 Kerala 联邦计划在向全联邦的高中推广使用 Linux。
  • 中华人民共和国为取得技术独立,在龙芯处理器中排他性地使用 Linux。
  • 在西班牙的一些地区开发了自己的 Linux 发布版,并且在政府与教育领域广泛使用,如 Extremadura 地区的 gnuLinEx 和 Andalusia 地区的 Guadalinex。
  • 葡萄牙同样使用自己的 Linux 发布版 Caixa Mágica,用于 Magalh?es 笔记本电脑和 e-escola 政府软件。
  • 法国和德国同样开始逐步采用 Linux。

Linux vs Windows

img

购买服务器


为什么需要一个自己的服务器
  1. 你需要发布自己的网站和项目
  2. 练习Linux
  3. 自己的远程仓库、远程数据库、远程Tomcat

如何购买
  1. 尽早趁打折
  2. 学生机:
    • 如果是学生或者24以下,可以购买学生机,100多一年
  3. 香港服务器可以避免备案,但是尽量不要自己挂VPN,会被封

部署服务器


获得一个服务器
  • 搜索阿里云服务器,试用或购买一个云服务器

修改密码
  • 在购买阿里云ECS云服务器时,如果购买时没有设置密码,那么云服务器创建后是没有密码的,阿里云服务器没有初始密码,用户可以通过在控制台“重置密码”的方式来获取密码。 阿里云ECS云服务器购买后,等待阿里云系统创建ECS实例,创建成功后阿里云系统会为用户绑定的手机号发送创建成功短信,短信包含了云服务器的登录名。

  • 教程如何设置或重置服务器密码_轻量应用服务器-阿里云帮助中心 (aliyun.com)


修改实例名称

安装宝塔

走近Linux系统


开机登录

开机会启动许多程序。它们在Windows叫做”服务”(service),在Linux就叫做”守护进程”(daemon)。

开机成功后,它会显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个登录界面中会提示用户输入用户名,而用户输入的用户将作为参数传给login程序来验证用户的身份,密码是不显示的,输完回车即可!

一般来说,用户的登录方式有三种:

  • 命令行登录
  • ssh登录
  • 图形界面登录

最高权限账户为 root,可以操作一切!


关机

在linux领域内大多用在服务器上,很少遇到关机的操作。毕竟服务器上跑一个服务是永无止境的,除非特殊情况下,不得已才会关机。

关机指令为:shutdown ;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sync # 将数据由内存同步到硬盘中。

shutdown # 关机指令,你可以man shutdown 来看一下帮助文档。例如你可以运行如下命令关机:

shutdown –h 10 # 这个命令告诉大家,计算机将在10分钟后关机

shutdown –h now # 立马关机

shutdown –h 20:25 # 系统会在今天20:25关机

shutdown –h +10 # 十分钟后关机

shutdown –r now # 系统立马重启

shutdown –r +10 # 系统十分钟后重启

reboot # 就是重启,等同于 shutdown –r now

halt # 关闭系统,等同于shutdown –h now 和 poweroff

最后总结一下,不管是重启系统还是关闭系统,首先要运行 sync 命令,把内存中的数据写到磁盘中。


系统目录结构

登录系统后,在当前命令窗口下输入命令:

1
ls /

你会看到如下图所示:

image-20230824212004818

树状目录结构:(Linux的一切资源都挂载在这个 / 根节点下)

img

目录的解释

目录 说明
/bin bin是Binary的缩写, 这个目录存放着最经常使用的命令。
/boot 这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。
/dev dev是Device(设备)的缩写, 存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。
/etc 这个目录用来存放所有的系统管理所需要的配置文件和子目录。
/home 用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。
/lib 这个目录里存放着系统最基本的动态连接共享库,其作用类似于Windows里的DLL文件。
/lost+found 这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。
/media linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。
/mnt 系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。
/opt 这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。
/proc 这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
/root 该目录为系统管理员,也称作超级权限者的用户主目录。
/sbin s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。
/srv 该目录存放一些服务启动之后需要提取的数据。
/sys 这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。
/tmp 这个目录是用来存放一些临时文件的。
/usr 这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。
/usr/bin 系统用户使用的应用程序。
/usr/sbin 超级用户使用的比较高级的管理程序和系统守护程序。
/usr/src 内核源代码默认的放置目录。
/var 这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。
/run 是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。

常用的命令


绝对路径与相对路径

​ 在Linux系统中,目录结构呈现出一个树状组织,最高级别的目录是根目录 /。其他目录可以通过挂载的方式添加到这棵树中,同样,通过解除挂载可以将其移除。

​ 在我们探索这个教程之前,让我们先理解一下绝对路径和相对路径的概念。

  • 绝对路径:

    • 绝对路径是从根目录 / 开始书写的路径。比如说,/usr/share/doc 就是一个绝对路径。
  • 相对路径:

    • 相对路径则不以 / 开头。例如,如果要从 /usr/share/doc 到达 /usr/share/man 目录,你可以写成 cd ../man,这就是相对路径的写法。

​ 这两种路径表示方式在定位文件和目录时非常有用,绝对路径从根目录开始,而相对路径则基于当前所在的位置。


处理目录的常用命令

接下来,我们将介绍几个常见的用于处理目录的命令,这些命令在Linux系统中非常常用:

  • ls: 这个命令用于列出目录中的文件和子目录。通过运行 ls 命令,你可以查看当前目录下的所有内容。

  • cd: 使用 cd 命令可以切换当前工作目录。通过提供目标目录作为参数,你可以进入到该目录中。

  • pwd: pwd 命令会显示出当前所在的工作目录的路径。这对于确认你当前在哪个目录下非常有用。

  • mkdir: 当你需要创建一个新的目录时,可以使用 mkdir 命令。提供目录名作为参数,新目录就会被创建。

  • rmdir: 如果你需要删除一个空的目录,可以使用 rmdir 命令。注意,该命令只能删除空目录,无法删除非空目录。

  • cp: cp 命令用于复制文件或目录。你可以将文件从一个位置复制到另一个位置,也可以复制整个目录及其内容。

  • rm: 通过 rm 命令,你可以移除文件或目录。请注意,删除的文件和目录无法恢复,请谨慎操作。

  • mv: mv 命令用于移动文件和目录,也可以用来更改文件和目录的名称。你可以将文件从一个位置移动到另一个位置,或者将文件更名。

需要查看每个命令的详细使用说明?你可以使用 man [命令],比如 man ls,来查看每个命令的手册页面,获取更多使用信息。


ls (列出目录)

在Linux系统中,ls 命令可能是最常被运行的命令之一,它用于列出目录中的内容。这里我们将详细解释 ls 命令的使用语法和常见选项:

语法:

1
[root@www ~]# ls [-aAdfFhilnrRSt] 目录名称

常见选项与参数:

  • -a:显示所有文件,包括隐藏文件(以 . 开头的文件)。
  • -l:使用长格式列出文件详细信息,包括权限、所有者、大小等。
  • -d:仅显示目录本身,而不是显示目录中的内容。
  • -h:以人类可读的方式显示文件大小,如使用 KB、MB 等单位。
  • -i:显示文件的 inode 号码。
  • -R:递归地显示子目录中的内容。
  • -t:按照修改时间排序显示文件。
  • -S:按照文件大小排序显示文件。
  • -r:反转排序的顺序,可与 -t-S 配合使用。
  • -F:在每个文件名后面添加一个字符,表示文件类型(如 / 表示目录,* 表示可执行文件)。
  • --color:启用彩色显示,以区分文件类型。
  • -G:类似于 --color,但仅在支持颜色的终端上工作。
  • -1:每个文件占一行显示,适用于在脚本中处理文件列表。

以下是一个示例,将会列出指定目录下的所有文件,包括属性和隐藏文件:

1
[root@Joker-CentOS7 ~]# ls -al ~

通过运行上述命令,你可以获取目录中所有文件的详细信息,包括文件属性、权限等。这个命令在日常使用中非常常见,用于查看和管理文件。


cd (切换目录)

cd 是 “Change Directory” 的缩写,用于切换工作目录。通过 cd 命令,您可以轻松在不同目录之间切换,实现文件和目录操作。

语法:

1
cd [相对路径或绝对路径]

使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 切换到用户目录下
[root@Joker-CentOS7 /]# cd home

# 使用 mkdir 命令创建 joker 目录
[root@Joker-CentOS7 home]# mkdir joker

# 进入 joker 目录
[root@Joker-CentOS7 home]# cd joker

# 回到上一级
[root@Joker-CentOS7 joker]# cd ..

# 回到根目录
[root@Joker-CentOS7 joker]# cd /

# 表示回到自己的家目录,亦即是 /root 这个目录
[root@Joker-CentOS7 joker]# cd ~

pwd ( 显示目前所在的目录 )

pwd 是 “Print Working Directory” 的缩写,用于显示当前所在的工作目录。

语法:

1
pwd [-P]

选项与参数:

  • -P:显示确切的路径,而不是使用链接路径。

使用示例:

以下是使用 pwd 命令的示例,演示如何在 Linux 系统中显示当前工作目录:

1
2
3
4
5
6
7
8
# 单纯显示出目前的工作目录
[root@Joker-CentOS7 ~]# pwd
/root

# 如果是链接,要显示真实地址,可以使用 -P参数
[root@Joker-CentOS7 /]# cd bin
[root@Joker-CentOS7 bin]# pwd -P
/usr/bin

mkdir (创建新目录)

要创建新目录,可以使用 mkdir 命令,它的含义是 “make directory”,用于创建新的目录。

语法:

1
mkdir [-mp] 目录名称

选项与参数:

  • -m :直接配置新目录的权限,而不需要参考默认权限 (umask)。
  • -p :递归创建所需目录,包括上一级目录。

使用示例:

以下是使用 mkdir 命令的示例,演示如何在 Linux 系统中创建新目录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 进入我们用户目录下
[root@Joker-CentOS7 /]# cd /home

# 创建一个 test 文件夹
[root@Joker-CentOS7 home]# mkdir test

# 加了这个 -p 的选项,可以递归创建,而不提示No such file or directory
[root@Joker-CentOS7 home]# mkdir -p test1/test2/test3/test4

# 创建权限为 rwx--x--x 的目录。
[root@Joker-CentOS7 home]# mkdir -m 711 test2
[root@Joker-CentOS7 home]# ls -l
drwxr-xr-x 2 root root 4096 Mar 12 21:55 test
drwxr-xr-x 3 root root 4096 Mar 12 21:56 test1
drwx--x--x 2 root root 4096 Mar 12 21:58 test2

rmdir ( 删除空的目录 )

rmdir 命令用于删除空目录,但请注意,该命令只能删除不包含任何文件或子目录的目录。

语法:

1
rmdir [-p] 目录名称

选项与参数:

  • -p :连同上一级『空的』目录也一起删除。

使用示例:

以下是使用 rmdir 命令的示例,展示如何删除空目录:

1
2
3
4
5
6
7
8
9
# 删除空目录
[root@Joker-CentOS7 home]# rmdir test

# 尝试删除非空目录,会失败
[root@Joker-CentOS7 home]# rmdir test1
rmdir: failed to remove ‘test1’: Directory not empty

# 使用 -p 选项删除多级空目录:
[root@Joker-CentOS7 home]# rmdir -p test1/test2/test3/test4

请注意,rmdir 命令仅适用于删除空目录。如果要删除非空目录,您应该使用 rm 命令


cp ( 复制文件或目录 )

cp 命令用于复制文件或目录。它将源文件复制到指定的目标位置。

当然,我可以将关于 cp 命令的信息重新排版,以使其更易于理解:

复制文件 - cp

cp 命令用于复制文件或目录。它将源文件复制到指定的目标位置。

语法:

1
2
cp [-adfilprsu] 来源档(source) 目标档(destination)
cp [options] source1 source2 source3 .... directory

选项与参数:

  • -a :相当于 -pdr 的组合,即保留所有属性、递归复制;
  • -p :复制文件时连同其属性一起复制,而不使用默认属性(常用);
  • -d :若源文件为链接文件,则复制链接文件的属性,而非实际文件;
  • -r :递归地持续复制,用于复制目录(常用);
  • -f :强制复制,如果目标文件已存在且无法打开,则先删除目标文件再尝试复制;
  • -i :在覆盖目标文件时,询问用户是否要执行(常用);
  • -l :创建硬链接(硬链接),而不是复制文件本身;
  • -s :创建符号链接(符号链接),即“快捷方式”;
  • -u :仅在目标文件较旧时才进行复制。

使用示例:

以下是使用 cp 命令的示例,展示如何复制文件和目录:

1
2
3
4
5
6
7
8
9
# 复制 root目录下的install.sh 到 home目录下
[root@Joker-CentOS7 home]# cp /root/install.sh /home

# 使用 -i 选项覆盖目标文件时询问
[root@Joker-CentOS7 home]# cp -i /root/install.sh /home
cp: overwrite ‘/home/install.sh’? y # 输入 y 进行覆盖,n 不进行覆盖

# 复制目录及其内容:
[root@Joker-CentOS7 home]# cp -r /source_directory /destination_directory

rm ( 移除文件或目录 )

rm 命令用于删除文件或目录。请注意,删除操作是不可恢复的,因此在使用时要特别小心。

语法:

1
rm [-fir] 文件或目录

选项与参数:

  • -f :强制删除,忽略不存在的文件,不显示警告信息;
  • -i :互动模式,在删除前会询问用户是否确认操作;
  • -r :递归删除,用于删除目录及其内容(危险操作!)。

使用示例:

以下是使用 rm 命令的示例,展示如何删除文件和目录:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 删除文件
[root@Joker-CentOS7 home]# rm file.txt

# 使用 -i 选项进行互动式删除:
[root@Joker-CentOS7 home]# rm -i file.txt
rm: remove regular file ‘file.txt’? y
# 输入 y 确认删除,n 取消删除

# 删除目录及其内容(危险操作!):
[root@Joker-CentOS7 home]# rm -r directory_name

# 使用 -f 选项强制删除:
[root@Joker-CentOS7 home]# rm -f file.txt

注意事项:

请务必小心使用 rm -r /rm -rf /,因为这将递归地删除整个文件系统,导致数据丢失。这是一个非常危险的操作,应该避免在生产环境中使用。


mv ( 移动文件与目录,或修改名称 )

mv 命令用于移动文件或目录,也可用于重命名文件或目录。

语法:

1
2
mv [-fiu] 源文件或目录 目标文件或目录
mv [选项] 源文件1 源文件2 源文件3 ... 目标目录

选项与参数:

  • -f :强制操作,如果目标文件已经存在,直接覆盖而无需确认;
  • -i :互动模式,在覆盖目标文件前会询问用户是否确认操作;
  • -u :只有当源文件比目标文件新时,才会执行操作(更新操作)。

使用示例:

以下是使用 mv 命令的示例,展示如何移动、重命名文件和目录:

测试:

1
2
3
4
5
6
7
8
9
# 移动文件
[root@Joker-CentOS7 home]# mv file.txt /target_directory/

# 重命名文件
[root@Joker-CentOS7 home]# mv old_file.txt new_file.txt

#使用 -i 选项进行互动式操作
[root@Joker-CentOS7 home]# mv -i file.txt /target_directory/
mv: overwrite '/target_directory/file.txt'? y # 输入 y 确认覆盖,n 取消操作

其他命令
  • touch :新建文件
  • echo:输出字符串

基本属性


Linux多用户

​ Linux操作系统被视为典型的多用户环境,其中各用户处于不同地位,享有特定权限。为确保系统安全性,Linux对不同用户对同一文件(包括目录文件)的访问权限做出了详细规定。

​ 在Linux中,我们可借助ll或者ls -l命令,显示文件属性以及文件所属用户和组信息,例如:

img


文件属性
  • 第一个字符所代表的属性

    • 在示例中,”boot” 文件的第一个属性由 “d” 表示。在Linux中,”d” 代表该文件是一个目录文件(directory)。

    • 在Linux系统中,文件的第一个字符用来表示文件类型,它可以是以下几种情况:

      • 当为[ d ]时,表示为目录文件(directory)。

      • 当为[ - ]时,表示为普通文件(file)。

      • 若为[ l ]时,表示为链接文件(link file)。

      • 若为[ b ]时,表示为块设备文件,通常用于存储设备。

      • 若为[ c ]时,表示为字符设备文件,通常用于串口等设备。

  • 接下来的字符以三个为一组,组合表示文件的权限,分别为『rwx』。

    • 其中,[ r ] 代表可读(read)、[ w ] 代表可写(write)、[ x ] 代表可执行(execute)。
    • 这三个权限在属性中的位置不变。如果没有某项权限,相应位置会显示为减号[ - ]。
    • 每个文件的属性由属性字符串的前10个字符确定,如下图所示

363003_1227493859FdXT

  • 从左至右用0-9这些数字来表示。

    • 第0位确定文件类型,第1-3位确定属主(该文件的所有者)拥有该文件的权限。第4-6位确定属组(所有者的同组用户)拥有该文件的权限,第7-9位确定其他用户拥有该文件的权限。
    • 其中:
      • 第1、4、7位表示读权限,如果用”r”字符表示,则有读权限,如果用”-“字符表示,则没有读权限;
      • 第2、5、8位表示写权限,如果用”w”字符表示,则有写权限,如果用”-“字符表示没有写权限;
      • 第3、6、9位表示可执行权限,如果用”x”字符表示,则有执行权限,如果用”-“字符表示,则没有执行权限。
  • 文件所有者、用户组及其它

    1. 每个文件在Linux系统中都有一个特定的所有者。这个所有者就是对该文件具有完全控制权和所有权的用户。这意味着文件所有者可以决定文件的访问权限,可以对文件进行读、写和执行等操作。
    2. 在Linux系统中,用户被组织成不同的组。一个用户可以属于一个或多个组。这种组织方式有助于对用户进行分类和管理。
    3. 除了文件所有者外,其他用户可以被分为两类:文件所有者的同组用户和其他用户。文件所有者的同组用户是属于和文件所有者相同组的用户,其他用户则是系统中不属于该文件所有者组的用户。
    4. 基于这种组织结构,Linux系统对不同类别的用户(文件所有者、文件所有者同组用户、其他用户)分别规定了不同的文件访问权限。这些权限决定了谁可以进行文件的读取、写入和执行等操作。通过这种权限管理,系统可以确保文件的安全性和合理的共享。

在以上实例中,boot 文件是一个目录文件,属主(所有者)和属组(用户组)都为 root。

img

img

修改文件属性
  1. chgrp:更改文件属组

    使用chgrp命令可以更改文件的所属组。

    • 语法:

      1
      chgrp [-R] 属组名 文件名
    • 其中,-R参数表示递归地更改文件属组。如果在更改目录的属组时加上了-R参数,那么该目录下的所有文件的属组都会被更改。

  2. chown:更改文件属主和属组

    使用chown命令可以更改文件的属主,也可以同时更改文件的属组。

    • 语法:

      1
      2
      chown [-R] 属主名 文件名
      chown [-R] 属主名:属组名 文件名
    • 其中,-R参数表示递归地更改文件的属主和属组。可以使用属主名:属组名的格式来同时指定属主和属组。

  3. chmod:更改文件权限

    使用chmod命令可以更改文件的权限。

    • 语法:

      1
      chmod [-R] xyz 文件或目录
    • 说明:

      Linux文件有九个基本权限位,分别是owner/group/others三种身份各自的read/write/execute权限。每个权限对应的分数如下:

      1
      r:4		w:2		x:1

      可以通过将这些权限的分数累加来表示不同身份的权限组合。例如,-rwxrwx---的权限可以表示为:

      • owner = rwx = 4+2+1 = 7
      • group = rwx = 4+2+1 = 7
      • others= — = 0+0+0 = 0
    • chmod数字权限

      使用chmod命令可以使用数字或符号两种方式设置权限。通过数字方式,可以直接将各权限的分数相加,然后设置给文件。例如,chmod 770 filename表示将权限设置为:

      • owner = rwx = 7
      • group = rwx = 7
      • others= — = 0

文件内容查看


概述

在Linux系统中,有多个命令可以用来查看文件的内容。以下是一些常用的文件查看命令及其功能:

  1. cat:从第一行开始显示文件内容。
  2. tac:从最后一行开始显示文件内容,实际上是cat命令的倒序。
  3. nl:显示文件内容时附带行号。
  4. more:逐页显示文件内容。
  5. less:类似于more,但可以向前翻页。
  6. head:显示文件的前几行。
  7. tail:显示文件的后几行。

你可以使用man [命令]来查看每个命令的详细使用说明,例如:man cp


详解
  • **cat**:从第一行开始显示文件内容

    语法:

    1
    cat [-AbEnTv]

    选项与参数:

    • -A:以可见的方式显示特殊字符。
    • -b:显示行号,但仅对非空白行有效。
    • -E:在每行结尾显示”$”符号。
    • -n:显示行号,包括空白行。
    • -T:将制表符显示为”^I”。
    • -v:显示看不见的特殊字符。
  • **tac**:从最后一行开始显示文件内容,可以理解为cat命令的反向输出。

  • **nl**:显示行号

    语法:

    1
    nl [-bnw] 文件

    选项与参数:

    • -b:指定行号显示方式,-b a显示所有行号,-b t显示非空白行号(默认)。
  • **more**:一页一页翻页显示文件内容。

    • more运行过程中,可以使用不同按键进行操作,例如空格键向下翻一页,Enter键向下翻一行,/字串进行向下搜索,q退出等。
  • **less**:类似于more,但更强大,可以向前翻页。同样,运行时可以使用多种按键进行操作。

    • 按键操作:
      • 空格键(Space):向下滚动一页。
      • Enter 键:向下滚动一行。
      • B 键:向上滚动一页。
      • Q 键:退出less
      • /:进入搜索模式,输入关键字搜索,按 n 切换到下一个匹配项,按 N 切换到上一个匹配项。
      • ?:类似于 /,但是向上搜索。
      • n:在搜索模式下,查找下一个匹配项。
      • N:在搜索模式下,查找上一个匹配项。
      • G:跳转到文件末尾。
      • g:跳转到文件开头。
      • :n:跳转到下一个文件(如果有多个文件)。
      • :p:跳转到前一个文件。
      • :e:重新加载当前文件。
  • **head**:取出文件前面几行。可以通过-n参数指定显示行数。

  • **tail**:取出文件后面几行。同样,可以通过-n参数指定显示行数。


示例

这里以查看网络配置文件为示例

  1. cd到如下目录etc/sysconfig/network-scripts/

    image-20230825145959853

    • Windows下的ping命令在Linux中依然为ping,但是ipconfig在Linux下为ifconfig
  2. cat正序一个文件

    image-20230825150238269

  3. tac倒序查看一个文件

    image-20230825150355057

  4. nl查看一个文件,显示行号

    image-20230825150518501

  5. more查看一个文件

    image-20230825150759324

  6. less翻页(上下键)

    image-20230825151031046

  7. head查看一个文件的前n行

    image-20230825151146389

  8. tail查看一个文件的最后n行

    image-20230825151418774

Linux链接概念


在Linux系统中,链接分为两种类型:硬链接(Hard Link)和软链接(Symbolic Link)。


硬链接

​ 硬链接通过索引节点进行连接,一个索引节点可以被多个文件名指向。多个文件名指向同一索引节点,即使删除其中一个文件名,索引节点仍然存在。硬链接在文件被删除前,不会释放文件的数据块。

​ 大致来讲,就是一个文件有多个路径。当创建了A的硬链接B时,那么它们将会指向同一个文件。当删除其中一个时,另一个不会受影响。

​ 通过ln命令可以创建硬链接,默认情况下创建硬链接。硬链接与原文件具有相同的索引节点号。

特点:

  • 删除原始文件不影响硬链接的访问,因为它们共享inode。
  • 硬链接不能跨越文件系统边界创建。
  • 硬链接不能指向目录。
  • 硬链接无法引用不存在的文件。

软连接

​ 软连接也叫符号链接,符号链接是一个特殊的文件,它包含了另一个文件的位置信息。符号链接是一个路径名的快捷方式,如果目标文件被删除,符号链接将失效。这类似于Windows的快捷方式。

​ 对于硬链接,删除一个链接不影响其他链接。而对于符号链接,删除目标文件会导致符号链接失效。

​ 符号链接通过ln -s命令创建,符号链接与原文件具有不同的索引节点号。

特点:

  • 删除原始文件后,软连接将失效,称为“悬空链接”。
  • 软连接可以跨越文件系统边界创建。
  • 软连接可以指向文件或目录。
  • 软连接可以引用不存在的文件。

你可以进行一些实验来更好地理解这些概念,例如创建文件、创建硬链接和符号链接,然后删除目标文件和链接,观察结果。

Vim编辑器


什么是Vim编辑器

​ Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。

​ 简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。

​ vim 则可以说是程序开发者的一项很好用的工具。

​ 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在。

​ 连 vim 的官方网站 (http://www.vim.org) 自己也说 vim 是一个程序开发工具而不是文字处理软件。

vim 键盘图:

Vim键盘图


三种使用模式

基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。这三种模式的作用分别是:

  • 命令模式:

    用户刚刚启动 vi/vim,便进入了命令模式。

    此状态下敲击键盘动作会被 Vim 识别为命令,而非输入字符。比如我们此时按下 i,并不会输入一个字符,i 被当作了一个命令。

    以下是常用的几个命令:

    • i:切换到输入模式,以输入字符。
    • x:删除当前光标所在处的字符。
    • ::切换到底线命令模式,以在最底一行输入命令。

    若想要编辑文本:启动 Vim,进入了命令模式,按下 i,切换到输入模式。

    命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令。

  • 输入模式:

    在命令模式下按下 i 就进入了输入模式。

    在输入模式中,可以使用以下按键:

    • 字符按键以及 Shift 组合,输入字符。
    • ENTER,回车键,换行。
    • BACK SPACE,退格键,删除光标前一个字符。
    • DEL,删除键,删除光标后一个字符。
    • 方向键,在文本中移动光标。
    • HOME/END,移动光标到行首/行尾。
    • Page Up/Page Down,上/下翻页。
    • Insert,切换光标为输入/替换模式,光标将变成竖线/下划线。
    • ESC,退出输入模式,切换到命令模式。
  • 底线命令模式:

    在命令模式下按下 :(英文冒号)就进入了底线命令模式。

    底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。

    在底线命令模式中,基本的命令有(已经省略了冒号):

    • q:退出程序。
    • w:保存文件。

    ESC 键可随时退出底线命令模式。

简单的说,我们可以将这三个模式想成底下的图标来表示:

![img](images/跟随狂神学Java-42/640-1692951273909-23.jpeg” alt=”图片)


完整的演示说明
  • 新建或者编辑文件,按i进入编辑模式,编写内容。
  • 编写完成后,esc退出编辑模式
  • :进入底线命令模式,wq保存退出

Vim按键说明
  • 一般模式可用的光标移动、复制粘贴、搜索替换等

    移动光标的方法
    h 或 向左箭头键(←) 光标向左移动一个字符
    j 或 向下箭头键(↓) 光标向下移动一个字符
    k 或 向上箭头键(↑) 光标向上移动一个字符
    l 或 向右箭头键(→) 光标向右移动一个字符
    [Ctrl] + [f] 屏幕『向下』移动一页,相当于 [Page Down]按键 (常用)
    [Ctrl] + [b] 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用)
    [Ctrl] + [d] 屏幕『向下』移动半页
    [Ctrl] + [u] 屏幕『向上』移动半页
    + 光标移动到非空格符的下一行
    - 光标移动到非空格符的上一行
    n< space> 那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n 个字符。
    0 或功能键[Home] 这是数字『 0 』:移动到这一行的最前面字符处 (常用)
    $ 或功能键[End] 移动到这一行的最后面字符处(常用)
    H 光标移动到这个屏幕的最上方那一行的第一个字符
    M 光标移动到这个屏幕的中央那一行的第一个字符
    L 光标移动到这个屏幕的最下方那一行的第一个字符
    G 移动到这个档案的最后一行(常用)
    nG n 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu)
    gg 移动到这个档案的第一行,相当于 1G 啊!(常用)
    n< Enter> n 为数字。光标向下移动 n 行(常用)
    搜索替换
    /word 向光标之下寻找一个名称为 word 的字符串。例如要在档案内搜寻 vbird 这个字符串,就输入 /vbird 即可!(常用)
    ?word 向光标之上寻找一个字符串名称为 word 的字符串。
    n 这个 n 是英文按键。代表重复前一个搜寻的动作。举例来说, 如果刚刚我们执行 /vbird 去向下搜寻 vbird 这个字符串,则按下 n 后,会向下继续搜寻下一个名称为 vbird 的字符串。如果是执行 ?vbird 的话,那么按下 n 则会向上继续搜寻名称为 vbird 的字符串!
    N 这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。例如 /vbird 后,按下 N 则表示『向上』搜寻 vbird 。
    删除、复制与粘贴
    x, X 在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用)
    nx n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』。
    dd 删除游标所在的那一整行(常用)
    ndd n 为数字。删除光标所在的向下 n 行,例如 20dd 则是删除 20 行 (常用)
    d1G 删除光标所在到第一行的所有数据
    dG 删除光标所在到最后一行的所有数据
    d$ 删除游标所在处,到该行的最后一个字符
    d0 那个是数字的 0 ,删除游标所在处,到该行的最前面一个字符
    yy 复制游标所在的那一行(常用)
    nyy n 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行(常用)
    y1G 复制游标所在行到第一行的所有数据
    yG 复制游标所在行到最后一行的所有数据
    y0 复制光标所在的那个字符到该行行首的所有数据
    y$ 复制光标所在的那个字符到该行行尾的所有数据
    p, P p 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行!举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢?那么原本的第 20 行会被推到变成 30 行。(常用)
    J 将光标所在行与下一行的数据结合成同一行
    c 重复删除多个数据,例如向下删除 10 行,[ 10cj ]
    u 复原前一个动作。(常用)
    [Ctrl]+r 重做上一个动作。(常用)
  • 一般模式切换到编辑模式的可用的按钮说明

    进入输入或取代的编辑模式
    i, I 进入输入模式(Insert mode):i 为『从目前光标所在处输入』, I 为『在目前所在行的第一个非空格符处开始输入』。(常用)
    a, A 进入输入模式(Insert mode):a 为『从目前光标所在的下一个字符处开始输入』, A 为『从光标所在行的最后一个字符处开始输入』。(常用)
    o, O 进入输入模式(Insert mode):这是英文字母 o 的大小写。o 为『在目前光标所在的下一行处输入新的一行』;O 为在目前光标所在处的上一行输入新的一行!(常用)
    r, R 进入取代模式(Replace mode):r 只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下 ESC 为止;(常用)
    [Esc] 退出编辑模式,回到一般模式中(常用)
  • 一般模式切换到指令行模式的可用的按钮说明

    指令行的储存、离开等指令
    :w 将编辑的数据写入硬盘档案中(常用)
    :w! 若文件属性为『只读』时,强制写入该档案。不过,到底能不能写入, 还是跟你对该档案的档案权限有关啊!
    :q 离开 vi (常用)
    :q! 若曾修改过档案,又不想储存,使用 ! 为强制离开不储存档案。
    注意一下啊,那个惊叹号 (!) 在 vi 当中,常常具有『强制』的意思~
    :wq 储存后离开,若为 :wq! 则为强制储存后离开 (常用)
    ZZ 这是大写的 Z 喔!若档案没有更动,则不储存离开,若档案已经被更动过,则储存后离开!
    :w [filename] 将编辑的数据储存成另一个档案(类似另存新档)
    :r [filename] 在编辑的数据中,读入另一个档案的数据。亦即将 『filename』 这个档案内容加到游标所在行后面
    :n1,n2 w [filename] 将 n1 到 n2 的内容储存成 filename 这个档案。
    :! command 暂时离开 vi 到指令行模式下执行 command 的显示结果!例如 『:! ls /home』即可在 vi 当中看 /home 底下以 ls 输出的档案信息!
    :set nu 显示行号,设定之后,会在每一行的前缀显示该行的行号
    :set nonu 与 set nu 相反,为取消行号!

用户管理


简介

​ Linux系统是一个多用户多任务的分时操作系统。为了使用系统资源,用户需要向系统管理员申请一个账号,然后通过这个账号进入系统。

​ 用户账号的存在有多重目的。首先,它可以让系统管理员追踪使用系统的用户,并管理他们对系统资源的访问。其次,它能够帮助用户组织文件,并为用户提供安全性保护。

​ 每个用户账号都有一个唯一的用户名和对应的口令。当用户输入正确的用户名和口令后,就能够成功登录系统并进入自己的主目录。

用户账号的管理涵盖以下几个方面:

  1. 用户账号的添加、删除与修改: 系统管理员负责管理用户账号的创建、删除和修改。这确保了只有被授权的用户可以访问系统资源。添加新用户时,系统会分配一个唯一的用户名和相应的口令。对于已有用户,管理员可以修改其权限或其他信息。
  2. 用户口令的管理: 用户口令是确保账号安全的关键。用户应定期更改口令,而管理员则需要确保口令复杂度和安全策略的执行。这有助于防止未经授权的访问和信息泄露。
  3. 用户组的管理: 用户组是一种将用户进行逻辑组织的方式。管理员可以创建不同的用户组,并将相关用户加入其中。这对于在一组用户之间共享权限和资源非常有用,同时也简化了权限的管理。

用户账号的管理

​ 用户账号的管理工作主要涉及到用户账号的添加、修改和删除。

​ 添加用户账号就是在系统中创建一个新账号,然后为新账号分配用户号、用户组、主目录和登录Shell等资源。


添加用户
  • 语法

    1
    useradd 选项 用户名
  • 参数说明

    • -c comment:为用户指定一段注释性描述。
    • -d 目录:指定用户主目录。如果该目录不存在,同时使用 -m 选项可以创建主目录。
    • -g 用户组:指定用户所属的主用户组。
    • -G 用户组,用户组:指定用户所属的附加用户组。
    • -m:如果用户目录不存在,则自动创建。
    • -s Shell文件:指定用户的登录Shell。
    • -u 用户号:指定用户的用户号。如果同时使用 -o 选项,则可以重复使用其他用户的标识号。
  • 示例

    • 以下示例命令创建了一个名为 “joker” 的用户。使用 -m 选项创建了登录名 “joker” 的主目录 /home/joker
    1
    [root@Joker-CentOS7 home]# useradd -m joker
  • 说明

    useradd 命令实际上在 /etc/passwd 文件中为新用户添加一条记录,并同时更新其他系统文件,如 /etc/shadow/etc/group 等。


切换用户

img

  1. 从当前用户切换到指定用户可以使用命令:su username (其中us 为switch user,username是你要切换到的用户名)

  2. 从普通用户切换到root用户,可以使用命令:sudo su(其中sudo为Superuser Do)

  3. 若要返回原来的用户,可以在终端输入exitlogout,或者使用快捷方式Ctrl+d。这将使你退回到原始用户,实际上,Ctrl+d执行的就是exit命令。

  4. 如果你在切换用户后想要使用新用户的工作环境,可以在suusername之间加上-,例如:su - root

在终端中:

  • $ 表示普通用户。
  • # 表示超级用户,也就是root用户。

删除用户

要删除一个现有的用户账号,可以使用 userdel 命令。

  • 语法

    1
    userdel 选项 用户名
  • 参数说明

    • -r :用于同时删除用户的主目录。
  • 示例:

    • 以下命令将删除用户 joker,并通过 -r 选项连同其主目录一起删除:

      1
      [root@Joker-CentOS7 home]# userdel -r joker

    上述命令将删除用户 joker 在系统文件中的记录,主要包括 /etc/passwd/etc/shadow/etc/group 等文件。同时,也会删除用户的主目录。请注意,这个操作会永久删除用户及其相关数据,因此请谨慎使用。


修改用户

修改用户账号意味着根据实际情况调整用户的相关属性,包括用户号、主目录、用户组、登录Shell等。

  • 语法

    1
    usermod 选项 用户名
  • 参数说明

    • -c comment:为用户指定一段注释性描述。
    • -d 目录:指定用户主目录。如果该目录不存在,同时使用 -m 选项可以创建主目录。
    • -g 用户组:指定用户所属的主用户组。
    • -G 用户组,用户组:指定用户所属的附加用户组。
    • -m:如果用户目录不存在,则自动创建。
    • -s Shell文件:指定用户的登录Shell。
    • -u 用户号:指定用户的用户号。如果同时使用 -o 选项,则可以重复使用其他用户的标识号。
  • 示例

    例如,以下命令将会修改用户 joker 的登录Shell为 yue,将主目录改为 /home/z,并将用户组修改为 developer

    1
    usermod -s /bin/yue -d /home/z -g developer joker

用户口令的管理

​ 在用户管理中,有效地管理用户口令是至关重要的。新创建的用户账号在最初并不拥有口令,但这些账号被系统锁定,因此无法使用。在使用之前,必须为这些账号分配一个口令,即使是一个空口令也可以。

  • 语法

    1
    passwd 选项 用户名
  • 参数说明

    • -l:锁定口令,即禁用账号。
    • -u:解锁口令。
    • -d:移除口令,使账号无法通过口令登录。
    • -f:强制用户在下次登录时修改口令。

    如果未指定用户名,将会修改当前用户的口令。

  • 示例

    • 例如,假设当前用户是 joker,以下命令将修改该用户自己的口令:

      1
      2
      3
      4
      $ passwd
      Old password: ******
      New password: ******
      Re-enter new password: ******
    • 超级用户可以使用以下命令为任何用户设置口令:

      1
      2
      3
      # passwd joker
      New password: ******
      Re-enter new password: ******
    • 要设置空口令,可以执行以下命令:

      1
      # passwd -d joker

      上述命令将删除用户 joker 的口令,导致用户下一次登录时无法使用口令登录。

    • 此外,passwd命令还提供了 -l(锁定)选项,用于锁定某一用户,从而阻止其登录,例如:

      1
      # passwd -l joker

      这将锁定用户 joker,使其无法登录系统。

  • 说明

    • 当普通用户尝试修改自己的口令时,passwd命令首先会要求输入原口令进行验证,然后再要求输入新口令两次。如果两次输入的口令一致,新口令将会生效。而超级用户为用户设置口令时,则不需要知道原口令。

    • 出于系统安全考虑,用户应选择足够复杂的口令。建议至少使用8个字符长度的口令,其中包括大小写字母和数字,避免使用与姓名、生日等相关的信息。

用户组管理


什么是用户组

在Linux操作系统中,用户组(User Groups)是一种用于管理和授权用户权限的机制。用户组允许你将一组用户归类,并为这些用户提供共同的权限和访问。下面是关于Linux中用户组的一些相关信息:

  1. 用户组的目的
    用户组用于将一组用户聚集在一起,以便对这些用户的访问权限和资源进行集中管理。用户组可以帮助系统管理员更方便地控制用户对文件、目录以及其他系统资源的访问和操作权限。

  2. 用户组的属性
    每个用户组在系统中都有一个唯一的组ID(GID),用于标识该用户组。此外,每个用户组还可以有一个组名(通常是字母或数字的组合),以更好地描述其用途。

  3. 默认用户组
    在Linux系统中,通常会为每个用户创建一个与其用户名相同的默认用户组。例如,用户”john”的默认用户组可能会被命名为”john”组。这样,用户就可以与同一用户组中的其他用户共享资源和权限。

  4. 辅助用户组
    除了默认用户组外,用户还可以归属于多个辅助用户组。这些组不同于默认组,用户可以在其中获得额外的权限。这种灵活性允许用户在多个项目或团队之间共享资源而无需将其添加到不同的默认组。

  5. 用户组的相关命令

    • groupadd:用于创建新的用户组。
    • groupmod:用于修改用户组的属性,如组名或GID。
    • groupdel:用于删除用户组。
    • usermod:可以使用其 -G 选项将用户添加到辅助用户组。
    • newgrp:允许用户切换到不同的用户组,以便获得该组的权限。
    • groups:显示用户所属的所有用户组。

    ​ 用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新。

  6. 文件和目录权限
    用户组在Linux中与文件和目录权限紧密相关。文件和目录有所有者、所有组和其他用户的权限设置。这使得文件的所有者和所属组能够更好地控制对文件的访问。

  7. 权限继承
    当用户创建新文件或目录时,这些新创建的对象会继承创建者的默认用户组。这意味着文件的所属组与创建者的默认组相同,这样可以确保创建者拥有合适的权限。

通过适当地使用用户组,管理员可以更好地管理用户权限,确保文件和资源的安全和合理访问。


创建用户组groupadd

要添加一个新的用户组,你可以使用 groupadd 命令。以下是一些可用选项及其示例:

  • 语法

    1
    groupadd 选项 用户组
  • 参数说明

    • -g GID:为新用户组指定组标识号(GID)。
    • -o:通常与 -g 选项一起使用,允许新用户组的 GID 与系统中已存在的用户组的 GID 相同。
    • -c:指定一段注释性描述。
    • -d 目录:指定用户主目录。若目录不存在,同时使用 -m 选项会自动创建主目录。
    • -G 用户组:指定用户所属的附加组。
    • -m:如果用户目录不存在,则自动创建。
    • -s:指定用户的登录Shell。
    • -u:指定用户的用户号。如果同时使用 -o 选项,则可以重复使用其他用户的标识号。
  • 示例

    • 以下命令将向系统中添加一个新的用户组 group1

      1
      # groupadd group1
    • 以下命令将向系统中添加一个名为 group2 的新用户组,并同时指定其组标识号为 101

      1
      # groupadd -g 101 group2
  • 说明

    如果新建用户组时没有指定GID,那么新组的组标识号(GID)将在当前已存在的最大组标识号的基础上加1。


删除用户组groupdel

如果你需要删除一个已存在的用户组,可以使用 groupdel 命令。

  • 语法:

    1
    groupdel 用户组
  • 示例:

    例如,如果你想要删除一个名为 group1 的用户组,只需执行以下命令:

    1
    # groupdel group1

修改用户组 groupmod

如果你需要修改用户组的属性,你可以使用 groupmod 命令。

  • 语法

    1
    groupmod 选项 用户组
  • 参数说明

    • -g GID:为用户组指定新的组标识号(GID)。
    • -o:与 -g 选项同时使用,允许用户组的新 GID 与系统中已存在的用户组的 GID 相同。
    • -n 新用户组:将用户组的名称改为新名称。
  • 示例

    • 以下命令将会修改组 group2 的组标识号为 102

      1
      groupmod -g 102 group2
    • 以下命令将会修改组 group2 的标识号为 10000,并将其组名修改为 group3

      1
      groupmod -g 10000 -n group3 group2

切换组newgrp

如果一个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户组的权限。

  • 示例

    用户可以在登录后,使用命令newgrp切换到其他用户组,这个命令的参数就是目的用户组。例如:

    1
    $ newgrp root

    这条命令将当前用户切换到root用户组,前提条件是root用户组确实是该用户的主组或附加组。

用户管理和系统文件


​ 用户管理的方式有很多种,但实质上都涉及修改与系统文件相关的内容。与用户和用户组相关的信息存放在系统文件中,其中包括 /etc/passwd/etc/shadow/etc/group 等。


/etc/passwd 文件

/etc/passwd 是用户管理中最重要的文件之一。在 Linux 系统中,每个用户都在此文件中有一条记录,记录了用户的基本属性。该文件对所有用户都是可读的。记录的内容示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# cat /etc/passwd

root:x:0:0:Superuser:/:
daemon:x:1:1:System daemons:/etc:
bin:x:2:2:Owner of system commands:/bin:
sys:x:3:3:Owner of system files:/usr/sys:
adm:x:4:4:System accounting:/usr/adm:
uucp:x:5:5:UUCP administrator:/usr/lib/uucp:
auth:x:7:21:Authentication administrator:/tcb/files/auth:
cron:x:9:16:Cron daemon:/usr/spool/cron:
listen:x:37:4:Network daemon:/usr/net/nls:
lp:x:71:18:Printer administrator:/usr/spool/lp:

...
  • 说明

    每行记录由冒号分隔为 7 个字段,其格式以及每个字段的具体含义如下:

    1
    用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
    1. 用户名:代表用户账号的字符串。
      • 通常长度不超过8个字符,并且由大小写字母和/或数字组成。登录名中不能有冒号:,因为冒号在这里是分隔符。
    2. 口令:在一些系统中,存放加密后的用户口令字。
      • 现在许多系统(如SVR4)使用 shadow 技术,将实际的加密口令存放在 /etc/shadow 文件中,而在 /etc/passwd 中则存放特殊字符,如 “x” 或 “*”
    3. 用户标识号:用于系统内部标识用户的整数。
      • 一般情况下它与用户名是一一对应的。如果几个用户名对应的用户标识号是一样的,系统内部将把它们视为同一个用户,但是它们可以有不同的口令、不同的主目录以及不同的登录Shell等。
    4. 组标识号:用户所属的用户组,对应 /etc/group 文件中的记录。
    5. 注释性描述:用户的个人描述信息,格式因系统而异,通常不具实际用途。
    6. 主目录:用户的起始工作目录,在登录时使用。
      • 它是用户在登录到系统之后所处的目录。在大多数系统中,各用户的主目录都被组织在同一个特定的目录下,而用户主目录的名称就是该用户的登录名。各用户对自己的主目录有读、写、执行(搜索)权限,其他用户对此目录的访问权限则根据具体情况设置。
    7. 登录 Shell:用户登录后启动的命令解释器或特定程序,是用户与系统交互的接口。
      • Shell是用户与Linux系统之间的接口。Linux的Shell有许多种,每种都有不同的特点。常用的有sh(Bourne Shell), csh(C Shell), ksh(Korn Shell), tcsh(TENEX/TOPS-20 type C Shell), bash(Bourne Again Shell)等。
      • 系统管理员可以根据系统情况和用户习惯为用户指定某个Shell。如果不指定Shell,那么系统使用sh为默认的登录Shell,即这个字段的值为/bin/sh。
      • 用户的登录Shell也可以指定为某个特定的程序(此程序不是一个命令解释器)。
      • 利用这一特点,我们可以限制用户只能运行指定的应用程序,在该应用程序运行结束后,用户就自动退出了系统。有些Linux 系统要求只有那些在系统中登记了的程序才能出现在这个字段中。
  • 伪用户

    系统中还有一类称为伪用户的存在,它们在 /etc/passwd 文件中有记录,但无法登录,因为其登录 Shell 为空。伪用户主要用于满足系统进程对文件属主的要求。常见的伪用户包括:

    • bin:拥有可执行的用户命令文件。
    • sys:拥有系统文件。
    • adm:拥有帐户文件。
    • uucp:UUCP 使用。
    • lp:lp 或 lpd 子系统使用。
    • nobody:NFS 使用。

    除了上面列出的伪用户外,还有许多标准的伪用户,例如:audit, cron, mail, usenet等,它们也都各自为相关的进程和文件所需要。


/etc/shadow 文件

​ 由于/etc/passwd文件是所有用户都可读的,如果用户的密码太简单或规律比较明显的话,一台普通的计算机就能够很容易地将它破解,因此对安全性要求较高的Linux系统都把加密后的口令字分离出来,单独存放在一个文件中,这个文件是/etc/shadow文件。有超级用户才拥有该文件读权限,这就保证了用户密码的安全性。

/etc/shadow中的记录行与/etc/passwd中的一一对应,它由pwconv命令根据/etc/passwd中的数据自动产生

它的文件格式与/etc/passwd类似,由若干个字段组成,字段之间用”:”隔开。这些字段是:

1
登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
  • 登录名:与/etc/passwd文件中的登录名相匹配的用户账号。
  • 加密口令:存放加密后的用户口令,长度为13个字符。如果为空,则表示对应用户没有口令,因此无需输入口令就能登录。如果含有不属于集合 { ./0-9A-Za-z } 中的字符,则对应的用户将无法登录。
  • 最后一次修改时间:从某个时间起,到用户最后一次修改口令的天数。时间起点可能因系统不同而异,例如在SCO Linux中,起点是1970年1月1日。
  • 最小时间间隔:两次修改口令之间所需的最小天数。
  • 最大时间间隔:口令保持有效的最大天数。
  • 警告时间:系统开始警告用户到用户密码正式失效之间的天数。
  • 不活动时间:用户没有登录活动但账号仍保持有效的最大天数。
  • 失效时间:指定账号的绝对失效天数,达到这个天数后,账号不再是合法的,无法登录。

/etc/group 文件

​ 在Linux系统中,用户组信息被存储在/etc/group文件中。通过将用户分组,Linux实现了对用户进行管理和控制访问权限的重要方式。

每个用户都隶属于一个特定的用户组。一个组可以包含多个用户,而一个用户也可以属于多个不同的组。当一个用户同时属于多个组时,在/etc/passwd文件中记录的是用户的主组,这是用户登录时的默认组,其他组则被称为附加组。在用户需要访问属于附加组的文件时,需要使用newgrp命令将自己切换为所需访问组的成员。

​ 用户组的所有信息都以格式化记录存储在/etc/group文件中。该文件的格式类似于/etc/passwd,由冒号(:)分隔的字段构成。这些字段包括:

  1. 组名:用户组的名称,通常由字母或数字组成。类似于/etc/passwd中的登录名,组名应保持唯一性。

  2. 口令:存放用户组加密后的口令。在大多数情况下,Linux用户组并不设置口令,因此该字段通常为空或用*表示。

  3. 组标识号:类似于用户标识号,是一个整数,用于在系统内标识该组。

  4. 组内用户列表:列出属于该组的所有用户,用逗号(,)分隔。这些用户可能是组的主要成员,也可能是附加成员。

通过这种分组机制,Linux系统实现了对用户的更精细控制和权限管理。

磁盘管理


概述

Linux磁盘管理的重要性不言而喻,它直接影响到整个系统的性能。两个常用的磁盘管理命令是 dfdu

  • df:这个命令用于显示文件系统的整体磁盘使用情况,包括磁盘剩余空间、已使用空间以及总空间等信息。

  • dudu 命令用于检查磁盘空间的使用情况,可以递归地计算目录和文件的大小,帮助你找出哪些文件或目录占用了大量的磁盘空间


df

df 命令用于检查文件系统的磁盘空间占用情况,帮助获取硬盘被占用了多少空间,以及目前还剩下多少空间等信息。

  • 语法

    1
    df [-ahikHTm] [目录或文件名]
  • 参数说明

    • -a:列出所有文件系统,包括系统特有的 /proc 等文件系统;
    • -k:以 KBytes 容量显示各文件系统;
    • -m:以 MBytes 容量显示各文件系统;
    • -h:以易读的 GBytes、MBytes、KBytes 等格式显示;
    • -H:以 1000K 取代 1024K 的进位方式;
    • -T:显示文件系统类型,连同文件系统名称(如 ext3)一并列出;
    • -i:使用 inode 数量来显示,而不是硬盘容量。
  • 示例

    1. 列出系统内所有文件系统,以 1 KBytes 容量显示(默认情况):

      1
      $ df
    2. 以易读的容量格式显示系统内所有文件系统:

      1
      $ df -h
    3. 列出系统内所有特殊文件格式及名称:

      1
      $ df -aT
    4. 显示 /etc 目录的可用磁盘容量,以易读的容量格式:

      1
      $ df -h /etc

du

du 命令用于查看文件和目录的磁盘使用空间情况,与 df 命令不同,它更关注文件和目录级别的使用空间情况。

  • 语法

    1
    du [-ahskm] 文件或目录名称
  • 选项与参数

    • -a:列出所有文件和目录的容量,包括隐藏文件夹;
    • -h:以易读的容量格式(G/M)显示;
    • -s:仅列出总量,不显示每个子目录的详细占用容量;
    • -S:不包括子目录下的总计,与 -s 有些差别;
    • -k:以 KBytes 列出容量;
    • -m:以 MBytes 列出容量。
  • 示例

    1. 仅列出当前目录下所有文件夹的容量,包括隐藏文件夹:

      1
      $ du
    2. 列出当前目录下所有文件和目录的容量,包括隐藏文件夹:

      1
      $ du -a
    3. 检查根目录下每个目录所占用的容量,以 MBytes 列出:

      1
      $ du -sm /*
  • 说明

    注意,du 命令会直接访问文件系统内的数据,与 df 命令的功能和实现方式是不同的。

磁盘挂载与卸除


​ 根文件系统之外的其他文件,为了能够访问,需要将它们通过”挂载”与根文件系统上的某个目录关联起来,这个目录称为”挂载点”。将这种关联关系解除的过程称为”卸载”。

​ 在 Linux 中,磁盘挂载使用 mount 命令,而卸载则使用 umount 命令。


磁盘挂载

挂载磁盘使用mount命令

  • 语法

    1
    mount [-t 文件系统] [-L Label名] [-o 额外选项] [-n] 装置文件名 挂载点
  • 示例:

    • /dev/hdc6 挂载到 /mnt/hdc6 目录上:

      1
      2
      3
      4
      5
      $ mkdir /mnt/hdc6
      $ mount /dev/hdc6 /mnt/hdc6
      $ df
      Filesystem 1K-blocks Used Available Use% Mounted on
      /dev/hdc6 1976312 42072 1833836 3% /mnt/hdc6
  • 说明

    image-20230826151206032


磁盘卸载

卸载磁盘使用 umount 命令

  • 语法

    1
    umount [-fn] 装置文件名或挂载点
  • 参数说明:

    • -f:强制卸载,可用于处理无法读取的网络文件系统(NFS)等情况;
    • -n:卸载时不更新 /etc/mtab
  • 示例:

    • 卸载 /dev/hdc6

      1
      $ umount /dev/hdc6

进程管理


什么是进程

在Linux中,进程是操作系统进行任务管理的基本单位。一个进程代表了正在运行的一个程序的实例。每个进程都拥有自己的内存空间、代码、数据、文件描述符和其他属性。进程之间是独立的,它们不能直接访问其他进程的内存或数据。

以下是关于Linux中进程的一些重要概念和解释:

  1. 进程标识符(PID):每个进程都有一个唯一的整数标识符,称为PID。这个标识符可以用来在系统中唯一地识别进程。

  2. 进程状态:进程可以处于不同的状态,包括运行(Running)、就绪(Ready)、阻塞(Blocked)等。操作系统根据不同的状态对进程进行调度和管理。

  3. 父进程和子进程:进程可以创建其他进程,创建者称为父进程,而新创建的进程称为子进程。子进程可以继承父进程的一些属性和环境变量。

  4. 进程调度:操作系统负责管理多个进程的执行,它通过进程调度算法来决定哪个进程在什么时候运行。调度算法的目标通常包括公平性、响应时间和效率等。

  5. 进程间通信(IPC):不同进程之间需要进行信息交换和协作,操作系统提供了各种进程间通信机制,如管道、共享内存、消息队列和信号量等。

  6. 进程控制块(PCB):操作系统为每个进程维护一个数据结构,称为进程控制块。PCB 包含了进程的所有信息,如进程状态、程序计数器、内存分配、文件描述符等。

  7. 多线程进程:一个进程可以拥有多个线程,这些线程共享同一个进程的资源,但每个线程可以独立执行不同的任务。多线程能够提高并发性和系统资源的有效利用。

  8. 僵尸进程和孤儿进程

    • 僵尸进程是指已经完成执行但尚未被父进程回收的子进程。这种情况通常发生在父进程没有及时调用waitwaitpid来回收子进程资源。
    • 孤儿进程是指其父进程已经终止的子进程。操作系统会将孤儿进程的父进程设置为 init 进程(PID为1),从而确保孤儿进程的资源能够被正确回收。

查看进程

通过使用ps命令,你可以获取有关正在运行的进程的信息,包括进程ID(PID)、状态、资源使用情况等。

  • 语法

    1
    ps [options]
  • 参数说明

    • 无参数:默认情况下,ps命令会显示当前用户在当前终端下运行的进程。

    • **aux**:显示所有用户的所有进程。其中,a表示显示所有用户的进程,u表示以用户为主要显示标准,x表示显示没有控制终端的进程。

    • **-ef**:显示所有进程的详细信息,包括命令行参数。

      • 我们一般使用的是pstree命令,如下:

        1
        2
        3
        4
        ps -ef|grep mysql 
        pstree -pu
        -p 显示父id
        -u 显示用户组
    • **-e**:显示系统中所有的进程,包括系统进程和用户进程。

    • **-l**:以长格式显示进程信息,包括进程的状态、PID、父进程的PID、CPU占用、内存占用等。

    • **-p <PID>**:显示特定PID对应的进程信息。

    • **--sort=-%cpu**:按照CPU占用率从高到低排序显示进程信息。

    • **--forest**:以树形显示进程,显示进程的层级关系。

  • 示例

    1
    ps -aux|grep touch

    解释:

    • ps 这是一个用于显示当前活动进程信息的命令。
    • -aux 这是ps命令的参数组合,它指定了要显示所有用户的所有进程,并以紧凑的格式显示。其中,a 表示显示所有用户的进程,u 表示以用户为主要显示标准,x 表示显示没有控制终端的进程。
    • | 这是一个管道操作符,它用于将一个命令的输出作为另一个命令的输入。
    • grep 这是一个用于搜索文本的命令,它可以在给定的文本中查找指定的模式。

    输出:

    • image-20230826153027002

结束进程

​ 在 Linux 中,你可以使用 kill 命令来终止或杀死指定的进程。kill 命令发送一个信号给目标进程,通常默认发送的是终止(SIGTERM)信号,使进程优雅地退出。如果进程没有响应终止信号,你可以使用更强制的方式发送强制终止(SIGKILL)信号。

  • 语法

    1
    kill [信号选项] 进程ID或进程名
  • 常用信号选项:

    • -15 或 -SIGTERM: 默认信号,会请求进程优雅地退出。
    • -9 或 -SIGKILL: 强制终止信号,将立即终止进程。
  • 示例:

    1. 使用进程 ID 杀死进程(默认为终止信号):

      1
      kill 1234

      这会尝试以默认的终止信号结束进程 ID 为 1234 的进程。

    2. 使用 -9 信号选项强制杀死进程:

      1
      kill -9 1234

      这会使用强制终止信号结束进程 ID 为 1234 的进程,即使进程无法正常退出。

    3. 使用进程名杀死进程:

      1
      killall process_name

      这会尝试以默认的终止信号结束所有具有给定进程名的进程。

环境安装


安装软件一般有三种方式:

  • rpm
  • 解压缩
  • yum在线安装

JDK安装(rpm安装)
  1. 下载JDK

    首先,你需要前往 Oracle官网 下载适用于你的系统的JDK。

  2. 安装Java环境

    首先,你可以使用以下命令检查系统是否已安装Java环境:

    1
    java -version

    如果已经安装了Java环境并且你想重新安装,可以使用以下步骤卸载旧版本并安装新的JDK。

    1
    2
    3
    4
    5
    6
    7
    8
    # 检查已安装的JDK版本
    rpm -qa|grep jdk

    # 卸载旧版本
    rpm -e --nodeps [上一条命令检查出的版本]

    # 安装新版本的JDK
    rpm -ivk [你的JDK的RPM软件包]
  3. 配置环境变量

    通常情况下,使用命令安装的JDK不需要手动配置环境变量。但是如果需要手动配置,你可以按照以下步骤进行。

    首先,编辑 /etc/profile 文件:

    1
    vim /etc/profile

    在文件末尾插入以下内容,注意将/usr/java/jdk1.8.0_202-amd64替换为你的实际JDK路径:

    1
    2
    3
    4
    5
    # this is for java environment
    export JAVA_HOME=/usr/java/jdk1.8.0_202-amd64
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    export PATH=$PATH:$JAVA_HOME/bin
    export JRE_HOME=$JAVA_HOME/jre
  4. 使修改生效

    最后,运行以下命令使修改的环境变量生效:

    1
    source /etc/profile

Tomcat安装(解压缩安装)

如果你想运行基于SSM(Spring + Spring MVC + MyBatis)的WAR包,你需要将该WAR包部署到Tomcat服务器中运行。

  1. 下载和解压Tomcat

    首先,你需要从 Apache Tomcat® 官网下载Tomcat。下载下来的文件是一个压缩文件,通常是tar.gz格式的。然后,你需要解压缩该文件,可以使用以下命令:

    1
    tar -zxvf [your-file.tar.gz]
  2. 启动和停止Tomcat

    在部署和运行WAR包之前,你需要执行以下命令来启动和停止Tomcat。

    • 启动Tomcat

      使用以下命令启动Tomcat服务器:

      1
      ./startup.sh
    • 停止Tomcat

      当你需要停止Tomcat服务器时,可以使用以下命令:

      1
      ./shutdown.sh

注意:以上命令需要在Tomcat的安装目录下执行。


Docker安装(yum命令安装)

Install Docker Engine on CentOS | Docker Docs官方安装教程

  1. 检测CentOS版本

    使用以下命令可以查看当前 CentOS 的版本信息:

    1
    2
    [root@Joker-CentOS7 etc]# cat /etc/redhat-release 
    CentOS Linux release 7.9.2009 (Core)
  2. 安装准备环境

    使用 yum 命令可以安装所需的包。其中 -y 标志用于自动确认安装提示:

    1
    yum -y install [package-name]
  3. 安装gcc相关(需要确保虚拟机可以上外网)

    使用以下命令安装 gcc 相关的包:

    1
    yum -y install gcc gcc-c++
  4. 卸载旧版本

    如果需要卸载旧版本的 Docker,可以使用以下命令进行卸载:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    yum -y remove docker docker-common docker-selinux docker-engine
    # 官网版本
    yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine
  5. 安装所需软件包

    使用以下命令安装所需的软件包,包括 yum-utilsdevice-mapper-persistent-datalvm2

    1
    yum install -y yum-utils device-mapper-persistent-data lvm2
  6. 设置stable镜像仓库

    推荐使用国内的镜像仓库,使用以下命令添加阿里云的 Docker 镜像仓库:

    1
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  7. 更新yum软件包索引

    在添加新的仓库后,使用以下命令更新软件包索引:

    1
    yum makecache fast
  8. 安装Docker CE

    安装 Docker CE 及其命令行工具等,使用以下命令:

    1
    yum -y install docker-ce docker-ce-cli containerd.io
  9. 启动Docker

    使用以下命令启动 Docker 服务:

    1
    systemctl start docker
  10. 测试

至此,你可以进行 Docker 相关操作,以确保 Docker 已经正确安装和启动。


防火墙
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 查看防火墙服务状态
systemctl status firewalld

# 启动、重启、关闭firewalld.service服务
# 启动
systemctl start firewalld
# 重启
systemctl restart firewalld
# 关闭
systemctl stop firewalld

# 查看防火墙规则
# 查看全部信息
firewall-cmd --list-all
# 只查看开放端口信息
firewall-cmd --list-ports

# 开启端口
# 格式:firewall-cmd --zone=<作用域> --add-port=<端口/通讯协议> --permanent
firewall-cmd --zone=public --add-port=80/tcp --permanent

# 重启防火墙使端口规则生效
systemctl restart firewalld.service

命令含义

  • --zone:设置作用域,指定在哪个防火墙区域生效。
  • --add-port=80/tcp:添加端口规则,格式为:端口号/通讯协议。
  • --permanent:使规则永久生效,即重启后依然有效。

使用这些命令,你可以查看防火墙状态、启动、停止和重启防火墙服务,查看当前规则并开启端口,确保你的系统网络安全性。