三、Linux入门之标准I/O重定向、管道、用户管理
标准I/O重定向
标准输入/输出
程序:指令+数据
读入数据:Input
输出数据:Output
打开的文件都有一个fd: file descriptor(文件描述符)。
Linux给程序提供三种 I/O 设备
标准输入(STDIN)-0 默认接受来自键盘的输入
标准输出(STDOUT)-1 默认输出到终端窗口
标准错误(STDERR)-2 默认输出到终端窗口
标准输出重定向
即改变默认输入/输出位置
把输出和错误重新定向到文件
STDOUT和STDERR可以被重定向到文件
命令 操作符号 文件名
支持的操作符号包括:
把STDOUT重定向到文件
2> 把STDERR重定向到文件
&> 把所有输出重定向到文件
> 文件内容会被覆盖
set -C 禁止将内容覆盖已有文件,但可追加
> >| file 强制覆盖
set +C 允许覆盖
>> 把输出追加到文件
2> 覆盖重定向错误输出数据流
2>> 追加重定向错误输出数据流
标准输出和错误输出各自定向至不同位置
COMMAND > /path/to/file.out 2> /path/to/error.out
如:skfsfj > f1.txt 2 > f2.txt 正确的信息输出到f1.txt,错误信息输出到f2.txt
echo aa > f1.txt > 2>f2.txt 会将aa输出到f1.txt文件中 合并标准输出、标准错误进行重定向输出到同一个文件中
&> 覆盖重定向
COMMAND > /path/to/file.out 2>&1 (顺序很重要)
&>> 追加重定向
COMMAND >> /path/to/file.out 2>&1
():合并多个程序的STDOUT
( cal 2007 ; cal 2008 ) > all.txt
输入重定向
使用 "<" 来重定向标准输入
某些命令能够接受从文件中导入的STDIN
tr ‘a-z’ ‘A-Z’< /etc/issue 该命令会把/etc/issue中的小写字符都转换成大写字符
tr –d abc < /etc/fstab 删除fstab文件中的所有abc中任意字符
cat > file
>mage
>wangxiaochun
按ctrl+d离开,可以使用文件来代替键盘的输入
cat < file1 > file2
cat < file1 >> file1
使用“<< 终止词”命令从键盘把多行重导向给STDIN,直到终止词位置的所有文本都发送给STDIN
有时被称为就地文本(here documents)
mail -s "Please Call" admin@magedu.com <<END
> Hi Wang
>
>Please give me a call when you get in. We may need
> to do some maintenance on server1.
>
>Details when you're on-site
> Zhang
> END
tr命令
字符替换或删除
tr [OPTION]... SET1 [SET2]
选项:
-c -C --complement:取字符集的补集
-d --delete:删除所有属于第一字符集的字符
-s --squeeze-repeats:把连续重复的字符以单独一个字符表示
-t --truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符
示例:
tr abc 123 回车进入交互输入模式,输入的字符遇到a、b、c会被1、2、3对应替换掉
tr -d ‘abc’ < /data/f1.txt 重定向输入读取文件内容,将读取到的内容中的“abc”字符串删除
tr -dc ‘abc’ < /data/f1.txt 重定向输入读取文件内容,将读取到的内容中不是“abc”字符串删除,
tr [[:lower:]] [[:upper:]] < /etc/issue > /tmp/issue.out 通过重定向输入读取文件内容并将所有小写字母转成大写母,重定向输出存放到/tmp/issue.out文件
[:alnum:]:字母和数字 [:alpha:]:字母
[:cntrl:]:控制(非打印)字符 [:digit:]:数字
[:graph:]:图形字符 [:lower:]:小写字母
[:print:]:可打印字符 [:punct:]:标点符号
[:space:]:空白字符 [:upper:]:大写字母
[:xdigit:]:十六进制字符
管道
管道(使用符号“|”表示)用来连接命令
格式:命令1 | 命令2 | 命令3 | …
将命令1的STDOUT发送给命令2的STDIN,命令2的STDOUT发送到命令3的STDIN
STDERR默认不能通过管道转发,可利用2>&1 或 |& 实现
最后一个命令会在当前shell进程的子shell进程中执行
组合多种工具的功能
示例:
ls | tr ‘a-z’ ‘A-Z’
less :一页一页地查看输入
ls -l /etc | less
mail: 通过电子邮件发送输入
echo "test email" | mail -s "test" wang@example.com
bc:算术运算
echo "2^3" |bc
管道中“-”符号
示例:将 /home 里面的文件打包,但打包的数据不是记录到文件,而是传送到 stdout,经过管道后,将 tar -cvf - /home 传送给后面的 tar -xvf - , 后面的这个 - 则是取前一个命令的 stdout, 因此,就不需要使用临时file了
如:tar -cvf - /home | tar -xvf –
重定向到多个目标(tee)
命令1 | tee [-a ] 文件名 | 命令2
把命令1的STDOUT保存在文件中,并做为命令2的输入
如:hostname |tee /data/f2.log 将结果输出到终端并保存到文件中
-a 追加
如:hostname |tee -a /data/f2.log 将结果输出到终端并追加到文件中
使用:
保存不同阶段的输出
复杂管道的故障排除
同时查看和记录输出
练习
1、 将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中
答:tr ‘[[:lower:]]’ ‘[[:upper:]]’ < /etc/issue > /tmp/issue.out
2、 将当前系统登录用户的信息转换为大写后保存至/tmp/who.out文件中
答:whoami | tr [[:lower:]] [[:upper:]] > /tmp/who.out
3、一个linux用户给root发邮件,要求邮件标题为”help” ,邮件正文如下:
Hello, I am 用户名,
The system version is here,please help me to check it ,thanks!
操作系统版本信息
答:mail -s “help” root << END
> Hello, I am ·whoami`,
> The system version is here,please help me to check it ,thanks!
>`uname -a`
>END
4、将/root/下文件列表,显示成一行,并文件名之间用空格隔开
答:ls -al /root/ | tr ‘\n’ ‘ ‘
5、计算1+2+3+...+99+100的总和
答: echo {1..100} | tr ‘ ‘ ‘+’ | bc 或 seq -s+ 100 | bc
6、删除Windows文本文件中的回车字符 ,即“\r”
答:tr -d “\r” < f1.txt
7、处理字符串“xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4”,只保留其中的数字和空格
答:echo “xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4” | tr -d ‘[[:alpha:][:punct:]]’
8、将PATH变量每个目录显示在独立的一行
答:echo $PATH | tr ‘:’ ‘\n’
9、 将指定文件中0-9分别替代成a-j
答:tr “[[:digit:]]” “[a-j]” < f1.txt
10、将文件/etc/centos-release中每个单词(由字母组成)显示在独立一行,并无空行
答:tr -s ‘[ ()]’ ‘\n’ < /etc/centos-release
安全3A
资源分派:
Authentication:认证
Authorization:授权
Accouting|Audition:审计
安全上下文
运行中的程序:进程 (process),以进程发起者的身份运行:
root: /bin/cat
mage: /bin/cat
进程所能够访问资源的权限取决于进程的运行者的身份
用户管理
令牌token,identity
Linux用户:Username/UID
类型:
管理员:root, 0
普通用户:1-60000 自动分配
系统用户:1-499(CentOS6), 1-999 (CentOS7)
对守护进程获取资源进行权限分配
登录用户:500+(CentOS6), 1000+(CentOS7)交互式登录
用户管理的相关配置文件
/etc/passwd:用户及其属性信息(名称、 UID、主组ID等)
/etc/shadow:用户密码及其相关属性
passwd文件格式:
login name:登录用名(wang)
passwd:密码 (x)
UID:用户身份编号 (1000)
GID:登录默认所在组编号 (1000)
GECOS:用户全名或注释
home directory:用户主目录 (/home/wang)
shell:用户默认使用shell (/bin/bash)
shadow文件格式
登录用名
用户密码:一般用sha512加密
从1970年1月1日起到密码最近一次被更改的时间
密码再过几天可以被变更(0表示随时可被变更)
密码再过几天必须被变更(99999表示永不过期)
密码过期前几天系统提醒用户(默认为一周)
密码过期几天后帐号会被锁定
从1970年1月1日算起,多少天后帐号失效
配置文件管理命令:
vipw :打开并编辑passwd文件
pwck:检测passwd文件格式
密码期限:
密码加密
加密机制:
加密:明文--> 密文
解密:密文--> 明文
单向加密:哈希算法,原文不同,密文必不同
相同算法定长输出,获得密文不可逆推出原始数据
雪崩效应:初始条件的微小改变,引起结果的巨大改变
md5: message digest, 128bits
sha1: secure hash algorithm, 160bits
sha224: 224bits
sha256: 256bits
sha384: 384bits
sha512: 512bits
更改加密算法:
authconfig --passalgo=sha256 –update
密码的复杂性策略
使用足够长的字符串
使用数字、大写字母、小写字母及特殊字符中至少3种
使用随机密码
定期更换,不要使用最近曾经使用过的密码
用户管理命令
用户创建:useradd
useradd [options] LOGIN
选项:
-u:指定UID
-o:配合-u 选项,不检查UID的唯一性
-g:GID,指明用户所属基本组,可为组名,也可以GID
-c:"COMMENT“ 用户的注释信息
-d:HOME_DIR 以指定的路径(不存在)为家目录
-s:SHELL 指明用户的默认shell程序,可用列表在/etc/shells文件中
-G:GROUP1[,GROUP2,...] 为用户指明附加组,组须事先存在
-N:不创建私用组做主组,使用users组做主组
-r:创建系统用户 CentOS 6: ID<500,CentOS 7: ID<1000
-m:创建家目录,用于系统用户
-M:不创建家目录,用于非系统用户
默认值设定:/etc/default/useradd
显示或更改默认设置
useradd -D
useradd –D -s SHELL
useradd –D –b BASE_DIR
useradd –D –g GROUP
新建用户的相关文件和命令
/etc/default/useradd
/etc/skel/*
/etc/login.defs
newusers passwd格式文件 批量创建用户
chpasswd 批量修改用户口令
修改用户信息:usermod
usermod [OPTION] login
选项:
-u UID:修改用户的UID
-g GID:修改用户的新主组
-G GROUP1[,GROUP2,...[,GROUPN]]]:新附加组,原来的附加组将会被覆盖;若保留原有,则要同时使用-a选项
-s SHELL:新的默认SHELL
-c 'COMMENT':新的注释信息
-d HOME: 新家目录不会自动创建;若要创建新家目录并移动原家数据,同时使用-m选项
-l login_name:新的名字
-L: lock指定用户,在/etc/shadow 密码栏的增加 !
-U: unlock指定用户,将 /etc/shadow 密码栏的 ! 拿掉
-e YYYY-MM-DD: 指明用户账号过期日期
-f INACTIVE: 设定非活动期限
删除用户userdel
userdel [OPTION]... login
选项:
-r: 删除用户家目录
查看用户相关的ID信息
id [OPTION]... [USER]
-u: 显示UID
-g: 显示GID
-G: 显示用户所属的组的ID
-n: 显示名称,需配合ugG使用
切换用户或以其他用户身份执行命令
su [options...] [-] [user [args...]]
切换用户的方式:
su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录
su - UserName:登录式切换,会读取目标用户的配置文件,切换至家目录,完全切换
root su至其他用户无须密码;非root用户切换时需要密码
换个身份执行命令:
su [-] UserName -c 'COMMAND'
选项:
-l --login
su -l UserName 相当于 su – UserName
设置密码:
passwd [OPTIONS] UserName: 修改指定用户的密码
常用选项:
-d:删除指定用户密码
-l:锁定指定用户
-u:解锁指定用户
-e:强制用户下次登录修改密码
-f:强制操作
-n mindays:指定最短使用期限,即超过这个时间才允许修改密码
-x maxdays:最大使用期限,即密码过期时间
-w warndays:提前多少天开始警告
-i inactivedays:非活动期限
--stdin:从标准输入接收用户密码
示例:echo "PASSWORD" | passwd --stdin USERNAME
修改用户密码策略
chage [OPTION]... LOGIN
选项:
-d LAST_DAY
-E --expiredate EXPIRE_DATE
-I --inactive INACTIVE
-m --mindays MIN_DAYS
-M --maxdays MAX_DAYS
-W --warndays WARN_DAYS
-l 显示密码策略
示例:
chage -d 0 tom 下一次登录强制重设密码
chage -m 0 –M 42 –W 14 –I 7 tom
chage -E 2016-09-10 tom
用户相关的其它命令
chfn 指定个人信息
chsh 指定shell
finger
组group管理
Linux组:Groupname/GID
管理员组:root, 0
普通组:
系统组:1-499, 1-999(CENTOS7)
普通组:500+, 1000+(CENTOS7)
Linux组的类别
用户的主要组(primary group),用户必须属于一个且只有一个主组,组名与用户名相同,且仅包含一个用户,私有组
用户的附加组(supplementary group),一个用户可以属于零个或多个辅助组
组的相关配置文件
/etc/group:组及其属性信息
/etc/gshadow:组密码及其相关属性
group文件格式:
群组名称:就是群组名称
群组密码:通常不需要设定,密码是被记录在 /etc/gshadow
GID:就是群组的 ID
以当前组为附加组的用户列表(分隔符为逗号)
gshdow文件格式
群组名称:就是群的名称
群组密码:
组管理员列表:组管理员的列表,更改组密码和成员
以当前组为附加组的用户列表:多个用户间用逗号分隔
配置文件管理命令:
vigr:编辑group文件
grpck:检查group文件格式
创建组:groupadd
groupadd [OPTION]... group_name
选项:
-g GID:指明GID号;[GID_MIN, GID_MAX]
-r:创建系统组,CentOS 6: ID<500,CentOS 7: ID<1000
修改组:groupmod
组属性修改:groupmod
groupmod [OPTION]... group
选项:
-n group_name: 新名字
-g GID: 新的GID
删除组:groupdel
groupdel GROUP
更改组密码:gpasswd
gpasswd [OPTION] GROUP
选项:
-a user 将user添加至指定组中
-d user 从指定组中移除用户user
-A user1,user2,... 设置有管理权限的用户列表
newgrp命令:
临时切换主组,如果用户本不属于此组,则需要组密码
更改组成员
groupmems [options] [action]
选项:
-g, --group groupname 更改为指定组 (只有root)
-a, --add username 指定用户加入组
-d, --delete username 从组中删除用户
-p, --purge 从组中清除所有成员
-l, --list 显示组成员列表
查看组成员
groups [OPTION].[USERNAME]... 查看用户所属组列表
示例:groups admin #查看admin加入的所有组