Day47——Linux入门学习1

Linux入门之路

文章目录

    • Linux入门之路
      • 登入 linux
      • 文本模式下指令的下达
        • 下达指令
        • 重要的几个热键
      • Linux系统目录
        • 常见一级目录及功能
      • Linux 文件权限概念
        • Linux 文件属性
        • 如何改变文件属性与权限
      • 目录与路径
        • 相对路径与绝对路径
        • 目录的相关操作
      • 文件与目录管理
        • 文件与目录的查看
        • 复制、删除与移动: cp, rm, mv
          • cp (复制文件或目录)
          • rm (移除文件或目录)
          • mv (移动文件与目录,或更名)
      • Linux 账号管理
        • Linux 的账号与群组
          • 使用者标识符: UID 与 GID
          • /etc/passwd 文件结构
          • /etc/shadow 文件结构
        • 账号管理
          • 新增与移除使用者
          • 修改用户
          • 删除用户

登入 linux

在安装时,我门选择了rhel7 ,且有安装GUI,所以使用时会有图形界面的产生,不过也有纯文本的环境可以切换~

  • 通常我们也称文本模式为终端机接口, terminal 或 console
  • Linux 预设的情况下会提供六个 Terminal 来让使用者登入, 切换的方式为使用:[Ctrl] + [Alt] + [F1]~[F6]的组合按钮
  • 系统会将[F1] ~ [F6]命名为 tty1 ~ tty6 的操作接口环境
  • 如何回到刚刚的有图形的窗口接口?按下[Ctrl] + [Alt] + [F1]

登陆,打开终端:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tBbHcrQe-1584950648274)(D:\environment\44.20-3-21linux\Linux.assets\1584773711515.png)]

最左边的 feng显示的是『目前用户的账号』,而@之后接的 server则是『主机名』,至于最右边的~则指的是 『目前所在的目录』,那个$则是我们常常讲的『提示字符』

提示:

那个~ 符号代表的是『用户的家目录』的意思,他是个『变量!』

举例来说,root 的家目录在/root, 所以 ~就代表/root 的意思

在 Linux 当中,默认 root 的提示字符为 # ,而一般身份用户的提示字符为 $

文本模式下指令的下达

我们都是透过『程序』在跟系统作沟通的,上面提到的窗口管理员或文本模式都是一组或一 只程序在负责我们所想要完成的任务。

文本模式登入后所取得的程序被称为壳(Shell),这是因为这支程序负责最外面跟使用者(我们)沟通,所以才被戏称为壳程序!

下达指令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9NFzfGgV-1584950648275)(D:\environment\44.20-3-21linux\Linux.assets\1584774184818.png)]

指令详细说明:

  • 一行指令中第一个输入的部分绝对是『指令(command)』或『可执行文件案(例如批次脚本,script)』
  • command 为指令的名称,例如变换工作目录的指令为 cd 等等
  • 中刮号[]并不存在于实际的指令中,而加入选项设定时,通常选项前会带 - 号,例如 -h;有时候会使用选 项的完整全名,则选项前带有 – 符号,例如 --help
  • parameter1 parameter2… 为依附在选项后面的参数,或者是 command 的参数
  • 以空格来区分这些内容,但不论几个空格,shell都看作一格
  • 执行就是[Enter]键
  • 指令太长的时候,可以使用反斜杠 () 来跳脱[Enter]符号,使指令连续到下一行
  • 英文大小写字母在Linux系统中时不一样的

重要的几个热键

  • [Tab]按键
    • 具有『命令补全』与『文件补齐』的功能
    • 试验下,输入mk加两次tab键

Day47——Linux入门学习1_第1张图片

所有以 mk为开头的指令都被显示出来~

记住:

[Tab] 接在一串指令的第一个字的后面,则为『命令补全』!

[Tab] 接在一串指令的第二个字以后时,则为『文件补齐』!

  • [ctrl]+c按键
    • 想让当前的程序『停掉』的话,可以输入[ctrl]+c是中断目前程序
  • [ctrl]-d按键
    • 键盘输入结束的意思

Linux系统目录

在 Linux 或 Unix 操作系统中,所有的文件和目录都被组织成以一个根节点开始的倒置的树状结构。

Day47——Linux入门学习1_第2张图片

执行命令后可看到这些目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HzxjkEmI-1584950648277)(D:\environment\44.20-3-21linux\Linux.assets\1584775103989.png)]

文件系统的最顶层是由根目录开始的,系统使用 / 来表示根目录。在根目录之下的既可以是目录,也可以是文件,而每一个目录中又可以包含子目录文件。如此反复就可以构成一个庞大的文件系统。

在Linux文件系统中有两个特殊的目录,一个用户所在的工作目录,也叫当前目录,可以使用一个点 . 来表示;另一个是当前目录的上一级目录,也叫父目录,可以使用两个点 来表示。

  • . :代表当前的目录,也可以使用 ./ 来表示;
  • … :代表上一层目录,也可以 …/ 来代表。

如果一个目录或文件名以一个点 . 开始,表示这个目录或文件是一个隐藏目录或文件(如:.bashrc)。即以默认方式查找时,不显示该目录或文件。

常见一级目录及功能

/bin 、 /sbin——存放基本命令
/boot——存放启动文件
/dev ——存放各种设备文件
/etc——存放各种配置文件
/usr——存放共用的、只读的用户数据
/root ——管理员root的家目录
/home——各种普通用户的家目录
/tmp——存放各种临时文件
/var——存放经常变化的数据或文件,日志也在
/proc ——存放内存中的映射数据,不占用内存

Linux 文件权限概念

Linux 文件属性

将登录用户的身份切换成root之后,执行ls -al命令:

Day47——Linux入门学习1_第3张图片

ls 是『list』的意思,重点在显示文件的文件名与相关属性。而选项『-al』则表示列出所有的文件详细的权限与属性 (包含隐藏文件,就是文件名第一个字符为『 . 』的文件)

上图说明下文件属性:

Day47——Linux入门学习1_第4张图片

  • 第一栏代表这个文件的类型与权限(permission):

    • 栏中存在10个字符
      • 第一个是文件类型
        • 当为[ d ]则是目录,当为[ - ]则是文件,若是[ l ]则表示为连结档(link file),若是[ b ]则表示为装置文件里面的可供储存的接口设备,若是[ c ]则表示为装置文件里面的串行端口设备
      • 第二至四位说明的是文件拥有者的权限(r:读,w:写,x:执行,如果没有权限给减号-就行)
      • 第五到七位说明的是文件所属群组的权限,(rwx的含义与上面一样)
      • 第八到十位说明其他人的权限(rwx含义与上面一样)
  • 第二栏表示有多少档名连结到此节点(i-node):

    • 每个文件都会将他的权限与属性记录到文件系统的 i-node 中,不过,我们使用的目录树却是使用文件名来记录, 因此每个档名就会连结到一个 i-node ;这个属性记录的,就是有多少不同的档名连结 到相同的一个 i-node 号码
  • 第三栏表示这个文件(或目录)的『拥有者账号』

  • 第四栏表示这个文件的所属群组

    • 如,AA和BB是一组,AA有拥有这个文件可读可写可执行,那BB可以如何操作呢?那根据第一栏中第五至七位的权限来决定嘛~
  • 第五栏为这个文件的容量大小,默认单位为 bytes

  • 第六栏为这个文件的建档日期或者是最近的修改日期

  • 第七栏为这个文件的档名

    • 比较特殊的是:如果档名之前多一个『 . 』,则代表这个文件为『隐藏文件』
    • 使用『ls』及『ls -a』这两个指令,就可以看到隐藏文件和普通文件的区别了

与Windows 系统不一样的是,在 Linux 系统当中,每一个文件都多加了很多的属性进来,尤其是群组的概念,这样有什么用途呢? 其实,最大的用途是在『数据安全性』!

因此,在你修改你的 linux 文件与目录的属性之前,一定要先搞清楚, 什么数据是可变的,什么是不可变的!

如何改变文件属性与权限

几个常用的群组,拥有者和各种身份的权限修改的命令

  • chgrp:改变文件所属群组
  • chown:改变文件拥有者
  • chmod:改变文件权限,SUID,SGID,SBIT…的特性

实验一:那么在你的家目录内有一个名为 initial-setup-ks.cfg 的文件, 如何将 该文件的群组改变一下呢?假设你已经知道在/etc/group 里面已经存在一个名为 users 的群组, 但是 testing 这个群组名字就不存在/etc/group 当中了,此时改变群组成为 users 与 testing会发生什么?

先试试将Group名改成users:

Day47——Linux入门学习1_第5张图片

改了以后显示一下改成功与否~

再试试改为testing,发现,,无效组:testing

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SBgUqNO4-1584950961601)(1584777834110.png)]

所以!请记得,要被改变的组名必须要在/etc/group 文件内存在才行,否则就会显示错误!


实验二:改变一个文件的拥有者呢?

一样要注意的是, 用户必须是已经存在系统中的账号,也就是在/etc/passwd 这个文件中有纪录的用户名称才能改变。

chown 还可以顺便直接修改群组的名称呢!此外,如果要连目录下的所有次目录或文件同时更改文件拥有者的话,直接加上 -R 的选项即可~

将 initial-setup-ks.cfg 的拥有者改为 feng这个账号:

Day47——Linux入门学习1_第6张图片

在此之前,initial-setup-ks.cfg文件的拥有者与群组被我设置为feng,将 initial-setup-ks.cfg 的拥有者与群组改回为 root:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qhH5SACY-1584950648279)(D:\environment\44.20-3-21linux\Linux.assets\1584778339363.png)]

更改:

Day47——Linux入门学习1_第7张图片


实验三:改变权限

chmod 这个指令,权限的设定方法有两种,分别可以使用数字或者 是符号来进行权限的变更。

  • 数字类型改变文件权限

可以使用数字来代表各个权限,各权限的分数对照表如下:

r:4 w:2 x:1

每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,

例如当权限为: [-rwxrwx—] 分数则是:

owner = rwx = 4+2+1 = 7

group = rwx = 4+2+1 = 7

others= — = 0+0+0 = 0

该文件的权限数字就是 770 ,

变更权限的指令 chmod 的语法:chmod [-R] xyz 文件或目录

对.bashrc文件进行实验:

Day47——Linux入门学习1_第8张图片

  • 符号类型改变文件权限

可以由 u, g, o 来代表三种身份的权限!此外, a 则代表 all 亦即全部 的身份!那么读写的权限就可以写成 r, w, x ~

Day47——Linux入门学习1_第9张图片

实验一下:

要设定一个文件的权限成为『-rwxr-xr-x』时

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yAm9n7mc-1584950648281)(D:\environment\44.20-3-21linux\Linux.assets\1584779115970.png)]

要是想给所有使用这个文件的人都能够写入的权限:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vv08FQ4C-1584950648281)(D:\environment\44.20-3-21linux\Linux.assets\1584779284890.png)]

如果是要将权限去掉而不更动其他已存在的权限呢?例如要拿掉全部人的可执行权限,则

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Np7U60iG-1584950648281)(D:\environment\44.20-3-21linux\Linux.assets\1584779328729.png)]


目录与路径

相对路径与绝对路径

  • 绝对路径:路径的写法『一定由根目录 / 写起』,例如: /usr/share/doc 这个目录
  • 相对路径:路径的写法『不是由 / 写起』,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成: 『cd …/man』这就是相对路径的写法啦!相对路径意指『相对于目前工作目录的路径!』

目录的相关操作

特殊目录:

  • .:代表此层目录

  • ..:代表上一层目录

  • -:代表前一个工作目录

  • ~:代表(目前用户身份)所在的家目录

常见处理目录的命令:

  • cd:变换目录
  • pwd:显示当前目录
  • mkdir:建立一个新的目录
  • rmdir:删除一个空的目录

实验一下:

目录的进入:

[root@server1 ~]# cd ~feng
[root@server1 feng]# cd ~
[root@server1 ~]# cd
[root@server1 ~]# cd ..
[root@server1 /]# cd -
/root

绝对路径与相对路径:

[root@server1 ~]# cd /var/spool/mail
[root@server1 mail]# cd ../postfix

我们由/var/spool/mail 去到/var/spool/postfix 就这样写,前提:必须要确认你是在/var/spool/mail 当中,并且知道在/var/spool 当中有个 postfix 的目录才行啊~ 这样才能使用


实验二:pwd (显示目前所在的目录)

[root@server1 ~]# pwd [-P] 
选项与参数: -P :显示出确实的路径,而非使用链接 (link) 路径

单纯显示出目前的工作目录:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZBiD2OX2-1584950648281)(D:\environment\44.20-3-21linux\Linux.assets\1584780639265.png)]

显示出实际的工作目录,而非链接文件本身的目录名而已:

[root@server1 ~]# cd /var/mail
[root@server1 mail]# pwd
/var/mail        列出目前的工作目录
[root@server1 mail]# pwd -P
/var/spool/mail
[root@server1 mail]# ls -ld /var/mail
lrwxrwxrwx. 1 root root 10 Mar 19 20:03 /var/mail -> spool/mail
因为 /var/mail 是连结档,连结到 /var/spool/mail
所以,加上 pwd -P 的选项后,会不以连结文件的数据显示,而是显示正确的完整路径啊!

-P 的选项:他可以让我们取得正确的目录名称,而不是以链接文件的路径来显示的


实验三:mkdir (建立新目录)

[root@study ~]# mkdir [-mp] 目录名称 
选项与参数: 
-m :配置文件案的权限喔!直接设定,不需要看预设权限 (umask) 的脸色~ 
-p :帮助你直接将所需要的目录(包含上层目录)递归建立起来!

请到/tmp 底下尝试建立数个新目录看看:

[root@server1 mail]# cd /tmp
[root@server1 tmp]# mkdir test
[root@server1 tmp]# mkdir test1/test2/test3/test4
mkdir: cannot create directory ‘test1/test2/test3/test4’: No such file or directory
[root@server1 tmp]# mkdir -p test1/test2/test3/test4
加了这个 -p 的选项,可以自行帮你建立多层目录

建立权限为 rwx–x--x 的目录:

[root@server1 tmp]# mkdir -m 711 test2
[root@server1 tmp]# ls -ld test*
drwxr-xr-x. 2 root root  6 Mar 21 16:58 test
drwxr-xr-x. 3 root root 19 Mar 21 16:59 test1
drwx--x--x. 2 root root  6 Mar 21 17:00 test2
如果没有加上 -m 来强制设定属性,系统会使用默认属性

实验四:rmdir (删除『空』的目录)

[root@study ~]# rmdir [-p] 目录名称 
选项与参数: 
-p :连同『上层』『空的』目录也一起删除

将于 mkdir 范例中建立的目录(/tmp 底下)删除掉!:

[root@server1 tmp]# rmdir test
[root@server1 tmp]# rmdir test1
rmdir: failed to remove ‘test1’: Directory not empty
[root@server1 tmp]# rmdir -p test1/test2/test3/test4
[root@server1 tmp]# ls -ld test*
drwx--x--x. 2 root root 6 Mar 21 17:00 test2
利用 -p 这个选项,立刻就可以将 test1/test2/test3/test4 一次删除
rmdir 仅能『删除空的目录』

文件与目录管理

关于文件的一些基本管理

文件与目录的查看

[root@study ~]# ls [-aAdfFhilnrRSt] 文件名或目录名称.. [root@study ~]# ls [--color={never,auto,always}] 文件名或目录名称.. 
[root@study ~]# ls [--full-time] 文件名或目录名称..
选项与参数: 
-a :全部的文件,连同隐藏档( 开头为 . 的文件) 一起列出来(常用)
-d :仅列出目录本身,而不是列出目录内的文件数据(常用)
-l :长数据串行出,包含文件的属性与权限等等数据;(常用)
-S :以文件容量大小排序,而不是用档名排序;
--color=auto :让系统自行依据设定来判断是否给予颜色
--full-time :以完整时间模式 (包含年、月、日、时、分) 输出

实验一:

将家目录下的所有文件列出来(含属性与隐藏文件)

[root@server1 ~]# ls -al ~
total 48
dr-xr-x---.  5 root root  273 Mar 21 16:43 .
dr-xr-xr-x. 17 root root  224 Mar 19 20:10 ..
-rw-------.  1 root root 1866 Mar 19 20:11 anaconda-ks.cfg
-rw-------.  1 root root 1158 Mar 21 16:37 .bash_history
-rw-r--r--.  1 root root   18 Dec 29  2013 .bash_logout
-rw-r--r--.  1 root root  176 Dec 29  2013 .bash_profile
-rw-r--r--.  1 root root  176 Dec 29  2013 .bashrc
drwx------.  4 root root   31 Mar 19 20:13 .cache
drwx------.  4 root root   30 Mar 19 20:13 .config
-rw-r--r--.  1 root root  100 Dec 29  2013 .cshrc
drwx------.  3 root root   25 Mar 19 20:12 .dbus
-rw-r--r--.  1 root root 1942 Mar 19 20:12 initial-setup-ks.cfg
-rw-r--r--.  1 root root  129 Dec 29  2013 .tcshrc
-rw-r--r--.  1 root root   17 Mar 21 11:03 test
-rw-------.  1 root root 1045 Mar 21 11:03 .viminfo
-rw-------.  1 root root  104 Mar 21 09:30 .xauthrR8nM2
-rw-------.  1 root root  104 Mar 21 16:37 .xauthTN9rsS
目录文件文件名都是以深蓝色显示

承上题,不显示颜色,但在文件名末显示出该文件名代表的类型(type)

[root@server1 ~]# ls -alF --color=never ~
total 48
dr-xr-x---.  5 root root  273 Mar 21 16:43 ./
dr-xr-xr-x. 17 root root  224 Mar 19 20:10 ../
-rw-------.  1 root root 1866 Mar 19 20:11 anaconda-ks.cfg
-rw-------.  1 root root 1158 Mar 21 16:37 .bash_history
-rw-r--r--.  1 root root   18 Dec 29  2013 .bash_logout
-rw-r--r--.  1 root root  176 Dec 29  2013 .bash_profile
-rw-r--r--.  1 root root  176 Dec 29  2013 .bashrc
drwx------.  4 root root   31 Mar 19 20:13 .cache/
drwx------.  4 root root   30 Mar 19 20:13 .config/
-rw-r--r--.  1 root root  100 Dec 29  2013 .cshrc
drwx------.  3 root root   25 Mar 19 20:12 .dbus/
-rw-r--r--.  1 root root 1942 Mar 19 20:12 initial-setup-ks.cfg
-rw-r--r--.  1 root root  129 Dec 29  2013 .tcshrc
-rw-r--r--.  1 root root   17 Mar 21 11:03 test
-rw-------.  1 root root 1045 Mar 21 11:03 .viminfo
-rw-------.  1 root root  104 Mar 21 09:30 .xauthrR8nM2
-rw-------.  1 root root  104 Mar 21 16:37 .xauthTN9rsS
目录的都带/

完整的呈现文件的修改时间 (modification time)

[root@server1 ~]# ls -al --full-time ~
total 48
dr-xr-x---.  5 root root  273 2020-03-21 16:43:45.703317664 +0800 .
dr-xr-xr-x. 17 root root  224 2020-03-19 20:10:53.560036193 +0800 ..
-rw-------.  1 root root 1866 2020-03-19 20:11:42.494039079 +0800 anaconda-ks.cfg
-rw-------.  1 root root 1158 2020-03-21 16:37:51.943301671 +0800 .bash_history
-rw-r--r--.  1 root root   18 2013-12-29 10:26:31.000000000 +0800 .bash_logout
-rw-r--r--.  1 root root  176 2013-12-29 10:26:31.000000000 +0800 .bash_profile
-rw-r--r--.  1 root root  176 2013-12-29 10:26:31.000000000 +0800 .bashrc
drwx------.  4 root root   31 2020-03-19 20:13:36.122005699 +0800 .cache
drwx------.  4 root root   30 2020-03-19 20:13:36.133005700 +0800 .config
-rw-r--r--.  1 root root  100 2013-12-29 10:26:31.000000000 +0800 .cshrc
drwx------.  3 root root   25 2020-03-19 20:12:11.506000708 +0800 .dbus
-rw-r--r--.  1 root root 1942 2020-03-19 20:12:36.727002195 +0800 initial-setup-ks.cfg
-rw-r--r--.  1 root root  129 2013-12-29 10:26:31.000000000 +0800 .tcshrc
-rw-r--r--.  1 root root   17 2020-03-21 11:03:33.956235801 +0800 test
-rw-------.  1 root root 1045 2020-03-21 11:03:33.957235801 +0800 .viminfo
-rw-------.  1 root root  104 2020-03-21 09:30:16.780017445 +0800 .xauthrR8nM2
-rw-------.  1 root root  104 2020-03-21 16:37:57.923301941 +0800 .xauthTN9rsS
上面的『时间』字段变了!变成较为完整的格式

复制、删除与移动: cp, rm, mv

cp (复制文件或目录)
[root@study ~]# cp [-adfilprsu] 来源文件(source) 目标文件(destination) 
[root@study ~]# cp [options] source1 source2 source3 .... directory 
选项与参数: 
-a :相当于 -dr --preserve=all 的意思;(常用)
-i :若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
-p :连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性(备份常用);
-r :递归持续复制,用于目录的复制行为;(常用)

复制(cp)这个指令是非常重要的,不同身份者执行这个指令会有不同的结果产生,尤其是那个-a, -p 的 选项, 对于不同身份来说,差异则非常的大

实验一:

用 root 身份,将家目录下的 .bashrc 复制到 /tmp 下,并更名为 bashrc

[root@server1 ~]# cp ~/.bashrc /tmp/bashrc
[root@server1 ~]# cp -i ~/.bashrc /tmp/bashrc
cp: overwrite ‘/tmp/bashrc’? n
重复作两次动作,由于 /tmp 底下已经存在 bashrc 了,加上 -i 选项后,
则在覆盖前会询问使用者是否确定!可以按下 n 或者 y 来二次确认呢

变换目录到/tmp,并将/var/log/wtmp 复制到/tmp 且观察属性:

[root@server1 ~]# cd /tmp
[root@server1 tmp]# cp /var/log/wtmp .
[root@server1 tmp]# ls -l /var/log/wtmp wtmp
-rw-rw-r--. 1 root utmp 23808 Mar 21 15:17 /var/log/wtmp
-rw-r--r--. 1 root root 23808 Mar 21 17:25 wtmp
想要复制到当前目录,最后的 . 不要忘!
发现复制过来的文件权限会改变~

那如果你想要将文件的所有特性都一起复制过来该怎办?可以加上 -a

oot@server1 tmp]# ls -l /var/log/wtmp wtmp_2
-rw-rw-r--. 1 root utmp 23808 Mar 21 15:17 /var/log/wtmp
-rw-rw-r--. 1 root utmp 23808 Mar 21 15:17 wtmp_2
这样,特性一样

在预设的条件中, cp 的来源文件与目的文件的权限是不同的,目的文件的拥有者通常会是指令操作者本身。如,上面的二步骤中,由于我是 root 的身份,因此复制过来的文件拥有者与群组就改变成为 root 所有了!

由于具有这个特性,因此当我们在进行备份的时候,某些需要特别注意的特殊权限文件, 例如密码文件 (/etc/shadow) 以及一些配置文件,就不能直接以 cp 来复制,而必须要加上 -a 或者是 -p 等等 可以完整复制文件权限的选项才行!

继续,复制 /etc/ 这个目录下的所有内容到 /tmp 底下:

cp: omitting directory ‘/etc/’
[root@server1 tmp]# cp -r /etc/ /tmp
也可以利用 cp -a /etc /tmp 来下达指令喔!尤其是在备份的情况下

rm (移除文件或目录)
[root@study ~]# rm [-fir] 文件或目录 
选项与参数: 
-f :就是 force 的意思,忽略不存在的文件,不会出现警告讯息; 
-i :互动模式,在删除前会询问使用者是否动作 
-r :递归删除啊!最常用在目录的删除了!这是非常危险的选项!!!

实验一:

将刚刚在 cp 的范例中建立的 bashrc 删除掉!

[root@server1 ~]# cd /tmp
[root@server1 tmp]# rm -i bashrc
rm: remove regular file ‘bashrc’? y
如果加上 -i 的选项就会主动询问

将 cp 例中所建立的 /tmp/etc/ 这个目录删除掉

[root@server1 tmp]# rmdir /tmp/etc
rmdir: failed to remove ‘/tmp/etc’: Directory not empty
[root@server1 tmp]# rm -r /tmp/etc
rm: descend into directory ‘/tmp/etc’? y
rm: remove regular file ‘/tmp/etc/fstab’? ^C   按下 [crtl]+c 中断
因为身份是 root ,预设已经加入了 -i 的选项,所以你要一直按 y 才会删除
如果确定要删除掉此目录而不要询问,可以这样做
[root@server1 tmp]# \rm -r /tmp/etc

删除一个带有 - 开头的文件

[root@server1 tmp]# touch ./-aaa-
[root@server1 tmp]# ls -l
-rw-r--r--.   1 root root     0 Mar 21 17:47 -aaa-
[root@server1 tmp]# rm -aaa-   因为 "-" 是选项!所以系统误判了
rm: invalid option -- 'a'
Try 'rm ./-aaa-' to remove the file ‘-aaa-’.
Try 'rm --help' for more information.
[root@server1 tmp]# rm ./-aaa-
rm: remove regular empty file ‘./-aaa-’? y

mv (移动文件与目录,或更名)
[root@study ~]# mv [-fiu] source destination 
[root@study ~]# mv [options] source1 source2 source3 .... directory 
选项与参数: 
-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖; 
-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖! 
-u :若目标文件已经存在,且 source 比较新,才会更新 (update)

实验:

复制一文件,建立一目录,将文件移动到目录中

[root@server1 ~]# cd /tmp
[root@server1 tmp]# cp ~/.bashrc bashrc
[root@server1 tmp]# mkdir mvtest
[root@server1 tmp]# mv bashrc mvtest

将刚刚的目录名称更名为 mvtest2

[root@server1 tmp]# mv mvtest mvtest2

再建立两个文件,再全部移动到 /tmp/mvtest2 当中

[root@server1 tmp]# cp ~/.bashrc bashrc1
[root@server1 tmp]# cp ~/.bashrc bashrc2
[root@server1 tmp]# mv bashrc1 bashrc2 mvtest2
如果有多个来源文件或目录,则最后一个目标文件一定是『目录!』

Linux 账号管理

Linux 的账号与群组

使用者标识符: UID 与 GID

每一个文件都具有『拥有人与拥有群组』 的属性,每个登入的使用者至少都会取得两个 ID ,一个是使用者 ID (User ID ,简称 UID)、一个是群组 ID (Group ID ,简称 GID)。

那么文件如何判别他的拥有者与群组呢?其实就是利用 UID 与 GID !每一个文件都会有所谓的拥有者 ID 与拥有群组 ID ,当我们有要显示文件属性的需求时,系统会依据 /etc/passwd 与 /etc/group 的内容, 找到 UID / GID 对应的账号与组名再显示出来

例子:

  1. 先察看一下,系统里面有没有一个名为 feng(自己的username)的用户?
[root@server1 ~]# id feng
uid=1000(feng) gid=1000(feng) groups=1000(feng)
[root@server1 ~]# 
[root@server1 ~]# ll -d /home/feng
drwx------. 15 feng feng 4096 Mar 22 02:15 /home/feng
  1. 修改一下,将刚刚我们的 feng 的 1000 UID 改为 2000 看看:
[root@server1 ~]# vim /etc/passwd

..........
feng:x:2000:1000:feng:/home/feng:/bin/bash
[root@server1 ~]# ll -d /home/feng
drwx------. 15 1000 feng 4096 Mar 22 02:15 /home/feng
因为我们乱改,所以导致 1000 找不到对应的账号,因此显示数字
  1. 记得将刚刚的 2000 改回来

上面的例子仅是在说明 UID 与账号的对应性,在一部正常运作的 Linux 主机 环境下,上面的动作不可随便进行, 这是因为系统上已经有很多的数据被建立存在了,随意修改系统上某些账号的 UID 很可能会导致某些程序无法进行。

跟使用者账号有关的有两个非常重要的文件,一个是管理使用者 UID/GID 重要参数的 /etc/passwd ,一个则是专门管理密码相关数据的 /etc/shadow

/etc/passwd 文件结构

这个文件的构造是这样的:每一行都代表一个账号,有几行就代表有几个账号在你的系统中! 不过需要特别留意的是,里头很多账号本来就是系统正常运作所必须要的,我们可以简称他为系统账号,不要随意删掉!

[root@server1 ~]# head -n 4 /etc/passwd 展示这个文件内前4行内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

每一行使用:分隔开,依次说明

  • 账号名称:需要用来对应 UID
  • 密码:早期Unix放在这个字段上,现在为了安全放在/etc/shadow,这里看到x
  • UID:0为系统管理员;1999为系统账号,100060000为可登入账号
  • GID:这个与 /etc/group 有关
  • 用户信息说明栏:用来解释这个账号的意义
  • 家目录:用户的家目录
  • Shell:当用户登入系统后就会取得一个 Shell 来与系统的核心沟通以进行用户 的操作任务。那为何预设 shell 会使用 bash 呢?就是在这个字段指定的
/etc/shadow 文件结构

查看一下:

[root@server1 ~]# head -n 4 /etc/shadow
root:$6$qtpZGaPdXiH7S08F$LejOX3qsbImJgUi7XvRUc4GMm5S7EVvATJHwwBlLHOPMvkErQvq9xgvBa1kw0rGS0gCzMJASXfAxt1NuwnAkI0::0:99999:7:::
bin:*:17703:0:99999:7:::
daemon:*:17703:0:99999:7:::
adm:*:17703:0:99999:7:::

每一行同样使用:分隔开,依次说明

  • 账号名称:必须要与 /etc/passwd 相同才行
  • 密码:这个字段内的数据才是真正的密码,而且是经过编码的密码 (加密)
  • 最近更动密码的日期:这个字段记录了『更动密码那一天』的日期
  • 密码不可被更动的天数:(与第 3 字段相比):这个账号的密码在最近一次被更改后需要经过几天才可以再被变更!
  • 密码需要重新变更的天数:(与第 3 字段相比):必须要在这个天数内重新设定你的密码,否则这个账号的密码将会 『变为过期特性』
  • 密码需要变更期限前的警告天数:(与第 5 字段相比):当账号的密码有效期限快要到的时候 (第 5 字段),系统会依据这个字段的设定,发出警告
  • 密码过期后的账号宽限时间(密码失效日):(与第 5 字段相比):密码有效日期为『更新日期(第 3 字段)』+『重新变更日期(第 5 字段)』,过了该期限后用户依旧没有更新密 码,那该密码就算过期了。
  • 账号失效日期:这个账号在此字段规定的日期之后,将无法再使用。
  • 保留:看以后有没有新功能加入

账号管理

新增与移除使用者
[root@study ~]# useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM] [-c 说明栏] [-d 家目录绝对路径] [-s shell] 使用者账号名

实验:

完全参考默认值建立一个用户,名称为 hop1

[root@server1 ~]# useradd hop1
[root@server1 ~]# ll -d /home/hop1
drwx------. 3 hop1 hop1 78 Mar 22 03:57 /home/hop1
默认会建立用户家目录,且权限为 700 !这是重点!

[root@server1 ~]# grep hop1 /etc/passwd /etc/shadow /etc/group
/etc/passwd:hop1:x:1001:1001::/home/hop1:/bin/bash
/etc/shadow:hop1:!!:18342:0:99999:7:::
/etc/group:hop1:x:1001:   预设会建立一个与账号一模一样的群组名

其实系统已经帮我们规定好非常多的默认值了,所以我们可以简单的使用 useradd 账号 来建立使用者即可

这些默认值主要会帮我们处理几个项目:

  • 在 /etc/passwd 里面建立一行与账号相关的数据,包括建立 UID/GID/家目录等;
  • 在 /etc/shadow 里面将此账号的密码相关参数填入,但是尚未有密码;
  • 在 /etc/group 里面加入一个与账号名称一模一样的组名;
  • 在 /home 底下建立一个与账号同名的目录作为用户家目录,且权限为 700

在建立使用者账号时, 还需要使用passwd 账号来给予密码才算是完成了用户建立的流程

实验:

假设已知道我的系统当中有个组名为 users ,且 UID 1500 并不存在, 请用 users 为初始群组,以及 uid 为 1500 来建立一个名为 hop2 的账号

[root@server1 ~]# useradd -u 1500 -g users hop2
[root@server1 ~]# ll -d /home/hop2
drwx------. 3 hop2 users 78 Mar 22 04:03 /home/hop2


[root@server1 ~]# grep hop2 /etc/passwd /etc/shadow /etc/group
/etc/passwd:hop2:x:1500:100::/home/hop2:/bin/bash
/etc/shadow:hop2:!!:18342:0:99999:7:::

在这个实验中,我们建立的是指定一个已经存在的群组作为使用者的初始群组,因为群组已经存在, 所以在 /etc/group 里面就不会主动的建立与账号同名的群组了~

实验:

建立一个系统账号,名称为 hop3

[root@server1 ~]# useradd -r hop3
[root@server1 ~]# ll -d /home/hop3
ls: cannot access /home/hop3: No such file or directory 
不会主动建立家目录

[root@server1 ~]# grep hop3 /etc/passwd /etc/shadow /etc/group
/etc/passwd:hop3:x:988:982::/home/hop3:/bin/bash
/etc/shadow:hop3:!!:18342::::::
/etc/group:hop3:x:982:

在这里加上 -r 这个选项以后,系统就会主动将账号与账号同名群组的UID/GID 都指定小于 1000 以下。


使用 useradd 建立了账号之后,在预设的情况下,该账号是暂时被封锁的,该账号是无法登入的,/etc/shadow内的第二个字段是!!

开始设置密码:

[root@study ~]# passwd [--stdin] [账号名称]  --所有人均可使用来改自己的密码                                                 [root@study ~]# passwd [-l] [-u] [--stdin] [-S] \ 
> [-n 日数] [-x 日数] [-w 日数] [-i 日期] 账号   --root 功能 
选项与参数: 
--stdin :可以透过来自前一个管线的数据,作为密码输入,对 shell script 有帮助! 
-l :是 Lock 的意思,会将 /etc/shadow 第二栏最前面加上 ! 使密码失效; 
-u :与 -l 相对,是 Unlock 的意思!

实验:

请 root 给予 hop2 密码:

[root@server1 ~]# passwd hop2
Changing password for user hop2.
New password:              输入密码,屏幕什么不显示
BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic
Retype new password:        再来一次
passwd: all authentication tokens updated successfully.

尽管我输入的密码过于简单,但是还是修改了

!!用 hop2 登入后,修改 hop2 自己的密码

[hop2@server1 ~]$ passwd   后面没有加账号,就是改自己的密码!
Changing password for user hop2.
Changing password for hop2.
(current) UNIX password: 
New password: 
BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic
New password: 
BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

这里第一次输入了简单的密码,不可以,还是需要输入难一些的

切换至root,想要帮 hop2变更密码成为 abc543CC ,使用 standard input 建立用户的密码:

[root@server1 ~]# echo "abc543CC" | passwd --stdin hop2
Changing password for user hop2.
passwd: all authentication tokens updated successfully.

这个动作会直接更新用户的密码而不用再次的手动输入,好处是方便处理,缺点是这个密码会保留在 指令中, 未来若系统被攻破,人家可以在 /root/.bash_history 找到这个密码!

接着实验:

要让 hop2每 60 天需要变更密码, 密码过期后 10 天未使用就宣告账号失效:

[root@server1 ~]# passwd -S hop2
hop2 PS 2020-03-21 0 99999 7 -1 (Password set, SHA512 crypt.)
上面说密码建立时间2020-3-21,0 最小天数、99999 变更天数、7 警告日数与密码不会失效 (-1)

[root@server1 ~]# passwd -x 60 -i 10 hop2
Adjusting aging data for user hop2.
passwd: Success
[root@server1 ~]# passwd -S hop2
hop2 PS 2020-03-21 0 60 7 10 (Password set, SHA512 crypt.)
每 60 天需要变更密码,密码过期后 10 天未使用就宣告账号失效

想要暂停hop2使用密码登入主机?

[root@server1 ~]# passwd -l hop2
Locking password for user hop2.
passwd: Success
[root@server1 ~]# passwd -S hop2
hop2 LK 2020-03-21 0 60 7 10 (Password locked.)

使用passwd -u hop2恢复


修改用户

在使用 useradd 后,发现某些地方还可以进行细部修改,usermod来进行账号相关数据的微调

[root@study ~]# usermod [-cdegGlsuLU] username 
选项与参数: 
-c :后面接账号的说明,即 /etc/passwd 第五栏的说明栏,可以加入一些账号的说明
-g :后面接初始群组,修改 /etc/passwd 的第四个字段
-l :后面接账号名称。亦即是修改账号名称, /etc/passwd 的第一栏
-u :后面接 UID 数字啦!即 /etc/passwd 第三栏的资料
-L :暂时将用户的密码冻结,让他无法登入
-U :将 /etc/shadow 密码栏的!拿掉

实验:

修改使用者 hop2的说明栏,加上Linux study的说明

[root@server1 ~]# usermod -c "Linux study" hop2
[root@server1 ~]# grep hop2 /etc/passwd
hop2:x:1500:100:Linux study:/home/hop2:/bin/bash

使用者 hop2这个账号在 2020/12/31 失效

[root@server1 ~]# usermod -e "2020-12-31" hop2
[root@server1 ~]# chage -l hop2 | grep 'Account expires'
Account expires						: Dec 31, 2020

我们建立 hop3这个系统账号时并没有给予家目录,请建立他的家目录

[root@server1 ~]# ll -d ~hop3
ls: cannot access /home/hop3: No such file or directory 
确实没有家目录
[root@server1 ~]# cp -a /etc/skel /home/hop3
[root@server1 ~]# chown -R hop3:hop3 /home/hop3
[root@server1 ~]# chmod 700 /home/hop3
[root@server1 ~]# ll -a ~hop3
total 12
drwx------. 3 hop3 hop3  78 Mar 19 20:03 . 用户家目录的权限
drwxr-xr-x. 6 root root  54 Mar 22 04:38 ..
-rw-r--r--. 1 hop3 hop3  18 May 22  2018 .bash_logout
-rw-r--r--. 1 hop3 hop3 193 May 22  2018 .bash_profile
-rw-r--r--. 1 hop3 hop3 231 May 22  2018 .bashrc
drwxr-xr-x. 4 hop3 hop3  39 Mar 19 20:03 .mozilla

使用 chown -R 是为了连同家目录底下的用户/群组属性都一起变更的意思
使用 chmod 没有 -R ,是因为我们仅要修改目录的权限而非内部文件的权限

删除用户

userdel

[root@study ~]# userdel [-r] username 
选项与参数: 
-r :连同用户的家目录也一起删除

实验:删除 hop2 ,连同家目录一起删除

[root@server1 ~]# userdel -r hop2
userdel: user hop2 is currently used by process 62004

[root@server1 ~]# cd /home
[root@server1 home]# ll -al
total 4
drwxr-xr-x.  5 root root   42 Mar 22 04:46 .
dr-xr-xr-x. 17 root root  224 Mar 19 20:10 ..
drwx------. 15 feng feng 4096 Mar 22 04:45 feng
drwx------.  3 hop1 hop1   78 Mar 22 03:57 hop1
drwx------.  3 hop3 hop3   78 Mar 19 20:03 hop3

total 12
drwx------. 3 hop3 hop3 78 Mar 19 20:03 . 用户家目录的权限
drwxr-xr-x. 6 root root 54 Mar 22 04:38 …
-rw-r–r--. 1 hop3 hop3 18 May 22 2018 .bash_logout
-rw-r–r--. 1 hop3 hop3 193 May 22 2018 .bash_profile
-rw-r–r--. 1 hop3 hop3 231 May 22 2018 .bashrc
drwxr-xr-x. 4 hop3 hop3 39 Mar 19 20:03 .mozilla

使用 chown -R 是为了连同家目录底下的用户/群组属性都一起变更的意思
使用 chmod 没有 -R ,是因为我们仅要修改目录的权限而非内部文件的权限



##### 删除用户 userdel ```xml [root@study ~]# userdel [-r] username 选项与参数: -r :连同用户的家目录也一起删除

实验:删除 hop2 ,连同家目录一起删除

[root@server1 ~]# userdel -r hop2
userdel: user hop2 is currently used by process 62004

[root@server1 ~]# cd /home
[root@server1 home]# ll -al
total 4
drwxr-xr-x.  5 root root   42 Mar 22 04:46 .
dr-xr-xr-x. 17 root root  224 Mar 19 20:10 ..
drwx------. 15 feng feng 4096 Mar 22 04:45 feng
drwx------.  3 hop1 hop1   78 Mar 22 03:57 hop1
drwx------.  3 hop3 hop3   78 Mar 19 20:03 hop3

使用 userdel 的时机通常是——真的确定不要让该用户在主机上面使用任 何数据了!

你可能感兴趣的:(Day47——Linux入门学习1)