鸟哥私房菜第十一章
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.
> 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
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
[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 ~]# 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/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 ~]# 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!
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.
[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:
[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 [-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
[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
- cut
- /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 增加/移除群组成员
- root动作
- chown、chgrp
- chown newuser:newgrop /home/qq 同时更改属主和群组
- useradd