linux学习


前言

Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹(Linus Benedict Torvalds)于1991年10月5日首次发布,它主要受到MinixUnix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU操作系统。它支持32位64位硬件,能运行主要的Unix工具软件、应用程序和网络协议。(来源于百度词条)

linux文件目录

linux的文件目录是呈现树状结果的,使用命令先查看linux的根目录文件

ls -l /

根目录

这里面的每个文件都有放置了特定类型的文件

bin 存放系统命令,普通用户和 root 都可以执行。放在 /bin 下的命令在单用户模式下也可以执行
boot 系统启动目录,保存与系统启动相关的文件,如内核文件和启动引导程序(grub)文件等
dev 设备文件保存位置
ect 配置文件保存位置。系统内所有采用默认安装方式(rpm 安装)的服务配置文件全部保存在此目录中,如用户信息、服务的启动脚本、常用服务的配置文件等
home 普通用户的主目录(也称为家目录)。在创建用户时,每个用户要有一个默认登录和保存自己数据的位置,就是用户的主目录,所有普通用户的主目录是在 /home/ 下建立一个和用户名相同的目录。如用户 zhang 的主目录就是 /home/zhang
lib 系统调用的函数库保存位置
lost+found 当系统意外崩溃或意外关机时,产生的一些文件碎片会存放在这里。在系统启动的过程中,fsck 工具会检查这里,并修复已经损坏的文件系统。这个目录只在每个分区中出现,例如,/lost+found 就是根分区的备份恢复目录,/boot/lost+found 就是 /boot 分区的备份恢复目录
media 挂载目录。系统建议用来挂载媒体设备,如软盘和光盘
mnt 挂载目录。早期 Linux 中只有这一个挂载目录,并没有细分。系统建议这个目录用来挂载额外的设备,如 U 盘、移动硬盘和其他操作系统的分区
opt 第三方安装的软件保存位置。这个目录是放置和安装其他软件的位置,手工安装的源码包软件都可以安装到这个目录中。
proc 虚拟文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口
root root 的主目录。普通用户主目录在 /home/ 下,root 主目录直接在“/”下
run 临时的,系统放东西一会就清除
sbin 保存与系统环境设置相关的命令,只有 root 可以使用这些命令进行系统环境设置,但也有些命令可以允许普通用户查看
snap Snap的安装包扩展名是.snap,类似于一个容器,它包含一个应用程序需要用到的所有文件和库(snap包包含一个私有的root文件系统,里面包含了依赖的软件包
srv 服务数据目录。一些系统服务启动之后,可以在这个目录中保存所需要的数据
sys 提供了一个从用户空间通往内核空间的入口,Linux系统中有个 sysfs伪文件系统挂载到/sys目录,通过访问这个目录下面的文件,可以获得各种的系统内核信息,例如设备、内核模块、文件系统等
tmp 临时目录。系统存放临时文件的目录,在该目录下,所有用户都可以访问和写入。建议此目录中不能保存重要数据,最好每次开机都把该目录清空
usr 程序安装在这里. /usr 里的所有文件一般来自Linux distribution;本地安装的程序和其他东西在/usr/local 下
var 用于存储动态数据,例如缓存、日志文件、软件运行过程中产生的文件等

linux文件目录

在每个根目录的子文件下都有一些别的文件

Linux 系统中,所有系统默认的软件都存储在 /usr 目录下

usr

/usr/bin/ 存放系统命令,普通用户和超级用户都可以执行。这些命令和系统启动无关,在单用户模式下不能执行
/usr/sbin/ 存放根文件系统不必要的系统管理命令,如多数服务程序,只有 root 可以使用。
/usr/lib/ 应用程序调用的函数库保存位置
/usr/local/ 手工安装的软件保存位置。我们一般建议源码包软件安装在这个位置
/usr/share/ 应用程序的资源文件保存位置,如帮助文档、说明文档和字体目录
/usr/src/ 源码包保存位置。我们手工下载的源码包和内核源码包都可以保存到这里
/usr/include C/C++ 等编程语言头文件的放置目录

/var 目录用于存储动态数据,例如缓存、日志文件、软件运行过程中产生的文件等

var

/var/lib/ 程序运行中需要调用或改变的数据保存位置。如 MySQL 的数据库保存在 /var/lib/mysql/ 目录中
/var/log/ 登陆文件放置的目录,其中所包含比较重要的文件如 /var/log/messages, /var/log/wtmp 等。
/var/run/ 一些服务和程序运行后,它们的 PID(进程 ID)保存位置
/var/spool/ 里面主要都是一些临时存放,随时会被用户所调用的数据,例如 /var/spool/mail/ 存放新收到的邮件,/var/spool/cron/ 存放系统定时任务。
/var/tmp 一些应用程序在安装或执行时,需要在重启后使用的某些文件,此目录能将该类文件暂时存放起来,完成后再行删除

挂载

指的就是将设备文件中的顶级目录连接到 Linux 根目录下的某一目录,访问此目录就等同于访问设备文件。

比如要访问一个u盘中的文件要先把u盘挂载在根目录下

基本命令使用

命令帮助

查看命令的帮助文档,比如查看ls的用法

方法一:

man ls

方法二:

ls --help

在终端打开

查看登录用户

who

查看当前文件目录

pwd

切换目录

cd [参数] [目标目录路径(相对路径或者时绝对路径)]
  • -P 如果切换的目标目录是一个符号链接,则直接切换到符号链接指向的目标目录
  • -L 如果切换的目标目录是一个符号链接,则直接切换到符号链接名所在的目录
  • cd ..返回上级目录
  • cd ~ 返回登录的用户目录
  • cd /返回根目录

显示当前文件夹下文件

ls [参数]
  • -a 显示所有文件及目录 (包括以“.”开头的隐藏文件)
  • -l 使用长格式列出文件及目录信息
  • -r 将文件以相反次序显示(默认依英文字母次序)
  • -t 根据最后的修改时间排序 -A 同
  • -a ,但不列出 “.” (当前目录) 及 “..” (父目录)
  • -S 根据文件大小排序
  • -R 递归列出所有子目录

创建目录

mkdir [参数] [目录]
  • -m, –mode=模式,设定权限<模式> (类似 chmod),而不是 rwxrwxrwx 减 umask
  • -p, –parents 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后, 系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录;
  • -v, –verbose 每次创建新目录都显示信息

如果要递归创建文件夹不能直接使用

mkdir a/b/c/d

要加上-p才可以

mkdir -p a/b/c/d

创建文件

touch [文件]

创建txt

touch a.txt

创建多文件

touch a b c 

批量创建文件

touch file{1..90}.txt

查看文档内容

cat [参数] [文件]

显示行号

cat -n a.txt
cat -n b.txt

把 a.txt 的文档内容加上行号后输入 b.txt 这个文档里:

touch -n a.txt > b.txt

复制文件

cp [参数] [文件]
  • -f 若目标文件已存在,则会直接覆盖原文件
  • -i 若目标文件已存在,则会询问是否覆盖
  • -p 保留源文件或目录的所有属性
  • -r 递归复制文件和目录
  • -d 当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接 的原始文件或目录
  • -l 对源文件建立硬连接,而非复制文件
  • -s 对源文件建立符号连接,而非复制文件
  • -b 覆盖已存在的文件目标前将目标文件备

把A文件复制到B文件夹下

初始

cp -R A B

复制后

把A中的a b c文件复制到B

cp -r a b c /home/zhang/try/B

移动剪切

mv [参数]
  • -i 若存在同名文件,则向用户询问是否覆盖
  • -f 覆盖已有文件时,不进行任何提示
  • -b 当文件存在时,覆盖前为其创建一个备份
  • -u 当源文件比目标文件新,或者目标文件不存在时,才执行移动此操作

删除

rm [参数] [文件]
  • -f 忽略不存在的文件,不会出现警告信息
  • -i 删除前会询问用户是否操作
  • -r/R递归删除
  • -v 显示指令的详细执行过程 rm 删除文本文件 rm
  • -r 删除文件 rm
  • -f 强制删除

用户和用户组

在linux系统中允许存在多个用户,而且每个用户可以独立运行,且权限不同,每个用户都有唯一的用户名和密码。在登录系统时,只有正确输入用户名和密码,才能进入系统和自己的主目录

用户组是具有相同特征用户的逻辑集合。比如用户a和用户b拥有一样的权限,那么用户a和b就可以分在一个组

用户与用户组之间的关系

  • 一对一:一个用户可以存在一个组中,是组中的唯一成员;
  • 一对多:一个用户可以存在多个用户组中,此用户具有这多个组的共同权限;
  • 多对一:多个用户可以存在一个组中,这些用户具有和组相同的权限;
  • 多对多:多个用户可以存在多个组中,也就是以上 3 种关系的扩展。

在linux中每个用户的id分为两种用户 ID(User ID,简称 UID)和组 ID(Group ID,简称 GID)

每个文件都有自己的拥有者 ID 和群组 ID,当显示文件属性时,系统会根据 /etc/passwd 和 /etc/group 文件中的内容,分别找到 UID 和 GID 对应的用户名和群组名,然后显示出来。

/etc/passwd

/etc/passwd 文件,是系统用户配置文件,存储了系统中所有用户的基本信息,并且所有用户都可以对此文件执行读操作。

每一行对应了一个用户,这里显示了很多用户,这些用户很多都是系统和服务运行必须的用户,称为系统用户

系统用户不能登录,也不能删除

每行用户的含义

用户名:密码:UID(用户ID):GID(组ID):描述性信息:主目录:默认Shell

root用户

root:x:0:0:root:/root:/bin/bash

我自己的用户

zhang:x:1000:1000:23,,,:/home/zhang:/bin/bash

用户名

用户名,就是一串代表用户身份的字符串,用户名仅是为了方便用户记忆,Linux 系统是通过 UID 来识别用户身份,分配用户权限的。/etc/passwd 文件中就定义了用户名和 UID 之间的对应关系。

密码

“x” 表示此用户设有密码,但不是真正的密码,真正的密码保存在 /etc/shadow 文件中,此文件只有 root 用户可以浏览和操作,这样就最大限度地保证了密码的安全。

UID

UID,也就是用户 ID。每个用户都有唯一的一个 UID,Linux 系统通过 UID 来识别不同的用户。

0 超级用户。UID 为 0 就代表这个账号是管理员账号。在 Linux 中,如何把普通用户升级成管理员呢?只需把其他用户的 UID 修改为 0 就可以了,这一点和 Windows 是不同的。不过不建议建立多个管理员账号。
1~499 系统用户(伪用户)。也就是说,此范围的 UID 保留给系统使用。其中,199 用于系统自行创建的账号;100499 分配给有系统账号需求的用户。 其实,除了 0 之外,其他的 UID 并无不同,这里只是默认 500 以下的数字给系统作为保留账户,只是一个公认的习惯而已。
500~65535 普通用户。通常这些 UID 已经足够用户使用了。但不够用也没关系,2.6.x 内核之后的 Linux 系统已经可以支持 232 个 UID 了。

GID

表示用户初始组的组 ID 号

初始组和附加组的含义并不相同

比如现在创建用户chen 就会自动创建一个组chen,这个组就是初始组,如果在把用户chen加到 zhang组里,用户chen就同时有chen和zhang组里的权限

这里看到的ID号是初始组的ID

描述性信息

基本没什么用

我这里显示的23,在登录图形界面的时候显示的就是23

主目录

用户登录后有操作权限的访问目录,通常称为用户的主目录。

默认的shell

Shell 就是 Linux 的命令解释器,是用户和 Linux 内核之间沟通的桥梁。

shell有不同种类,可以参考shell

/etc/shadow

用于存储 Linux 系统中用户的密码信息,又称为“影子文件”

/etc/passwd 文件,由于该文件允许所有用户读取,易导致用户密码泄露,因此 Linux 系统将用户的密码信息从 /etc/passwd 文件中分离出来,并单独放到了此文件中。

这个文件只能由root用户访问

文件中每行代表一个用户,同样使用 “:” 作为分隔符,不同之处在于,每行用户信息被划分为 9 个字段。

用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段

用户名

与etc/passwd一致

加密密码

保存了真正的密码

目前 Linux 的密码采用的是 SHA512 散列加密算法,原来采用的是 MD5 或 DES 加密算法。SHA512 散列加密算法的加密等级更高,也更加安全。

所有伪用户的密码都是 “!!” 或 “*”,代表没有密码是不能登录的。当然,新创建的用户如果不设定密码,那么它的密码项也是 “!!”,代表这个用户没有密码,不能登录。

最后一次修改时间

这里root显示的修改时间是19275,Linux 计算日期的时间是以 1970 年 1 月 1 日作为 1 不断累加得到的时间,到 1971 年 1 月 1 日,则为 366 天。这里显示 19275 天,也就是说,此 root 账号在 1970 年 1 月 1 日之后的第 19275 天修改的 root 用户密码。

使用这个命名可以查看修改时间

date -d "1970-01-01 19275 days"

最小修改时间间隔

最小修改间隔时间,也就是说,该字段规定了从第 3 字段(最后一次修改密码的日期)起,多长时间之内不能修改密码。如果是 0,则密码可以随时修改;如果是 10,则代表密码修改后 10 天之内不能再次修改密码。

密码有效期

经常变更密码是个好习惯,为了强制要求用户变更密码,这个字段可以指定距离第 3 字段(最后一次更改密码)多长时间内需要再次变更密码,否则该账户密码进行过期阶段。
该字段的默认值为 99999,也就是 273 年,可认为是永久生效。如果改为 90,则表示密码被修改 90 天之后必须再次修改,否则该用户即将过期。管理服务器时,通过这个字段强制用户定期修改密码。

密码需要变更前的警告天数

与第 5 字段相比较,当账户密码有效期快到时,系统会发出警告信息给此账户,提醒用户 “再过 n 天你的密码就要过期了,请尽快重新设置你的密码!”。

该字段的默认值是 7,也就是说,距离密码有效期的第 7 天开始,每次登录系统都会向该账户发出 “修改密码” 的警告信息。

密码过期后宽限天数

也称为“口令失效日”,简单理解就是,在密码过期后,用户如果还是没有修改密码,则在此字段规定的宽限天数内,用户还是可以登录系统的;如果过了宽限天数,系统将不再让此账户登陆,也不会提示账户过期,是完全禁用。

比如说,此字段规定的宽限天数是 10,则代表密码过期 10 天后失效;如果是 0,则代表密码过期后立即失效;如果是 -1,则代表密码永远不会失效。

账号失效时间

使用自 1970 年 1 月 1 日以来的总天数作为账户的失效时间。该字段表示,账号在此字段规定的时间之外,不论你的密码是否过期,都将无法使用!

该字段通常被使用在具有收费服务的系统中。

保留字段

目前没有什么功能

/etc/group

/ect/group 文件是用户组配置文件,即用户组的所有信息都存放在此文件中。

每一行代表了一个组,分为 4 个字段,每个字段对应的含义为

组名:密码:GID:该用户组中的用户列表

组名

用户组的名称,有字母或数字构成。同 /etc/passwd 中的用户名一样,组名也不能重复。

密码

和 /etc/passwd 文件一样,这里的 “x” 仅仅是密码标识,真正加密后的组密码默认保存在 /etc/gshadow 文件中。

不过,用户设置密码是为了验证用户的身份,那用户组设置密码是用来做什么的呢?用户组密码主要是用来指定组管理员的,由于系统中的账号可能会非常多,root 用户可能没有时间进行用户的组调整,这时可以给用户组指定组管理员,如果有用户需要加入或退出某用户组,可以由该组的组管理员替代 root 进行管理。但是这项功能目前很少使用,我们也很少设置组密码。如果需要赋予某用户调整某个用户组的权限,则可以使用 sudo 命令代替。

GID

就是群组的 ID 号,Linux 系统就是通过 GID 来区分用户组的,同用户名一样,组名也只是为了便于管理员记忆。

这里的组 GID 与 /etc/passwd 文件中第 4 个字段的 GID 相对应,实际上,/etc/passwd 文件中使用 GID 对应的群组名,就是通过此文件对应得到的。

用户列表

此字段列出每个群组包含的所有用户。需要注意的是,如果该用户组是这个用户的初始组,则该用户不会写入这个字段,可以这么理解,该字段显示的用户都是这个用户组的附加用户。

比如root用户没有附加组,只属于自己的初始组,参数就是空

每个用户都可以加入多个附加组,但是只能属于一个初始组。所以我们在实际工作中,如果需要把用户加入其他组,则需要以附加组的形式添加。

这三个文件之间的关系可以这样理解,即先在 /etc/group 文件中查询用户组的 GID 和组名;然后在 /etc/passwd 文件中查找该 GID 是哪个用户的初始组,同时提取这个用户的用户名和 UID;最后通过 UID 到 /etc/shadow 文件中提取和这个用户相匹配的密码。

新用户添加删除

使用useradd添加用户

当使用 useradd 命令不加参数选项,后面直接跟所添加的用户名时,系统首先会读取配置 文件/etc/login.defs 和/etc/default/useradd 文件中所配置的信息建立用户的家目录,并 复制/etc/skel 中的所有文件(包括隐藏的环境配置文件)到新用户的家目录中。

useradd [选项] [用户名]
  • -m 新用户名
  • -c 添加备注信息
  • -d 指定有效家目录
  • -g 指定用户组
  • -G 指定附加组
  • -n 取消以用户为名的组
  • -s 指定登录 shell
  • -u 指定用户 ID

使用userdel删除用户

userdel [选项] [用户名]

删除用户会把该用户的记录从系统文件etc/passwd中删除掉,同时删除掉相应的家目录

  • -r 同时删除主目录

创建用户后可以在etc/passwd文件中查看

更改用户信息

可以更改的用户信息包括用户的有关属性,如用户号、主目录、用户组、登录 Shell 等

修改已有用户的信息使用 usermod 命令

usermod [选项] [用户名]

显示当前用户的信息:

  • who 查询当前在线用户
  • w 查询当前在线用户的详细信息
  • groups 查询用户所属的组
  • id 显示用户 ID 信息

密码管理

我们在创建新的用户的时候是没有设定密码的,因此还不能用来登录系统

passwd语法:

passwd [选项] 用户名
  • -S:查询用户密码的状态,也就是 /etc/shadow 文件中此用户密码的内容。仅 root 用户可用;
  • -l:暂时锁定用户,该选项会在 /etc/shadow 文件中指定用户的加密密码串前添加 “!”,使密码失效。仅 root 用户可用;
  • -u:解锁用户,和 -l 选项相对应,也是只能 root 用户使用;
  • –stdin:可以将通过管道符输出的数据作为用户的密码。主要在批量添加用户时使用;
  • -n 天数:设置该用户修改密码后,多长时间不能再次修改密码,也就是修改 /etc/shadow 文件中各行密码的第 4 个字段;
  • -x 天数:设置该用户的密码有效期,对应 /etc/shadow 文件中各行密码的第 5 个字段;
  • -w 天数:设置用户密码过期前的警告天数,对于 /etc/shadow 文件中各行密码的第 6 个字段;
  • -i 日期:设置用户密码失效日期,对应 /etc/shadow 文件中各行密码的第 7 个字段

给刚新建的用户设置密码

组管理

添加用户组

groupadd语法:

groupadd [选项] [用户组]
  • -g GID:指定组 ID

例子:

groupadd -g 1010 group1

创建一个新组,标识号是1010

gpasswd管理组

为了避免系统管理员(root)太忙碌,无法及时管理群组,我们可以使用 gpasswd 命令给群组设置一个群组管理员,代替 root 完成将用户加入或移出群组的操作。

gpasswd语法:

gpasswd [选项] [组名]
  • -A 定义组管理员列表
  • -a 添加组成员,每次只能加一个
  • -d 删除组成员,每次只能删一个
  • -M 定义组成员列表,可设置多个,用“,”分开——定义的组成员必须是已存在 用户的
  • -r 移除密码

例子:

gpasswd -a ubuntu group1

新建一个ubuntu用户,并将这个用户添加到group1组中

删除用户组

groupdel语法:

groupdel [用户组]

例子:

groupdel group1

删除group1组

修改用户组属性

groupmod语法:

groupmod [选项] [用户组]
  • -g GID 为用户组指定新的组标识号。
  • -o 与-g 选项同时使用,用户组的新 GID 可以与系统已有用户组的 GID 相同。
  • -n 新用户组 将用户组的名字改为新名字

例子:

groupmod -g 1020 -n group2 group1

把用户组group1的标识符改为1020,并把名字更改为group2

文件属性与权限

文件类型查看

使用命令ls -l时会罗列出每个文件的详细信息

分别代表的意思:

文件类型、文件权限、硬连接数、文件属主、文件属组、文件大小、更动时间、文件名

开头的字母代表的时文件类型:

  • -:表示一般文件
  • d:表示目录
  • l:表示软链接
  • p:进程间相互通信的文件,Linux 拥有一些机制来允许进程间的互相通信,这些 机制称为进程间通信机制,管道(pipe)、命名管道(FIFO)、共享缓冲区、信号量、sockets 信号等都是进程间常用通信机制,pipe 是用于父进程和子进程之间通信。FIFO 是一个文件, 允许运行在同一台计算机的进程间进行通信。
  • s:表示 socket 通信套接字文件(通常用于网络数据连接)
  • c:表示字符设备文件(如:键盘、鼠标、终端等,通常放在/dev 下)
  • b:表示块设备文件(存储数据设备文件,如:硬盘)

文件权限

读权限 r:允许查看文件内容,使用 4 表示

写权限 w:允许修改文件内容,使用 2 表示

可执行 x:允许运行程序,使用 1 表示

无权限 -:使用 0 表示

由于这 9 个字符分属 3 类用户,因此每种用户身份包含 3 个权限(r、w、x),通过将 3 个权限对应的数字累加,最终得到的值即可作为每种用户所具有的权限。

drwxrw-r-x

所有者 = rwx = 4+2+1 = 7
所属组 = rw- = 4+2 = 6
其他人 = r-x = 4+1 = 5

所以这个权限就是765

drwxr-xr-x 意思是一个权限为 755 的目录 -rw-r–r– 意思是一个权限为 644 的文件

文件属主->属于的用户账号

文件属组->属于的用户组

修改文件权限

chmod语法:

chmod [-R] [ugoa] [+-=] [rwx] 参数
  • -R(注意是大写)选项表示连同子目录中的所有文件,也都修改设定的权限。
  • u 属主 g 属组 o 其他人 a 所有人
  • +添加 - 删除 = 重置

文件的基本权限就是 3 种用户身份(所有者、所属组和其他人)搭配 3 种权限(rwx),chmod 命令中用 u、g、o 分别代表 3 种身份,还用 a 表示全部的身份(all 的缩写)。另外,chmod 命令仍使用 r、w、x 分别表示读、写、执行权限。

实例


文章作者: zhang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 zhang !
  目录