8月1日 课程笔记

IO重定向及管道

标准输入和输出

程序:指令+数据

  读入数据:Input
  输入数据:Output

程序的数据流有三种:
    输入的数据流:<--标准输入(stdin),默认标准输入是键盘
    输出的数据流:-->标准输出(stdout),默认标准输出是显示器;
    错误输出流:-->错误输出(stderr),显示器;

打开的文件都有一个fd:file descriptor(文件描述符),及文件的标识,机器容易识别数字,每一个文件加载完成后用一个数字来表示:
  标准输入:0
  标准售出:1
  错误输出:2

I/O重定向:改变默认位置

STDOUT和STDERR可以被重定向到文件:
命令  操作符号  文件名

输出重定向:>

   特性:覆盖输出(非常危险,慎用)

一个命令的结果不显示在默认地方,则保存在另一个文件或设备中去。如:

 cat /etc/issue > /tmp/issue.out

cat /etc/issue 里的内容到/tmp/issue.out里。

8月1日 课堂笔记 IO重定向及管道和用户、组和权限管理_Linux

同样的,重输出也可以输出在终端设备上,如:

cat /etc/issue > /dev/tty1

输出重定向:>>

特性:追加输出,不会覆盖原来的内容,推荐使用。

 扩展:
   避免覆盖 #set(设置,或撤销shell选项的值和位置参数)
     #set -C
   禁止覆盖输出重定向至已存在的文件
  此时可用强制覆盖输出:可用 >| 强制覆盖
    #set +C
   关闭上述特性

提醒:仅对当前shell有效。

错误输出流重定向:

2>(覆盖输出),2>> (追加输出),>>之间不能有空格。

合并正常输出流和错误输出流:

   (1)&>,也可以&>>
   (2)COMMAND >/PATH/TO/SOMEFILE 2>$!
  注意:2>&1,之间没有空格,不能使用两个>>。
例如:
    COMMAND >> /PATH/TO/SOMEFILE 2>&1

特殊设备:/dev/null 数据黑洞。任何数据输出到/dev/null,都会消失

8月1日 课堂笔记 IO重定向及管道和用户、组和权限管理_Linux_02

如图,我们不需要知道输出的结果,只需要知道上一条的命令是否成功就好。

():合并多个程序的STDOUT

   (cal 2007;cal 2008) > all.text

输入重定向:<

cat输入不要通过键盘,可以使用<,cat本身就可以带参数,所以<可以不带

tr命令:

转换或删除字符
tr [option]...SET1 [SET2]
把输入的数据当中的字符,凡是在SET1定义范围内出现的,通通对位转换为SET2出现的字符; 例如:tr abc ABC 小写换成大写

输入重定向用法:

用法1:

 tr SET1 SET2 < /PATH/FROM/SOMEFILE

用法2:

tr -d SET1 < /PATH/FROM/SOMEFILE

把SET1中的字母都给移除,只是读出来,不会修改全文件。

Here Document(此处创建文档):<<

cat << EOF

cat > /PATH/TO/SOMEFILE <<EOF

此处所写的所有数据,能创建为文档

管道:

连接程序,实现将前一个命令的输出直接定向给后一个程序的输入数据流

 COMMAND1 | COMMAND2 | COMMAND3

1、将命令1的STDOUT发送给命令2的STDIN,命令2的STDOUT发送到命令3的STDIN
2、STDERR默认不能通过管道转发,可利用2>&1或|&实现
3、最后一个命令会在当前shell进程的子shell进程中执行用来。
4、组合多种工具的功能 ls | tr 'a-z' 'A-Z'

tee

$命令1 |tee 文件名 | 命令2
把命令1的STDOUT保存在文件名中,然后管道输入给命令2
使用:
1、保存不同阶段的输出
2、复杂管道的故障排除
3、同时查看和记录输出

把多行发送给STDIN

使用“<<终止词”命令从键盘把多行重导给STDIN
1、直到终止词位置的所有文本都发送给STDIN
2、有时被称为就地文本(heretext)

$mail -s "please call" root << END  
  >please give me a call ...

  >END

用户组和权限管理

Multi-tasks,Multi-user
现代操作系统都是多任务,多用户

每个使用者:用户ID,现代技术流行之前,还是靠字符串
用户标识、密码:
  认证:Authentication 认证技术
  授权:authorization
  审计:account 或audition

   3a:认证,授权,审计

属主是拥有者,属组

每一个用户登录使用都会记录到日志文件中

组:用户组,用户的容器,将多个用户合并起来,形成单一的逻辑组件

用户类别:
  管理员

  普通用户:
   系统用户
   登录用户
  用户标识:UserID,UID
    16bits二进制数字:0-65535
       管理员:0
       普通用户:1-65535
         系统用户:1-499(centos6)
              1-999(centos7)

      登录用户:500-60000(centos6)
           1000-6000(centos7)

  名称解析:名称转换
Username <--> UID

根据名称解析库进行; 
/etc/passwd(用户的解析库)
复杂的数据库保存这些信息

组类别1:
           管理员组
           普通用户组
               系统组
               登录组

            组标识:GroupID ,GID
                 管理员组:0
                     普通用户组1-65535
                      系统用户组1-499(centos6)
                                1-999(centos7)

                      登录用户组500-60000(centos6),1000-60000(centos7)

           名称解析:groupname<-->gid
               解析库:/etc/group

         组类别2:
           用户的基本组
           用户的附加组

         组类别3:
            私有组:组名同用户名,且只包含一个用户;
            公共组:组内可以包含多个用户


      认证信息:
         用过比对事先存储的,与登录时提供的信息是否一致;
         password:
             /etc/shadow(数据库文件)
             /etc/gshadow(组的密码库文件)


           密码的使用策略:
             1、使用随机密码;
             2、最短长度不要低于8位;
             3、应该使用大写字母、小写字母、数字和标点符号四类字符中至少三类;
             4、定期更换;

       加密算法:
          对称加密:加密和解密使用用一个密码;
          非对称加密:加密和解密使用的一对密钥;
             密钥对:
              公钥:public key

              私钥:private key
           单向加密:只能加密,不能解密;提取数据特征码;
               定长输出;
               雪崩效应:初始条件的微小改变,结果会产生很大的变化


               算法:
                  md5:message digest,128bits
                  sha:secure hash algorithm,160bits
                  sha256
                  sha384
                  sha512

             在计算之前加salt,添加的随机数;

             mageedu12345678:加密字串

             mageedu12345678:生成加密字串
             比较两个字符串是否一样


/etc/passwd:用户的信息库
          name:password:UID:GID:GECOS:directory:shell

       name:用户名
       password:可以是加密的密码,也可以是占位符x;x出现意味密码在edc/shadow
       UID:
       GID:文件中用户所属的主组的ID号;
       GECOS:注释信息;
       directory:用户的家目录;
       shell:用户的默认shell,登录时默认shell程序;

 /etc/shadow;用户密码
     用户名:加密的密码:最近一次修改密码的时间;最短使用期限;最长使用期限;警告时段;过期期限;保留字段


 etc/group;组的信息库
       group_name:passwd:GID:user_list

           user_list:该组的用户成员;以此组为附加组的用户的用户列表;

相关命令:useradd、userdel、usermod、passwd、groupadd,groupdel,groupmod,gpasswd,chage,chsh,id,su,

linux用户及权限管理

回顾: bash globing,IO重定向及管道

用户管理的基础概念:名称解析,组成格式,通用符

glob: *,匹配任意长度的任意字符 ?,匹配任意单个字符 [],匹配指定范围内字符 [^],匹配取反

IO重定向: 输出重定向
> 覆盖输出 >> 追加输出 2> 错误输出 2>> 错误输出 &> 两者合并唯一 &>>
> /PATH/TO/SOMEWHERE 2>&1 另一种用法

  <输入重定向     
  <<(here document) 此处是文档

  |     COMMAND1 |COMMAND2  管道

  tr   :转换或删除字符
  tee

用户管理基础概念: 用户类别: 管理员、普通用户(系统用户和登录用户)

    组类别:
      管理员组、普通用户组,
      基本组和附加组,站在用户的视角,根据所属的类别分
      私有组、公共组,根据一个组内是不是包含和组同名的用户

    数据库文件:
    组成形式,每一行都是一个实体,每一行都有冒号隔开的多个字段
       /etc/paawd:存储用户账户的信息
           loginname:password:uid:gid:comment:home:shell
       用户名:密码:uid:基本组id:注释信息:家目录:shell类型

       /etc/shadow:用户的密码
           login:encrpted_password:...

       /etc/group:组的信息库
           group:password:gid:user_list

        密码存储格式:单向加密,并且借助于salt完成
            1:md5
            sha1
            sha224
            sha256
            sha384
            6:sha512

linux用户和组管理(非常非常重要)

用户管理和组管理各种相关的应用程序 简单d管理命令

安全上下文: 每次对主机操作都是以发起一个进程来完成的,进程代表着人来执行操作,进程以其发起者的身份来运行;所以开机时有很多守护类的进程,我们应该以普通身份来运行,普通用户通常都是系统用户;从来不用登陆系统的;进程对文件的访问权限,取决于发起此进程的用户的权限;

    cat /etc/shadow 普通用户不运行访问这个文件

系统用户:为了能够让那后台进程或服务类进程以非管理员的身份运行,通常需要为此创建多个普通用户,这类用户从不用登录系统,仅仅是其他进程以他的身份来运行,从而能获取普通权限的;

groupadd:创建一个组 tail -f 跟踪文件尾部并不退出 groupadd [选项] group_name(组名)

      -g GID:指定GID;不指定默认是上一个组的GID+1
      -r :创建系统组;系统组,运行很多进程,后台的服务管理,有些进程是随着开机启动起来的,每一个进程在访问资源时,一定是代表了某一个用户,开机时自动启动应该以普通用户的身份运行。

groupmod命令:修改组属性 groupmod [选项] GROUP

      -g GID :修改GID,一定不能与某个组的id号相同
      -n  new_name :删除组名

groupdel命令:删除组, 注意:组里面有用户的话就不能删除 groupdel [选项] GROUP

useradd 命令;创建用户或更新默认新用户信息 创建一个用户时,如果没有指定组的话会自动创建一个与用户同名的组作为用户的私有组,

  useradd [选项] 登录名
     -u, --uid UID:指定UID;
     -g, --gid GROUP :指定基本组ID,不创建与用户名相同的私有组,注意此组必须事先存在,否则会出现错误;
     -G,--groups GROUP1,:指明用户所属的附加组,多个组之间用逗号分隔;
     -c,--comment COMMANT:指明注释信息;

重要:-d,--home HOME_DIR:以指定的路径为用户的家目录;通过复制/etc/skel/此目录并重命名实现的,指定的家目录路径如果事先存在,则不会为用户创建环境初始化配置文件;

(为了实现用户环境初始化,系统一般家目录的创建不是直接创建空目录,而是复制一个目录,并更名为用户所指名的目录)

     -s,--shell SHELL :指定用户的默认shell,可用的所有shell列表为etc/shells文件中;
     -r,--system;创建系统用户

   注意:创建用户时的诸多默认设定配置文件为/etc/loogin.defs

   useradd -D :   显示创建用户的默认配置;
   useradd -D 选项:  修改默认选项的值;
               -s

       修改的结果保存于/etc/default/useradd文件中;


 usermod命令:修改用户属性

      usermod [选项]  登录
           -u,--uid UID:修改用户的ID为此处指定的新UID;
           -g,--g GROUP:修改用户所属的基本组,这个组事先必须存在 :
           -G,修改用户所属的附加组,如果有附加组,  原来的附加组会被覆盖,如果不想覆盖,则与a一起使用;

           -a,--append:与G一同使用,用于为用户追加新的附加组;
           -c,--comment COMMENT:修改注释信息;

           -d,-home HOME_DIR:修改用户的家目录;用户原有的文件不会被转移至新位置;
           -m,--move -home只能与-d选项一同使用,用于将原来的家目录移动为新的家目录

           -l ,--login NEW_LOGIN:修改用户名;
           -s,--shell SHELL :修改用户的默认shell为此处用的shell;
           -L,--lock;锁定用户密码;即在此用户原来的密码字符串之前添加一个“!”
           -U,--unlock:解锁用户的密码;


  userdel命令:删除用户

      userdel [选项] 登录
        -r:删除用户时一并删除其家目录;

练习1:创建用户gentoo,UID为4001,基本组为gentoo,附加组为distro(GID为5000)和peguin(GID为5001) 练习2;创建用户fedora,其注释信息为“Fedora Core”,默认shell为/bin/tcsh; 练习3:修改gentoo用户的家目录为/var/tmp/gentoo:要求其原有文件仍能被用户访问; 练习4:为gentoo新增附加组netadmin;

passwd命令:

passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username]

(1)passwd:修改用户自己的密码;只能是管理员用户更改密码 (2)passwd USERNAME :修改指定用户的密码,但仅root有此权限;

  -l,-u:锁定和解锁用户
  -d:清除用户密码
  -e DAYS:过期期限,日期;
  -i DAYS:非活动期限;
  -n DAYS: 密码的最短使用期限
  -x DAYS:密码的最长使用期限
  -w DAYS:警告期限

重要:--stdin: echo "PASSWORD" | passwd --stdin USERNAME

gpasswd命令:

 组密码文件

  用户的组管理
    gpasswd [选项] group  
       -a USERNAME:向组中添加用户
       -d USERNAME:从组中移除用户

newgrp命令:临时切换指定的组为基本组;

  -:模拟用户重新登录以实现重新初始化其工作环境;

chage命令:更改用户密码过期信息

   chage [选项] 登录名

     -d
     -E
     -w
     -n
     -M

id命令: 显示用户的实际和有效id

   id [option]...[USER]
          -u:仅显示有效的UID
          -g:仅显示用户的基本组ID
          -G:仅显示用户的基本组ID
          -n:显示名字而非ID


su命令:switch user 

    登录式切换:会通过读取目标用户的配置文件来重新初始化
     su - USERNAME
     su - l USERNAME

    非登录式切换:不会读取目标用户的配置文件进行初始化
      su USERNAME

   注意:管理员可无密码切换至其他任何用户;

   -c 'COMMAND' :仅以指定用户的身份运行此处指定的命令;

   su - 用户名 -c '命令'
   在切换的用户下执行一条命令,但不是真正切换用户