zoukankan      html  css  js  c++  java
  • Linux基础学习3

    鸟哥私房菜第十一章
     
    read
    用来读取键盘输入的变量,常被用在shell script的交互当中
    [root@www ~]# read [-pt] variable
    选项不参数:
    -p :后面可以接提示字符!
    -t :后面可以接等待的秒数!
    范例:提示使用者15 秒内输入自己的大名,将输入的字符串作为named的变量内容
    zhenxiang@ubuntu:~$ read -p 'please keyin your name:' -t 15 named
    please keyin your name:zhenxiang
    zhenxiang@ubuntu:~$ echo $named
    zhenxiang
     
    ulimit 
    文件系统及程序;限制用户的某些系统资源,包括可以开启的档案数,可以使用cpu的时间,可以使用的内存总量等等;
    一般使用设定档案大小,只能缩小不能扩大;
     
    变量内容的删除
    #:从左往右删除第一个匹配;且是删除符合条件的最短的哪一个
     
    注意:仅将匹配字符删除而不是按目录来删除的
    zhenxiang@ubuntu:~$ echo $path
    /usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
    zhenxiang@ubuntu:~$ echo ${path#*lig*}
    htdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
    zhenxiang@ubuntu:~$ echo ${path#*dm:}
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
     
    ##:从左往右删除第一个匹配;且是删除符合条件的最长的哪一个
     
    #和##比较:
    zhenxiang@ubuntu:~$ echo $path /usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games zhenxiang@ubuntu:~$ echo ${path##/*:} /usr/games zhenxiang@ubuntu:~$ echo ${path#/*:} /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
    %:从右往左删除第一个匹配,且是删除符合条件的最短的哪一个
     
    zhenxiang@ubuntu:~$ echo $path
    /usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
    zhenxiang@ubuntu:~$ echo ${path%:*}
    /usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
     
    %%:从右 往左 删除第一个匹配;且是删除符合条件的最长的哪一个
     
    %和%%比较:
    zhenxiang@ubuntu:~$ echo $path /usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games zhenxiang@ubuntu:~$ echo ${path%:*} /usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin zhenxiang@ubuntu:~$ echo ${path%%:*} /usr/lib/lightdm/lightdm
    变量的取代:
    ${变量/旧字符串/新字符串}: 若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串取代』
    ${变量//旧字符串/新字符串}: 若发量内容符合『旧字符串』则『全部的旧字符串会被新字符串取代』
     
    两种比较范例:
    zhenxiang@ubuntu:~$ echo $path /usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games zhenxiang@ubuntu:~$ echo ${path/lightdm/mm} /usr/lib/mm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games zhenxiang@ubuntu:~$ echo ${path//lightdm/mm} /usr/lib/mm/mm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
    #和/匹配区别:
    #删除第一个匹配的,且删除最短的那个;
    /替换第一个匹配的,且匹配最长的那个;
    两种范例比较
    zhenxiang@ubuntu:~$ echo $path
    /usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
    zhenxiang@ubuntu:~$ echo ${path/*lightdm/mm}
    mm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
    zhenxiang@ubuntu:~$ echo ${path#*lightdm}
    /lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
     

    总结:对变量的修改格式:${变量|操作符|匹配字符};其中“|”是没有的;操作符有:匹配最少字符的 从左到右删除"#",从右到左删除"%",和匹配最多字符的 "##“  ”%%“ ;和只替换一个的 ”/“  全部替换的 "//"

     
    history
    [root@www ~]# history [-raw] histfiles
    选项与参数:
    n :数字,意思是『要列出最近的 n 笔命令行表』
    -c :将目前的 shell 中的所有 history 内容全部消除
    -a :将目前新增的history 指令新增入 histfiles 中,若没有加 histfiles ,
    则预设写入 ~/.bash_history
    -r :将 histfiles 的内容读取到目前这个 shell 的 history 记忆中;
    -w :将目前的 history 记忆内容写入 histfiles 中!
     
    必须要记好 -c,shell中将没有history内容噢;
     
    HISTSIZE
    shell 记录的命令的条数,也是~/.bash_history记录命令的笔数
    在用户注销退出shell时将最近的命令更新到~/.bash_history当中;
     
    用!command 执行history中最近的指令;比较有效率
    用!number    执行第number行的history指令;
     
    这个!command 甚是好用啊,在同一段时间内有的时候因为种种原因,老要输入同一条命令,比如说博主之前,要程序烧写到板子到中去 make install ttyusb3 ,但是会因为各种原因而烧写不成功,比如说烧写文件权限问题等等,反正当修改好了再次烧写时,对,没错就又要苦逼的 写同样的命令 make install ttyusb3 好烦,有了 !command 这个就好了 直接 !make 后面的事情就交给 history吧;
     
     
    ~/.bash_logout
    当注销时系统自动完成的一些任务,如清屏;当然也可以根据自己的需求定制:如自动备份一些关键文档,或者清空暂存盘之类的工作;
     
    通配符
    *        代表[0个到无穷多个]任意字符
    ?        代表[一定有一个]任意字符
    []       同样代表[ 一定有一个在括号内]的字符(非任意字符),例如[abdc]代表【一定有一个字符,可能是abcd这四个任何一个】
    [-]     代表在编码顺序内的所有字符,如[0-9]代表0到9之间的所以数字
    [^]    表示[反向选择],例如[^abc]代表一定有一个字符,只要是非abc的其他字符
     
    通配符还是很重要的啦,最常用了;可惜博主,还只是最熟悉*,因为他好记嘛,就是任意配就好;
    还是得总结一下:?  []  ^  均是针对一个字符来讲的啦,? 问号当然是随意了,就是任意一个字符,[]任意一个中括号里面的字符  [^]与[]相对是任意一个不是中括号内的字符了;
            -   还是好理解的0-9 很显然的;
     
    范例一:找出 /etc/ 底下以 cron 为开头的档名
    [root@www ~]# ll -d /etc/cron* <==加上 -d 是为了仅显示目录而已
     
    范例二:找出 /etc/ 底下文件名『刚好是五个字母』的文件名
    [root@www ~]# ll -d /etc/????? <==由于 ? 一定有一个,所以五个 ? 就对了
     
    范例三:找出 /etc/ 底下文件名中有数字的文件名
    [root@www ~]# ll -d /etc/*[0-9]* <==记得中括号左右两边均需 *
     
    范例四:找出 /etc/ 底下,档名开头非为小写字母的文件名:
    [root@www ~]# ll -d /etc/[^a-z]* <==注意中括号左边没有 *
     
    范例五:将范例四找到的档案复制到 /tmp 中
    [root@www ~]# cp -a /etc/[^a-z]* /tmp
     
    其他不熟悉特殊符号
    |      管道:分隔两个管线命令的界定
    ;      连续指令下达的分隔符:与管道并不相同
     
    两者区别:
    管线命令仅会处理 standard output,对与 standard error output 会予以忽略
    管线命令必须要能够接受来自前一个指令的数据成为 standard input 继续处理才行。
     
    如:less,cat,head;等可以接受前一个指令数据的是管道命令,而ls cd 等就不是
     
    > ;  >>(standard output)
    数据重定向 覆盖与累加
     
    2> ;2>>(standard error)
    错误数据重定向 覆盖与累加
     
    犯了错误俗称2啦,所以以2开头的重定向当然是错误数据的重定向啦;
     
    <;<<(standard input)
     
    范例一:用 cat 指令来建立一个档案的简单流程
    [root@www ~]# cat > catfile
    testing
    cat file test
    <==这里按下 [ctrl]+d 来离开
    [root@www ~]# cat catfile
    testing
    cat file test
     
    范例二:用 stdin 来代键盘的输入以建立新档案的简单流程
    [root@www ~]# cat > catfile < ~/.bashrc
    [root@www ~]# ll catfile ~/.bashrc
    -rw-r--r-- 1 root root 194 Sep 26 13:36 /root/.bashrc
    -rw-r--r-- 1 root root 194 Feb 6 18:29 catfile
    # 注意看,这两个档案的大小会一模一样!几乎像是使用 cp 来复制一般!
    << 这个连续两个小于的符号了。 他代表的是『结束的输入字符』的意思!举例来讲:『我要用 cat 直接将输入的讯息输出到 catfile 中, 且当由键盘输入 eof 时,该次输入就结束』,那我可以这样做:
    [root@www ~]# cat > catfile << "eof"
    > This is a test.
    > OK now stop
    > eof <==输入这关键词,立刻就结束而不需要输入 [ctrl]+d
    [root@www ~]# cat catfile
    This is a test.
    OK now stop <==只有这两行,不会存在关键词那一行!
     
    双小于号表示结束的输入字符,还是很有意思的;在文档分析的时候也许会用到;
     
    cut
    [root@www ~]# cut -d'分隔字符' -f fields <==用于有特定分隔字符
    [root@www ~]# cut -c 字符区间 <==用于排列整齐的讯息
    选项与参数:
    -d :后面接分隔字符。与 -f 一起使用;
    -f :依据 -d 癿分隔字符将一段讯息分割成为数段,用 -f 取出第几段的意思;
    -c :以字符 (characters) 的单位取出固定字符区间;
     
    grep
    [root@www ~]# grep [-acinv] [--color=auto] '搜寻字符串' filename
    选项与参数:
    -a :将 binary 档案以 text 档案的方式搜寻数据
    -c :计算找到 '搜寻字符串' 的次数
    -i :忽略大小写的不同,所以大小写视为相同
    -n :顺便输出行号
    -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
    --color=auto :可以将找到的关键词部分加上颜色的显示喔!
    重点是-i 这个选项哦,有的时候博主还是常用了;
     
    双向重导向:tee
    tee 会同时将数据流分送到档案与屏幕,其实就是stdout,可以让下一个指令继续处理
    [root@www ~]# tee [-a] file
    选项与参数:
    -a :以累加 (append) 的方式
    注意:file指的是数据保存的文档哦,不是数据流;数据流从标准输入输出中接受;
    在调试代码当中会有需求用到,即想将输出保存下来,又想输出的时候;也许在这种场景会很实用:无线传感网络SINK点回收数据的时候,监听串口数据,即想保存下来,又想实时在屏幕中查看。
    范例:
    [root@localhost ~]# who | tee who.out
    root     pts/0        2009-02-17 07:47 (123.123.123.123)
    [root@localhost ~]# cat who.out
    root     pts/0        2009-02-17 07:47 (123.123.123.123)
    使用者账号登录
    登陆流程
    1. 先找寻 /etc/passwd 里面是否有你输入的账号?如果没有则跳出,如果有的话则将该账号对应的UID 与GID (在 /etc/group 中) 读出来,另外,该账号的家目录与 shell 设定也一并读出;
    2. 再来则是核对密码表啦!这时 Linux 会进入 /etc/shadow 里面找出对应的账号与 UID,然后核对一下你刚刚输入的密码与里头的密码是否相符?
    3. 如果一切都 OK 的话,就进入 Shell 控管的阶段啰!
     
    /etc/passwd档案结构
    [root@www ~]# head -n 4 /etc/passwd
    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
    每一行使用 :分隔共有七个东东分别是:
    1. 账号名称:就是账号啦!用来对应 UID 的。例如 root 的UID 对应就是 0 (第三字段);
     
    2. 密码:早期 Unix 系统的密码就是放在这字段上!但是因为这个档案的特性是所有的程序都能够读取,这样一来很容易造成密码数据被窃取, 因此后来 就将这个字段的密码数据给他改放到
    /etc/shadow 中了。所以这里你会看到一个『x 』。
     
    3. UID:
    0             当UID是0时,代表这个账号是系统管理员,所以当你要让其他的账号名称也具有root的权限时,将该账号的UID改为0即可;
    1-99        由distribution自行建立的系统账号
    100-499   当用户有系统账号需求时,可以用的UID
    500-65535  给一般使用者用的
     
    4. GID:
    这个与 /etc/group 有关!其实 /etc/group 的观念与 /etc/passwd 差不多,只是他是用来规范组名与 GID 的对应而已!
     
    5.用户信息说明:
    用户信息说明栏:这个字段基本上幵没有什么重要用途,只是用来解释这个账号的意义而已
     
    6. 家目录:
    这是用户的家目录,以上面为例, root 的家目录在 /root ,所以当 root 登入之后,就会立刻跑到 /root 目录里头啦!呵呵! 如果你有个账号的使用空间特别的大,你想要将该账号的家目录移动到其他的硬盘去该怎么做? 没有错!可以在这个字段进行修改呦!默认的用户家目录在/home/yourIDname
     
    7. Shell:
    那为何预设shell 会使用 bash 呢?就是在这个字段指定的啰! 这里比较需要注意的是,有一个 shell 可以用来替代成让账号无法取得 shell 环境的登入动作!那就是/sbin/nologin 这个东西!
     
    /etc/shadow
    [root@www ~]# head -n 4 /etc/shadow
    root:$1$/30QpE5e$y9N/D0bh6rAACBEz.hqo00:14126:0:99999:7::: <==底下说明用
    bin:*:14126:0:99999:7:::
    daemon:*:14126:0:99999:7:::
    adm:*:14126:0:99999:7:::
    shadow同样以【:】分隔,共有九个字段分别是:
    1.账号名称
     
    2.密码
     
    3. 最近更动密码的日期:
    值得注意的是日期时间从1970年1月1日作为1,到1971年1月1日为366
     
    4.密码不可被更动的天数:
    (与第 3 字段相比)第四个字段让录了:这个账号的密码在最近一次被更改后需要经过几天才可以再被变更!如果是0 的话, 表示密码随时可以更动的意思。
     
    5. 密码需要重新变更动天数:
    (与第 3 字段相比) 你必须要在这个天数内重新设定你的密码,否则这个账号的密码将会『变为过期特性』 。
     
    6.密码需要变更期限前的警告天数:
    (与第 5 字段相比)当账号的密码有效期限快要到的时候 (第 5 字段),系统会依据这个字段的设定,发出『警告』给这个账号,提醒他『再过 n 天你的密码就要过期了,请尽忚重新设定你的密码』
     
    7. 密码过期后的账号宽限时间(密码失效日)
     
    8. 账号失效日期:
    将数据加入 file 当中!
    9. 保留:
     
    注意密码过期与失效有差异,密码过期其实仍能使用,且在登录的时候系统强行要求更改密码;而密码失效则无法再使用;
    所以学校那些登陆之后,强制要求更改密码的,就是利用密码过期强行要求更改密码这个效果,下面做个小实验:
    1.创建一个账户,并设置初始密码为000000;2.当用户登陆时,强制用户更改密码;
    范例一:建立一个名为 agetest的账号,该账号第一次登入后使用默认密码,
    但必须要更改过密码后,使用新密码才能够登入系统使用 bash 环境
    [root@www ~]# useradd agetest
    [root@www ~]# echo "000000" | passwd --stdin agetest
    [root@www ~]# chage -d 0 agetest
    # 此时此账号的密码建立时间会被改为 1970/1/1 ,所以会有问题!
    范例二:尝试以 agetest 登入的情况
    You are required to change your password immediately (root enforced)
    WARNING: Your password has expired.
    You must change your password now and login again!
    Changing password for user agetest.
    Changing password for agetest
    (current) UNIX password: <==这个账号被强制要求必须要改密码!

    问题:

    要使用户登陆,则立刻需要更改密码;用到密码过期系统强行要求更改密码;这样自然想到更改第5个字段,密码需要重新变更的天数到了天数就会过期,那么为什么将第五字段设置为与第三字段一样,达不到立即失效的效果呢?

     
     
    关于群组
    /etc/group档案结构
    [root@www ~]# head -n 4 /etc/group
    root:x:0:root
    bin:x:1:root,bin,daemon
    daemon:x:2:root,bin,daemon
    sys:x:3:root,bin,adm
    每一行代表一个群组,以:作为字段分隔符,总共四栏:
    1. 组名
     
    2. 群组密码
     
    3. GID
    就是群组的 ID 我们 /etc/passwd 第四个字段使用的GID 对应的群组名,就是由这里对应出来的!
     
    4.次群组支持的账号名称
    我们知道一个账号可以加入多个群组,那某个账号想要加入此群组时,将该账号填入这个字段即可。 如果我想要将 dmtsai 也加入 root 这个群组,那举在第一行的最后面加上『 ,dmtsai』,注意不要有空格, 使成为『root:x:0:root,dmtsai 』就可以啰~
     
    每个使用者都可以拥有多个支持的群组,那么在操作时以哪个群组为准呢?
    那么就涉及到   有效群组的概念
     
    有效群组(effective group)与初始群组(initial group)
    每个使用者在他的 /etc/passwd 里面的第四栏有所谓的 GID 吧?那个 GID 就是所谓的『初始群组 (initial group) 』!也就是说,当用户一登入系统,立刻就拥有这个群组的相关权限的意思
     
    初始群组即 在 /etc/passwd中第四个字段设定的群组ID,也就是GID;
    在 /etc/group中在某个群组中增加了,组员,组员也获得群组号;
     
    [dmtsai@www ~]$ groups
    dmtsai users
    第一个便是有效群组,
     
    newgrp:有效群组的切换
    想要切换的群组必须是你已经有支持的群组;
    范例:
    [dmtsai@www ~]$ newgrp users
    [dmtsai@www ~]$ groups
    users dmtsai
     
    账号管理
    useradd:
    [root@www ~]# useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM] [-c 说明栏] [-d 家目录绝对路径] [-s shell]  使用者账号名
    可以指定 UID  GID 及次要群组,有没有家目录及家目录是什么,
     
    范例一:完全参考默认值建立一个用户,名称为 vbird1
    [root@www ~]# useradd vbird1
     
    范例二:假设我已知道我的系统当中有个组名为 users ,且UID 700 不存在
    请用 users 为初始群组,以及 uid 为 700 来建立一个名为 vbird2 的账号
    [root@www ~]# useradd -u 700 -g users vbird2
    [root@www ~]# ll -d /home/vbird2
    drwx------ 4 vbird2 users 4096 Feb 25 09:59 /home/vbird2
    [root@www ~]# grep vbird2 /etc/passwd /etc/shadow /etc/group
    /etc/passwd:vbird2:x:700:100::/home/vbird2:/bin/bash
    /etc/shadow:vbird2:!!:14300:0:99999:7:::
      # 看一下,UID 与 initial group 确实改变成我们需要的了!
      /home/vbird1
     
    范例三:建立一个系统账号,名称为 vbird3
    [root@www ~]# useradd -r vbird3
    [root@www ~]# ll -d /home/vbird3
    ls: /home/vbird3: No such file or directory <==不会主动建立家目录
    [root@www ~]# grep vbird3 /etc/passwd /etc/shadow /etc/group
    /etc/passwd:vbird3:x:100:103::/home/vbird3:/bin/bash
    /etc/shadow:vbird3:!!:14300::::::
     
    那么useradd默认参考值从来哪呢?
    useradd参考档案 /etc/default/useradd
    [root@www ~]# useradd -D
    GROUP=100 <==预设的群组
    HOME=/home <==默认的家目录所在目录
    INACTIVE=-1 <==密码失效日,在 shadow 内的第 7 栏
    EXPIRE= <==账号失效日,在 shadow 内的第 8 栏
    SHELL=/bin/bash <==预设的 shell
    SKEL=/etc/skel <==用户家目录的内容数据参考目录
    CREATE_MAIL_SPOOL=yes <==是否主劢帮使用者建立邮件信箱(
     
    GROUP=100 mailbox)
    新建用户初始群组的两种不同机制:
    私有群组机制:系统会建立一个与账号一样的群组给使用者作为初始群组。 这种群组设训定机制会比较有保密性,这是因为使用者都有自己的群组,而且家目录权限将会设定为700 (仅有自己可进入自己的家目录)。使用这种机制将不会参考 GROUP=100 这个设定值。代表性的 distributions 有 RHEL, Fedora, CentOS 等;
     
    公共群组机制:就是以 GROUP=100 这个设定值作为新建账号的初始群组,因此每个账号都属于 users 这个群组, 但默认家目录通常的权限会是『drwxr-xr-x ... usernameusers ... 』,由于每个账号都属亍 users 群组,因此大家都可以互相分享家目录内的数据。代表 distributions 如 SuSE 等。
     
    SKEL=/etc/skel 
    若在 该目录下 增加www这个目录,则之后创建的用户家目录中均会有www这个目标;
     
    除了基本的账号设定值外,UID/GID密码参数,范围参数就是参照
    /etc/login.defs 
     
    所以使用useradd程序建立Linux上的账号时,至少会参照:
    /etc/default/useradd
    /etc/login.defs
    /etc/skle/*
     
    passwd
    两种情况:root 帮忙设定密码;自己设定自己密码;
     
    自动化脚本中使用
    范例三:使用 standard input 建立用户的密码
    [root@www ~]# echo "abc543CC" | passwd --stdin vbird2
    Changing password for user vbird2.
    passwd: all authentication tokens updated successfully.
    这个动作会直接更新用户的密码而不用再次的手动输入!好处是方便处理,缺点是这个密码会保留在指令中, 未来若系统被攻破,人家可以在 /root/.bash_history 找到这个密码呢!所以这个动作通常仅用在 shell script 的大量建立使用者账号当中!要注意的是,这个选项并不存在所有 distributions 版本中。
     
    当然passwd,可以规定密码变更,失效的天数;也可以立即失效于立即恢复,详细当然要看 man passwd;
     
    chage
    除了使用 passwd -S 之外,有没有更详细的密码参数显示功能呢?有的!那就是 chage 了! 具体方法参照man chage;
     
    不错的功能:
    使用者在第一次登陆之后,强制一定要更改密码之后才能够使用系统资源;
    范例一:建立一个名为 agetest 的账号,该账号第一次登入后使用默认密码,
    但必须要更改过密码后,使用新密码才能够登入系统使用 bash 环境
    [root@www ~]# useradd agetest
    [root@www ~]# echo "agetest" | passwd --stdin agetest
    [root@www ~]# chage -d 0 agetest
    # 此时此账号的密码建立时间会被改为 1970/1/1 ,所以会有问题!
    范例二:尝试以 agetest 登入的情况
    You are required to change your password immediately (root enforced)
    WARNING: Your password has expired.
    You must change your password now and login again!
    Changing password for user agetest.
    Changing password for agetest
    (current) UNIX password: <==这个账号被强制要求必须要改密码!
     
    userdel
    [root@www ~]# userdel [-r] username
    选项不参数:
    -r :连同用户的家目录也一起删除
     
    finger
    这个 finger 可以查阅很多用户相关的信息喔! 大部分都是在 /etc/passwd 这个档案里面的信息啦!
     
    范例一:观察 vbird1 的用户相关账号属性
    [root@www ~]# finger vbird1
    Login: vbird1 Name: (null)
    Directory: /home/vbird1 Shell: /bin/bash
    Never logged in.
    No mail.
    No Plan.
     
    范例三:找出目前在系统上面登入的用户与登入时间
    [vbird1@www ~]$ finger
     
    chsh
    change shell 的缩写
    [vbird1@www ~]$ chsh [-ls]
    选项不参数:
    -l :列出目前系统上面可用的 shell ,其实就是 /etc/shells 的内容!
    -s :设定修改自己的 Shell 啰
    不论是 chfn 或 chsh ,都是能够让一般用户修改 /etc/passwd 这个系统文件的!所以你猜猜,这两个档案的权限是什么? 一定是 SUID 的功能啦
     
     
    新增与移除群组:
    基本上两个文档的事情:/etc/group  ;/etc/gshadow
    [root@www ~]# groupadd [-g gid] [-r] 组名
    选项与参数:
    -g :后面接某个特定的 GID ,用来直接给予某个 GID ~
    -r :建立系统群组啦!与 /etc/login.defs 内的 GID_MIN 有关。
     
    groupadd
    范例一:新建一个群组,名称为 group1
    [root@www ~]# groupadd group1
    [root@www ~]# grep group1 /etc/group /etc/gshadow
    /etc/group:group1:x:702:
    /etc/gshadow:group1:!::
    不加参数默认:GID由500以上最大的GID+1;
     
    groupmod
    [root@www ~]# groupmod [-g gid] [-n group_name] 群组名
    选项与参数:
    -g :修改既有的 GID 数字;
    -n :修改既有的组名
     
    范例一:将刚刚上个指令建立的 group1 名称改为 mygroup,GID 为 201
    [root@www ~]# groupmod -g 201 -n mygroup group1
    [root@www ~]# grep mygroup /etc/group /etc/gshadow
    /etc/group:mygroup:x:201:
    /etc/gshadow:mygroup:!::
     
    groupdel
    范例一:将刚刚的 mygroup 删除!
    [root@www ~]# groupdel mygroup
     
    gpasswd:群组管理员功能
    # 关于系统管理员(root)做的动作:
    [root@www ~]# gpasswd groupname
    [root@www ~]# gpasswd [-A user1,...] [-M user3,...] groupname
    [root@www ~]# gpasswd [-rR] groupname
    选项与参数:
    :若没有任何参数时,表示给予 groupname 一个密码(/etc/gshadow)
    -A :将 groupname 的主控权交由后面的使用者管理(该群组的管理员)
    -M :将某些账号加入这个群组当中!
    -r :将 groupname 的密码移除
    -R :让 groupname 的密码栏失效
     
    # 关于群组管理员(Group administrator)做的动作:
    [someone@www ~]$ gpasswd [-ad] user groupname
    选项与参数:
    -a :将某位使用者加入到 groupname 这个群组当中!
    -d :将某位使用者移除出 groupname 这个群组当中。
     
    ACL  Access Control List
    那 ACL 主要可以针对哪些方面来控制权限呢?他主要可以针对几个项目:
     使用者 (user):可以针对使用者来设定权限;
     群组 (group):针对群组为对象来设定其权限;
     默认属性 (mask):还可以针对在该目录下在建立新档案/目录时,规范新数据的默认权限;
    [root@www ~]# touch acl_test1
    [root@www ~]# ll acl_test1
    -rw-r--r-- 1 root root 0 Feb 27 13:28 acl_test1
    [root@www ~]# setfacl -m u:vbird1:rx acl_test1
    [root@www ~]# ll acl_test1
    -rw-r-xr--+ 1 root root 0 Feb 27 13:28 acl_test1
    # 权限部分多了个 + ,且不原本的权限 (644) 看起来差异很大!
     
    • 使用chown命令可以修改文件或目录所属的用户:

           命令:chown 用户 目录或文件名

           例如:chown qq /home/qq  (把home目录下的qq目录的拥有者改为qq用户) 

    使用chgrp命令可以修改文件或目录所属的组:

           命令:chgrp 组 目录或文件名

           例如:chgrp qq /home/qq  (把home目录下的qq目录的所属组改为qq组)

    chown 还可以将所属群组和所属用户一起改了

    chown newuser:newgroup /home/qq

     
    总结
    • read:读取键盘输入
      • read -p 'please keyin your name:' -t 15 named
    • ulimit
      • user limit 限制用户的某些系统资源,可开启的档案数,使用CPU的时间,使用内存的总量
    • 变量内容的删除
      • #:从左往右删除第一个匹配;且是删除符合条件的最短的那一个;
        • echo ${path#*lig*}
      • ##:从左往右删除第一个匹配;且是删除符合条件的最长的哪一个
      • %:从右往左删除第一个匹配,且是删除符合条件的最短的哪一个
      • %%:从右 往左 删除第一个匹配;且是删除符合条件的最长的哪一个
    • 变量内容的替换
      • ${变量/旧字符串/新字符串}: 若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串取代』
      • ${变量//旧字符串/新字符串}: 若发量内容符合『旧字符串』则『全部的旧字符串会被新字符串取代』
    • #和/匹配区别
      • #删除第一个匹配的,且删除最短的那个;
      • /替换第一个匹配的,且匹配最长的那个;
    • history
      • -c ,清楚当前history全部内容
      • !command 执行history最近的指令。
      • !number    执行第number行的history指令。
    • 通配符
      • *  代表0个到无穷多个任意字符
      • ?  代表一定有一个任意字符
      • [] 代表一定有一个在括号内的字符
      • [-]代表在编码顺序内的所有字符,如[0-9]代表0-9之间的所有数字
      • [^]表示反向选择,[^abc],一定有一个非abc的字符
      • 除* - 以外,都是针对一个字符来说的。
    • 数据重定向覆盖于累加分别是
      • > 覆盖,>> 累加
      • 2>;2>>  错误数据的重定向覆盖与累加
    • << 结束的输入字符
    • 常用命令
      • cut
        • cut -d '分隔字符' -f field  ====用于有特定分隔字符
      • grep
        • grep [-acinv] [--color=auto] '搜寻字符串' filename
      • tee  双向重导向,同时将数据流分送到档案与屏幕
        • who | tee  who.out
    • /etc/passwd档案结构
      • 账号名:密码:UID:GID:说明:家目录:shell
      • root:x:0:0:root:/root:/bin/bash
    • /etc/shadow档案结构
      • 账户名称:密码:最近更改密码时间:密码不可变动时间:密码需要重新变动时间:密码需要变更期限前警告天数:密码过期后的账号宽限时间(密码失效日):账号失效日期:保留
      • root:$1$/30QpE5e$y9N/D0bh6rAACBEz.hqo00:14126:0:99999:7:::
      • 创建一个账户,设置初始密码000,当用户登录时,强制更改密码、
        • useradd agetest;echo "000000" | passwd --stdin agetest
        • chage -d 0 agetest;#此时此账号的密码建立时间会被改为 1970/1/1 ,所以会有问题!
    • /etc/group档案结构
      • 组名:群组密码:GID:此群组支持的账号名称
      • bin:x:1:root,bin,daemon
    • 有效群组与初始群组
      • 初始群组,就是/etc/passwd第四字段GID;当用户登录之后就会获得初始群组的相关权限。
      • 而如果需要切换成其他群组,获得其他群组的权限时。需切换;
      • 例子:
        [dmtsai@www ~]$ groups
        dmtsai users
        #第一个便是有效群组
        [dmtsai@www ~]$ newgrp users
        [dmtsai@www ~]$ groups
        users dmtsai
    • 账号管理
      • useradd
        • useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM] [-c 说明栏] [-d 家目录绝对路径] [-s shell]  使用者账号名
        • useradd默认配置文件/etc/default/useradd
      • userdel
      • passwd
        •   echo "abc543CC" | passwd --stdin vbird2
      • groupadd
      • groupdel
      • gpasswd 群组管理员功能
        • root动作
          • gpasswd  groupname 给群组一个密码
          • gpasswd -A user         任命群管理员
          • gpasswd -M user1,user2  将某些账号加入群组
          • gpasswd -r groupname    将群组密码移除
          • gpasswd -R groupname    将群组密码失效
        • 群管理员动作
          • gpasswd [-ad] user groupname 增加/移除群组成员
      • chown、chgrp
        • chown newuser:newgrop /home/qq 同时更改属主和群组
  • 相关阅读:
    关闭Windows的CTRL+ALT+DEL 和 ALT+TAB组合键的方法
    VC中常用文件操作(一)
    VC 创建NT服务程序
    几个操作文件的API函数
    VC中常用文件操作(二) ——INI文件操作
    初学OpenCV之图像坐标读取函数cvGet2D()
    OpenCV学习之图像读取与显示
    SLT容器之vector简单实现C++运行时多态
    C/C++文件——数据写入、读取
    OpenCV学习之视频读取与帧的提取、显示及保存
  • 原文地址:https://www.cnblogs.com/Aiapple/p/4896911.html
Copyright © 2011-2022 走看看