鸟哥私房菜第十一章
 
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 同时更改属主和群组
posted on 2015-10-21 09:38  Aiapple  阅读(270)  评论(0编辑  收藏  举报