Linux02(目录、文件、用户、用户组管理)

rootfs:根文件系统

/boot:引导文件存放目录,内核文件(vmlinuz)、initrd、引导加载器(bootloader,grub)都存放于此目录
/bin:可执行文件,所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序
/sbin:管理类的基本命令;不能关联至独立分区,OS启动即会用到的程序
/lib:启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)
    静态库,.a
    动态库, .dll, .so(shared object)
    /lib/modules:内核模块文件
/lib64:专用于x86_64系统上的辅助共享库文件存放位置
/etc:配置文件目录
/home:管理员的家目录
/home/USERNAME:普通用户家目录
/root:管理员的家目录
/media:便携式移动设备挂载点
/mnt:临时文件系统挂载点
/dev:设备文件及特殊文件存储位置
  b:block device,随机访问,数据块
  c:character device,线性访问,按字符为单位
    设备号:主设备号(major)和次设备号(minor)
/opt: 第三方应用程序的安装位置
/srv:系统上运行的服务用到的数据
/tmp:临时文件存储位置
/usr: universal shared,read-only data
  bin:保证系统拥有完整功能而提供的应用程序
  sbin:
  lib:32使用
  lib64:只存在64位系统
  include:c程序的头文件(header files)
  share:结构化独立的数据,例如doc,man等
    local:第三方应用程序的安装位置
      bin,sbin,lib,lib64,etc,share

/proc:用于输出内核与进程信息相关的虚拟文件系统,伪文件系统;当系统没启动时,该文件夹时空的,当系统启动时,这个文件夹显示的是内核的映射(映像)文件
/sys:伪文件系统;跟硬件设备相关的属性映射文件
/selinux:security enhanced Linux,selinux相关的安全策略等信息的存储位置
# bin,sbin下是跟系统启动相关的命令
      
/usr(shared,read-only):全局的共享的只读文件
    /usr/bin
    /usr/sbin
    /usr/lib
    #  usr下bin、sbin在系统自身启动起来以后,为了提供一些基本功能应该具备的命令或者可执行程序

/usr/local:
    /usr/local/bin
    /usr/local/sbin
    /usr/local/lib

命名规则:
1.文件名长度不能超过255个字符;
2.不能使用/当文件名;
3.严格区分大小写;

# 应用程序的组成部分
二进制程序:/bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin
库文件:/lib,/lib64,/usr/lib,/usr/lib64,/usr/local/lib,/usr/local/lib64
配置文件:/etc/,/etc/DIRECTORY,/usr/local/etc
帮助文件:/usr/share/man,/usr/share/doc,/usr/lcoal/share/man,/usr/local/share/doc

# CentOS7以后版本目录结构变化
/bin和/usr/bin
/sbin和/usr/sbin
/lib和/usr/lib
lib64和/usr/lib64
范例:
#CentOS7
[root@nat ~]# ls /bin /sbin /lib /lib64 -ld
lrwxrwxrwx. 1 root root 7 Mar 28  2021 /bin -> usr/bin
lrwxrwxrwx. 1 root root 7 Mar 28  2021 /lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Mar 28  2021 /lib64 -> usr/lib64
lrwxrwxrwx. 1 root root 8 Mar 28  2021 /sbin -> usr/sbin

#CentOS6
[root@nat ~]# ls /bin /sbin /lib /lib64 -ld
lrwxrwxrwx. 1 root root 7 Mar 28  2021 /bin
lrwxrwxrwx. 1 root root 7 Mar 28  2021 /lib
lrwxrwxrwx. 1 root root 9 Mar 28  2021 /lib64
lrwxrwxrwx. 1 root root 8 Mar 28  2021 /sbin

#ubuntu
[20:29:06 root@zhangchao]#ll /bin /usr/bin -d
drwxr-xr-x 2 root root  4096 Nov  7  2021 /bin/
drwxr-xr-x 2 root root 20480 Jun 14 10:56 /usr/bin/


相对路径
绝对路径
# basename命令 和dirname命令
basename:基名,只取文件名而不要路径
basename /etc/sysconfig/network-scripts/ifcfg-eth0
  ifcfg-eth0

dirname:只取路径,不要文件名
dirname /etc/sysconfig/network-scripts/ifcfg-eth0
  /etc/sysconfig/network-scripts

文件管理
目录管理
    ls
    cd 
      cd - # 返回到上一次的目录
    pwd:当前目录路径
      $OLDPWD:上一次目录路径
    mkdir:创建空目录
        -p:多级目录
        -v:显示创建多级目录的创建信息
    	# mkdir -pv /root/m/n/l
        1.如何一句命令创建/mnt/test/x/m,y?
            方法一:mkdir -pv /mnt/test/x/m /mnt/test/y
            方法二:mkdir -pv /mnt/test/{x/m,y}
        2.如何在/mnt/test2下创建a_b,a_c,d_b,d_c文件夹?
        	(a+b)(c+d)=ab+ac+bc+bd
            {a,b}_{c,d}
            方法:mkdir -pv /mnt/test2/{a,b}_{c,d}
    rmdir (remove directory)  # 删除空目录
    
    # 文件的创建何删除
    1. touch # 本不是创建文件的命令,只是歪打正着了。
    touch 文件名
    	# eg:touch a
    2. nano 文件名
    	eg: nano abb
    在Linux下在同一个文件夹下不能创建同一个名字的文件或文件夹
    
    touch: # 它是改变文件的时间戳的命令
        touch -c c  # 表示不创建文件名为c的文件
        touch -a a.txt # chang only the access time,不指定时间,默认将a.txt文件的权限时间修改成当前时间。
        touch -m # chang onlu the modification time
        touch -m -t 201810181818 a.txt  # 表示将a.txt文件的modify时间改成指定的201810181818
    stat: # 查看文件属性信息:主要是看Access Modify Change三种状态下的时间戳 
        stat 文件名 
        	eg:stat a.txt
cp:
    # 一个文件到一个文件,多个文件到一个目录
    cp /etc/passwd /tmp 表示将etc下的passwd文件拷贝到tmp文件夹下,并且文件名还是passwd
    cp /etc/passwd /tmp/test  # 如果test不存在,表示将etc下的passwd文件拷贝到tmp下并重命名为test;如果test存在,1:如果test是个文件,则提醒我们是否要覆盖掉test文件;如果test是个目录,则将etc下的passwd拷贝到/tmp/test文件夹下,文件名仍是passwd。
    
    # 如果源文件是多个文件,则目标必须是个目录
    cp /etc/passwd /etc/issue /etc/inittab /tmp/abc  # 这里abc必须存在,且是一个目录。
    
    cp -a  # 是把原文件或文件夹原样打包一份,归档复制,常用于备份。
    cp -L  # 拷贝原文件或者文件夹连接所指向的文件或者文件夹
    cp -d  # 只拷贝源文件或文件夹链接
	# eg: cp /etc/{passwd,inittab,rc.d/rc.sysinit} /tmp

mv: # 移动文件
    1. mv 源文件或目录 目标文件或目录
    # 如何将一个文件或目录重命名?
    mv abc mn  # 表示将当前目录下的abc文件重命名为mn,或者当前目录下的abc目录重命名位mn目录
  	
    # mv还有一种特殊用法!!!!!!!
   2.  mv -t 目标文件或目录 源文件或目录  # 加-t与1相反

install:
    -d DIRECTORY...:创建目录
    -m 指定修改文件的权限,不指定默认有执行权限
	install -d /tmp/install.1 /tmp/install.2 等同于 install -d /tmp/{install.1,install.2} # 可以用来创建目录,可以同时创建多个。类似mkdir
    install /etc/passwd /var/tmp/install.file # 表示将passwd文件拷贝到/var/tmp下,并重命名为install.file,但是install.file文件有了执行权限,可以通过-m指定权限。类似cp
    
    install -t DIRECTORY SRC...  # 表示将源文件或文件夹拷贝到DIRECRTORY中。类似cp

du: #  显示文件或目录所占用的磁盘空间。
    -h  输出文件系统分区使用的情况,例如:10KB,10MB,10GB等
    -s 显示文件或整个目录的大小,默认单位是KB
    
    du -sh # 显示当前目录的大小
    du -sh httpd  # 显示某个目录或文件的大小
    du -sh ./*  # 显示当前目录下所有文件的大小
    du -h --max-depth=1  # 查找占用空间最大的文件与目录

查看文件

1. cat 
	cat -n 文件名  # 显示文件的行号
	cat -E /etc/issue # 对于Linux系统而言,文本文件的行结束符是$符;而windows的文本行结束符是$+enter(回车)
2. tac 
	tac /etc/issue  # 将issue文本逆向显示,与cat显示文本的方式相反。
3. more  # 向后翻,向前翻到最后一行自动推出
4. less  # 向前翻,到最后一行不会退出,按q键推出
5. head 
	head -n 5 /etc/passwd # 指定显示文件的前5行,不指定行数,默认显示开头的10行
6. tail 
	tail -n -5 /etc/passwd # 指定显示文件的后5行,不指定行数,默认显示末尾的10行
        tail -f /tmp/hello.txt  # 显示hello文本的后 行内容,并且不会退出;此时如果有其它进程往这个文本末尾追加内容,等待显示新增加内容 

文本处理

# cut join sed awk
1. cut
    -d # 指定字段分隔符,不指定的话,默认是空格;
    -f # 指定要显示的字段  -f1:表示显示第一个字段 -f 1,3表示显示1和3字段  -f 1-3 表示显示1到3的字段
    eg:
         cut -d : -f1 /etc/passwd
	 cut -d : -f 1,2 /etc/passwd
         cut -d : -f 1-3 /etc/passwd
2. join

文本排序

# sort
1. sort
    -n:数值排序
    -r:降序
    -t:字段分隔符
    -u:排序后相同的行只显示一次
    -f:排序时忽略字符大小写
        
    sort 文件名  # 按照ASCII码表对行进行升序排序
    sort -n 文件名  # 按照数字大小进行升序排序
    sort -r 文件名  # 按照ASCII码表对行进行逆序排序
    sort -r -n  # 按照数字大小进行降序排序
    sort -t: -k3 /etc/passwd  # 按照第3个字段,按照ascii码进行排序
    sort -t: -k3 -n /etc/passwd # 按照第3个字段,按照数值大小进行排序
    sort -n -u sort.test
    
    
2. uniq(report or omit repeated lines):# 报告相邻重复的行
	uniq 文件名 # 将文件中相邻重复的行删除一行
    uniq -d 文件名 # 只显示相邻重复的行,只显示重复行当中的一行
    uniq -D 文件名 # 显示相邻重复行中的所有行
    uniq -c 文件名 # 显示相邻每一行重复的次数

文本统计

wc(word count)
	-l:只显示行数
	-w:只显示单词数
	-m:只显示字符数
	-c:只显示字节数
	-L:表示最长的一行包含多少个字符
      

字符处理命令

tr:转换或删除字符
tr [OPTION]... SET1 [SET2]
    -d:删除出现在字符集中的所有字符
     tr -d 'ab'
    
tr 'ab' 'AB'
tr 'a-z' 'A-Z' < /etc/passwd # 将passwd文本中全部的小写字母转换成大写字母  <是重定向

bash及其特性

shell:外壳
    GUI:Gnome,KDE,Xfce
    CLI:sh(bsh),csh,ksh(商业化的产品,需要付费才能使用,后来分为社区版和商业版),bash(兼具csh,ksh,比sh更加强大),tcsh(增强版),zsh(功能更加强大,但是还不是很流行),在红帽系列和众多的发行版上使用的都是bash,所以学习bash是首选。
        
history:
    1.命令历史
    	bash会自动记录执行的命令,会将使用的命令放入缓冲区。
        -c:清空命令历史
        -d OFFSET [n]:
        -w:保存命令历史至文件中
        -n:
        history -d 500 # 删除第500个命令
        history -d 500 10 # 从第500个命令开始,删除10个命令
        set +o history  # 执行此命令之后,再执行其他的命令将不会被记录到.bash_history文件中
        set -o history  # 执行此命令之后,再执行其他命令将会记录到.bash_history文件中

        命令历史的使用技巧:
             !n: 执行命令历史中的第n条命令
             !-n:执行命令历史的倒数第n条命令
             !!:执行上一条命令
             !string:执行命令历史中最近一个以指定字符串开头的命令
             !$:引用前一个命令的最后一个参数 # 方式1
             	# eg:nano !$  
             !*:将上一个命令的所有参数引用过来
             !string 重复前一个以"string"开头的命令
             !?string 重复其哪一个包含string的命令
             ^string 删除上一条命令中的第一个string
             ^sting1^string2  将上一条命令中的第一个string1替换为string2
             !:gs/string1/string2 将上一条命令中的第一个string1替换为string2
             使用up(向上)down(向下)键来上下浏览从前输入的命令
             ctrl-r来在命令历史中搜索命令
              (reverse-i-search)`':
             Ctrl+g:从历史搜索模式退出
        
             #重要新调用前一个命令中最后一个参数
             !$    表示前一个命令中最后一个参数
             Esc,.    点击Esc键后松开,然后点击 . 键
             Alt+ .   按住Alt键的同时点击 . 键
      
             command !^ 利用上一个命令的第一个参数做command的参数
             command !$ 利用上一个命令的最后一个参数做command的参数
             command !* 利用上一个命令的全部参数做command的参数
             command !:n 利用上一个命令的第n个参数做command的参数
             command !n:^ 调用第n条命令的第一个参数
             command !n:$ 调用第n条命令的最后个参数
             command !n:m 调用第n条命令的第m个参数
             command !n:* 调用第n条命令的所有参数
             command !string:^ 从命令历史中搜索以 string 开头的命令,并获取它的第一个参数
             command !string:$ 从命令历史中搜索以 string 开头的命令,并获取它的最后一个参数
             command !string:n 从命令历史中搜索以 string 开头的命令,并获取它的n个参数
             command !string:* 从命令历史中搜索以 string 开头的命令,并获取它的所有参数

             按下'ESC'键之后按'.',会自动弹出上一个变量;# 方式2
             ALT+.  # 方式3
             
             输入命令的开头字母,连续两次'tab键',将显示与该字母开头的所有命令。

             让文件中被执行的历史命令以指定的时间格式显示:
               在/etc/profile.d/env.sh中编辑:export HISTTIMEFORMAT="%F %T  " # F代表年月日,T代表时分秒。

    2.管道、重定向
    3.命令别名
    	alias 别名='COMMAND [options] [arguments]'
        在shell 中定义的别名仅在当前shell生命周期中有效:别名的有效范围仅为当前shell进程。
        	# eg: 
            	1. alias 查看系统中已命名的别名
                2. alias cls=clear
        取消别名:
        	unalias 别名
            	# eg: unalias cls
        如果重命名的别名与命令相同且别名后带有参数,想使用原命令,需要 \CMD
        
    4.命令行编辑bash的快捷键
      Ctrl+l:清屏,相当于clear命令
      Ctrl+l    清屏,相当于clear命令
      Ctrl+o    执行当前命令,并重新显示本命令
      Ctrl+s    阻止屏幕输出,锁定
      Ctrl+q    允许屏幕输出,解锁
      Ctrl+c    终止命令
      Ctrl+z    挂起命令
      Ctrl+a    光标移到命令行首,相当于Home
      Ctrl+e    光标移到命令行尾,相当于End
      Ctrl+f    光标向右移动一个字符
      Ctrl+b    光标向左移动一个字符
      Ctrl+xx   光标在命令行首和光标之间移动

      Alt+f     光标向右移动一个单词位
      Alt+b     光标向左移动一个单词位
      Ctrl+u    从光标处删除至命令行首
      Ctrl+k    从光标处删除至命令行尾
      Alt+r     删除当前整行
      Ctrl+w    从光标处向左删除至单词首
      Alt+d     从光标处向右删除至单词尾
      Alt+Backspace 删除左边单词
      Ctrl+d    删除光标处的一个字符

      Ctrl+h    删除光标前的一个字符
      Ctrl+y    将删除的字符粘贴至光标后
      Alt+c     从光标处开始向右更改为首字母大写的单词
      Alt+u     从光标处开始,将右边一个单词更改为大写
      Alt+l     从光标处开始,将右边一个单词更改为小写
      Ctrl+t    交换光标处和之前的字符位置
      Alt+t     交换光标处和之前的单词位置
      Alt+#     提示输入指定字符后,重复显示该字符#次
    
      注意:Alt组合快捷键经常和其他软件冲突
      范例:xshell中启动alt键 # 如下图

    5.命令行展开
    6.文件通配符:# 通过 man 7 glob 命令查看特殊字符的通配符
    	*:任意长度的任意字符
        ?: 任意单个字符,如果需要匹配指定个数的字符,就需要指定个数的'?'
        ~:当前用户家目录
        ~zhang:用户zhang的家目录
        ~+和. :当前工作目录
        ~- : 前一个工作目录
        [0-9]: 匹配数字范围
        [a-z]:一个字母
        [A-Z]:一个字母
        [zhang]:匹配列表中的任何的一个字符
        [^wang]:匹配列表中的所有字符以外的字符
        [^a-z]:匹配列表中的所有字符以外的字符
        []: 匹配指定范围内的单个字符,eg:[abc],[a-m],[A-Z],[0-9],[a-zA-Z],[0-9a-zA-Z]
        [^]:匹配指定范围之外的任意单个字符,eg:ls [^0-9]*
        
        另外还有在Linux系统中预定义的字符类:man 7 glob
        [:space:]: 空白字符
        [:punct:]: 所有的标点符号
        [:digit:]:任意数字,相当于0-9
        [:lower:]: 小写字母
        [:upper:]: 大写字母
        [:alpha:]: 大小写字母
        [:alnum:]: 数字和大小写字母
        [:blank:]:水平空白字符
        [:space:]:水平或垂直空白字符
        [:print:]:可打印字符
        [:cntrl:]:控制(非打印)字符
        [:graph:]:图形字符
        [:xdigit:]:十六进制字符
        # eg: 如何表示字母开头、字母结尾、中间有空格的文件?
        	[[:alpha:]]*[[:space:]]*[[:alpha:]]
    7.变量
    	环境变量:
            PATH:命令搜索路径
            HISTSIZE:命令历史缓冲区大小
            SHELL:用于保存当前用户默认shell的
    8.编程

9.bash支持的引号有3种:
  ``:里面的内容必须是能执行的命令并且有输出信息,变量和命令都识别,并且会将反向单引号的内容当成命令进行执行后,再交给调用反向单引号的命令继续,“最聪明”
 "":弱引用,不能识别命令,可以识别变量,“半傻不精”
 '':强引用,六亲不认,变量和命令都不识别,都当成了普通的字符串,“最傻”

范例:
echo "This is system's name is $(hostname)"
  This is system's name is zhangchao.com
echo "I am `whoami`"
  I am root
touch $(date +%F).log
ls
  2021-04-09.log
touch `date +%F`.txt
touch `hostname`-`date+%F`.log
touch `date +%F_%H-%M-%S`.log
touch `date -d '-1 day' +%F`.log 

 命令替换: $(COMMAND),使用反引号也是一样的 `COMMAND`
 把一个命令的输出打印给另一个命令的参数,放在``中的一定是有输出信息的命令
  $(COMMAND) 或 `COMMAND`

范例:比较"",'',``三者的区别

echo "echo $HOSTNAME"
  echo centos8.localdomain

echo 'echo $HOSTNAME'
  echo $HOSTNAME

echo `echo $HOSTNAME`
  centos8.localdomain
 把命令中某个子命令替换为其执行结果的过程。
 范例:$()和``
 `echo`date +%F`.txt`
    -bash: .txt command not found
    ls: cannot access 'date':No such fule or directory
    ls: cannot access '+%F': No such file or directory

  ll $(echo $(date +%F).txt)
  -rw-r--r-- 1 root root 0 Mar 20 20:37 2021-04-09

  ll `echo $(date +%F).txt`
  -rw-r--r-- 1 root root 0 Mar 20 20:37 2021-04-09

  ll $(echo `date +%F`.txt)
  -rw-r--r-- 1 root root 0 Mar 20 20:37 2021-04-09
  
  echo 'the current directory is $(pwd)'
  touch flie-$(date +%F-%H-%M-%S).txt
  touch flie-`date +%F-%H-%M-%S`.txt  

用户、组、权限

# 权限:r、w、x
文件:
    r:可读,可以使用类似cat等命令查看文件内容;
    w:可写,可以编辑或删除此文件;
    x:可执行,executable,可以命令提示符下当作命令提交内核运行;
目录:
	r:可以对此目录执行ls以列出内部的所有文件;
    w:可以在此目录创建文件;
    x:可以使用cd切换进此目录,也可以使用ls -l查看内部文件的详细信息;

        
用户:UID,/etc/passwd
组:GID,/etc/group
影子口令:
用户:/etc/shadow  # 用户密码的存放位置
组:/etc/gshadow  # 组密码实际存放位置

用户类别:
	管理员:# UID永远为0
    普通用户:1-65535
    	系统用户:1-499,
        一般用户:500-60000
用户组类别:
	管理员组:
    普通组:
    	系统组:
        一般组:
用户组类别:
	私有组:创建用户时,如果没有为其指定所属的组,系统会自动为其创建一个与用户名同名的组
    基本组:用户的默认组
    附加组,额外组:默认组以外的其它组
  
# 分析passwd文件下七个字段的所代表的含义
whatis passwd # 查看passwd有几个章节的慢文档
man 5 passwd # 第5个章节是对配置文件的说明

# /etc/passwd
account:登录名
password:密码  # 如果密码的位置是X,则x是一个占位符,密码真正的存放位置在shadow中
UID:
GID:基本组ID
comment:注释
HOME DIR:家目录
SHELL:用户的默认shell


# 分析shadow文件下七个字段的所代表的含义
 whatis shadow #  查看shadow有几个章节的慢文档
 man 5 shadow # 第5个章节是对配置文件的说明

# /etc/shadow
account:登录名
encrypted password:加密的密码
date of last password change: # 上一次修改密码的时间
minimum password age: # 最短使用天数
maximum password age:# 密码最长使用期限,99999天,表示永不过期
password warning period # 离过期之前的警告时间
password inactivity period: # 
account expiration date:
reserved field


# 查看当前系统中由哪些可用的shell
cat /etc/shells

cat /etc/shadow:

两个 !! 表示不让其登录,所以如果不想让某个用户登录可以在shadow文件中对应的用户加上两个“!!”

$6,表示一种加密方式,其中$1是MD5加密。

用户管理

创建用户和添加密码

useradd(或者adduser) 用户名 # 普通用户或者root用户都可以创建新用户,只不过普通用户没办法给新建用户添加登录的密码,这样用户就没办法登录,要想创建的账户可以登录,需要用root用户给这个用户添加密码。创建用户时,会在passwd,shadow,group,gshadow中分别增加一条记录,只有在给新建用户创建密码后,在shadow中用户的密码才从‘!!’变成加密的密码
passwd 用户名 # 给新建用户添加密码,连续两次输入密码。

useradd 
	-u UID 用户名
	-g GID 用户名  # 指定基本组
    -G GID,...  用户名  # 指定额外组(附加组)
    -c "COMMNET" 用户名  # 指定注释
    -d(directory) /path/to/somedirectory  # 创建用户时给用户指定家目录
    -s shell路径  用户名 # 给新建用户指定shell,最好是/etc/shells文件中已存在的shell
    -m -k   # 如果用户没有家目录,强制给用户创建家目录, -m和-k一般组合使用,在创建用户时,指定-k,会把/etc/skel下的.logout .bash_history .bashrc .bash_profile复制到用户的家目录中
    -M 用户名  # 创建用户,但不给其指定(创建)家目录(默认创建用户时,不指定家目录路径,就以用户名作为用户的家目录),这在 /etc/login.refs文件中都有配置说明,具体详细查看该文件。
    -r:添加系统用户(会从0-499随机选一个uid作为用户的id,但是不能登录,也没有家目录,即使在/etc/passwd下给了路径,在/home文件夹下没有这个用户的家目录)
        eg:useradd -r apache

image-20210312182959796

删除用户

# id 查看用户信息
id  # 显示当前用户的id信息
id 用户名 # 显示此用户的id信息
id -u  # 只显示用户的uid信息
id -G  # 只显示用户的gid信息
id -u -n  # 显示用户的用户名
id -G -n  # 显示用户的组名

# finger:查看用户账号信息
finger  # 查看当前用户信息
finger USERNAME # 查看指定用户信息
finger -l USERNAME@host # 查看远程用户信息

userdel [OPTION] USERNAME 
userdel 用户名  # 默认是不会删除这个用户的家目录的
		-r 用户名 # 同时删除用户的家目录
    


修改用户账号属性

usermod
	-u: # 修改用户的UID
	-g: # 修改用户的GID
	-a -G: # 不使用-a选项,会覆盖此前的附加组;使用-a则在原有的附加组基础之上追加新的附加组
	-c:
	-d: # 给用户指定新的家目录,通常和 -m一起使用,表示即给用户指定新的家目录,还给用户的家目录下的文件一起复制到新的家目录中。
	-s:  # 修改用户的shell
	-l:  # 修改用户的登录名
	-L(Lock):  # 锁定用户账号,锁定之后这个用户就不能登录了。
	-U(Unlock):  # 解锁账号

chsh(chageshell): # 修改用户的shell
    chsh 用户名
  
chfh(change finger): # 修改账户注释信息(/etc/passwd7个字段中的comment)
    chfh 用户名


用户密码管理

passwd 用户名
	--stdin #  接收标准输入的。Linux的哲学思想是:尽量避免与用户交互
	-l(lock):
	-u(unlock)
	-d(delete):# 删除用户密码,用户就不能登录了。

        
pwck: # 检查用户账号完整性

组管理

创建组

# cat /ect/group
用户组名:
用户密码:
GID:
以这个组为附加组的用户列表:

# 创建组
groupadd 组名 # 不指定组id,默认是从500以后的上一个组加1.
	-g GID
	-r: 添加一个系统组
        eg:groupadd -r nginx
	-n groupname

image-20210312235135090

删除组

groupdel

给组加密码

gpasswd:为组添加密码,一般在切换组的时候使用。
newgrp 组名(必须是当前用户已经有的附加组): # 给当前用户切换组,第一次需要输入密码;如果再次切换为原来的组,直接exit退出即可。

组和用户联系题

  1. change:修改用户密码的过期信息

    -d:  最近一次的修改时间
    -E:  过期时间
    -I: 非活动时间
    -m:  最短使用期限
    -M: 最长使用期限
    -W: 警告时间
    

    用户权限管理

    三类用户:
    u:属主(owner)
    g:属组(group)
    o:其他用户(other)
    '''
    每一类用户的权限都有8中权限的变化形式,有权限就加上对应权限,没有权限就用-代替,就是0-7的8进制位表示。
    '''
    chown:改变文件属主(只有管理员可以使用此命令)
    # chown USERNAME file...
    	-R(recursive):修改目录及其内部文件的属主
    	--reference=/path/to/somefile file,... # 将flie的属主和属组设置的和/path/to下的somefile一样(设定新文件和参考文件一样)
    
    # chown也可以同时修改属主和属组    
    chown USERNAME:GRPNAME file...  # 即改属主又改属组
    chown :GRPNAME file...  # 表示只改属组
    chown USERNAME: file... # 和chown USERNAME:GRPNAME file... 效果一样
    chown USERNAME:GRPNAME file... # 还支持-R选项,改变文件夹及其内部文件的属主和属组
    chown USERNAME.GRPNAME flie...  # 效果和:是一样的,都是同时改变属主和属组  
    chown -R   USERNAME:GRPNAME Directory # 递归同时修改文件夹下的所有文件及文件夹的属组和属主
        
    chgrp(修改文件或者文件夹属组):只有管理员才能使用此命令;
    	chgrp 组名(已存在) flie...
    	-R:默认只修改指定文件或文件夹的属组,如果要修改文件夹及其内部文件或文件夹的属组,要加-R选项。
    	--reference=/path/to/somefile file... # 和chown用法一样	
    


文件权限管理

chmod: 修改文件的权限
	1.修改三类用户的权限:
    chmod 75 /tmp/abc.txt # 如果给的位数不够,会从前面补0,变成075
    chmod 5 /tmp/abc.txt # 如果给的位数不够,会从前面补0,变成005
	-R: # 同chown和chgrp,也支持-R
	--reference=/path/to/somefile file...  # 同chown和chgrp,也支持reference
    
    2.修改某类用户或某些类用户权限:
    u(user),g(group),o(other),a(all)
    chmod 某类用户类别=MODE file...
    chmod u=rwx /tmp/abc # 不支持的写法:chmod u=7 /tmp/abc
    chmod g=rw /tmp/abc  # 等同于 chmod g=rw- /tmp/abc
    chmod o=rx /tmp/abc  # 等同于 chmod o=r-x /tmp/abc

    chmod g=r,o=r /tmp/abc  # 同时修改两类用户只有读权限,等同于 chmod go=r /tmp/abc
    chmod go=rw /tmp/abc # 表示修改g,o两类用户同时有读写权限
	chmod g=rx,o= /tmp/abc  # 给g用户读和执行的权限,o用户无权限。
    
    
    3.修改某类用户的某位或某些位权限:
    u,g,o,a
    chmod 用户类别+|-MODE file...
    
    chmod u-x /tmp/abc  # 表示给u用户去掉执行权限
    chmod u+x,g-x /tmp/abc # 同时给多类用户修改某一类权限,中间用逗号隔开
    chmod a+x /tmp/abc  # 将abc文件的3类用户都加上执行权限

小练习1:

1、新建一个没有家目录的用户openstack;
	# useradd -M openstack
2、 复制/etc/skel为/home/openstack
	# cp -r /etc/skel /home/openstack
3、 改变/home/openstack及其内部文件的属主属组均为openstack;
	# chown -R openstack:openstack /home/openstack
4、 /home/openstack及其内部的文件,属组和其他用户没有任何访问权限;
	# chmod -R go= /home/openstack

su - openstack

小练习2:

手动添加用户hive,基本组为hive(5000),附加组为(mygroup)。
1. nano /etc/group
2. nano /etc/passwd
3. nano /etc/shadow
4. cp -r /etc/skel/ /home/hive
5. chown -R hive.hive /home/hive  # 修改属主(root)和属组(root)为hive
6. chmod -R go= /home/hive

# 经过以上6个步骤,用户hive还不能登录,只能通过管理员su过去,现在需要在/etc/passwd文件中hive用户对应的字段添加密码。
7. 
	方式1:passwd  # 直接使用passwd命令生成
     方式2:openssl passwd # 使用openssl命令生成md5形式的密码
8. 用openssl输入的明文密码登录


bc是一个计算器,可以进行数字运算 # 默认是没有保留小数位的精度的,可以在命令行打开bc之后,通过scale在命令行直接设置,比如:scale=2表示保留两位小数。


管理员与普通用户创建文件夹和文件的权限

管理员用户:
	创建的目录权限:755
	创建的文件权限:644
普通用户:
	创建的目录权限:775
	创建的文件权限:664

umask[遮罩码(用户创建文件或目录用到的遮罩码)]:
    创建文件:666-umask
    创建目录:777-umask
    root用户的umask:022
    普通用户的umask:002
'''
所以root用户和普通用户创建文件和目录的权限是以上的权限。。。。
'''
umask:命令显示遮罩码
umask 遮罩码 :可以用来设置遮罩码
	eg:在普通用户下设置其遮罩码和root用户一样,均为022; 
    	umask o22
        之后再次创建文件的权限就是644,创建目录的权限就是755

umask:023
    文件:666-023=643
    目录:777-023=754
    '''
    实际用023的遮罩码在创建目录的权限符合我们设置的754,但是创建文件的权限没有变成643(3:写和执行权限),而是644;
    得出结论:文件默认不能具有执行权限,如果算得的结果中有执行权限,则将其权限加1;
    '''
    
umask:027  # 如果自己创建的文件或目录不想让别人看到,就使用027

修改普通用户的遮罩码和root用户一样,则创建的文件权限就是644,创建的目录权限就是755了。。。。如下图:


用户登录

站在用户登录角度来说,SHELL的类型:

# 登录式shell:
    1. 正常通过某终端登录;
    2. su - USERNAME; # 加 - 是完全切换
    3. su -l USERNAME;
# 非登录式shell:
    1. su USERNAME; # 不加 - 是半切换
    2. 图形终端下打开命令窗口;
    3. 自动执行的shell脚本;

bash的配置文件:
	全局配置:
    	/etc/proflie,/etc/profile.d/*.sh,/etc/bashrc
	个人配置:
    	~/.bash_profile, ~/.bashrc, ~/.bash_logout, .~/.bash_history
'''
如果想设置一个环境变量对所有的用户都生效,可以在/etc/proflie文件中定义,或者在/etc/profile.d/文件夹下创建一个以.sh结尾的文件,在这个文件中定义也可以。
如果只对当前用户生效,可以在当前用户的.bash_profile文件中添加这个环境变量。。。
'''
profile类的文件:
	设定环境变量
	运行命令或脚本(一般是用户登录前的一些准备工作,在用户登录时,在这个文件中定义执行某个脚本)
bashrc类的文件:
	设定本地变量
	定义命令别名

登录式shell如何读取配置文件的顺序?
	/etc/proflie  --> /etc/profile.d/*.sh  --> ~/.bash_profile  --> ~/.bashrc --> /etc/bashrc
    
非登录式shell如何读取配置文件?
	~/.bashrc -->  /etc/bashrc -->  /etc/profile.d/*.sh

加密方法

对称加密:加密和解密使用同一个密码
公钥加密:每个密码成对儿出现,一个为私钥(secret key),一个为公钥(public key)
单项加密,散列加密(由明文到密文,不可解密):提取数据特征码,常用于数据完整性校验
	1. 雪崩效应 :初始条件微小改变,可能会引起结果的巨大变化(防止暴力破解)
    2. 定长输出
    	MD5:Message Digest:128位的定长输出
        SHA1:Secure Hash Algorithm(安全的hash算法),160位的定长输出。
w:  # 看的是你以哪个用户登录进来,而不是当前你切换到的用户
who: # 看的没有w详细
users: # 查看当前有哪些用户登录
groups 用户名: # 显示用户所属的基本组和附加组
last:  # 查看之前有哪些用户登录过
lastlog:  # 查看每一个用户的最近登录状态
[root@server0 ~]# whatis passwd
passwd: nothing appropriate.     # 如果查看帮助提示这个,请执行mandb重建帮助文档索引
[root@server0 ~]# mandb
Processing manual pages under /usr/share/man...
Updating index cache for path `/usr/share/man/man4'. Wait...mandb: can't open /usr/share/man/man/man4/crontabs.4: No such file or directory
mandb: warning: /usr/share/man/man4/run-parts.4.gz: bad symlink or ROFF `.so' request
Updating index cache for path `/usr/share/man/man8'. Wait...mandb: warning: /usr/share/man/man8/fsck.fat.8.manpage-fix.gz: ignoring bogus filename
mandb: warning: /usr/share/man/man8/numad.8.gz: whatis parse for numad(8) failed
Updating index cache for path `/usr/share/man/mann'. Wait...done.
Checking for stray cats under /usr/share/man...
Checking for stray cats under /var/cache/man...
Processing manual pages under /usr/share/man/cs...
Updating index cache for path `/usr/share/man/cs/man8'. Wait...done.
Checking for stray cats under /usr/share/man/cs...
Checking for stray cats under /var/cache/man/cs...
Processing manual pages under /usr/share/man/da...
Updating index cache for path `/usr/share/man/da/man8'. Wait...done.
Checking for stray cats under /usr/share/man/da...<----省略若干行--->
Checking for stray cats under /var/cache/man/local...
102 man subdirectories contained newer manual pages.
7346 manual pages were added.
0 stray cats were added.
0 old database entries were purged.
[root@server0 ~]# whatis mandb
mandb (8)            - create or update the manual page index caches

权限、文件管理可参考博客:https://www.cnblogs.com/miaocbin/articles/11740305.html

设备管理
软件管理
进程管理
网络管理

命令小结:

目录管理:
ls/cd/pwd/mkdir/rmdir/tree
文件管理:
touch/stat/file/rm/cp/mv/nano

日期时间:
date/clock/hwclock/cal

文本处理:
cat/more/less/head/tail/cut/sort/uniq/grep
posted on 2021-03-12 22:51  jueyuanfengsheng  阅读(284)  评论(0编辑  收藏  举报