当前位置: 首页 > news >正文

三、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加入的所有组

相关文章:

  • 三、Linux入门之文件权限
  • 二、Linux入门之VIM编辑器
  • 四、Linux入门之文件查看命令
  • 4、Linux入门之文本处理小练习
  • 五、Linux入门之文件查找与打包解压缩
  • Linux入门之文本处理三剑客grep、sed、akw
  • 5、Linux入门之小练习
  • Linux入门之正则表达式
  • 七、Linux入门之软件包管理
  • 七、Linux入门之磁盘存储和文件系统
  • 7、Linux入门之小练习
  • 十、Linux入门之Shell进阶
  • tekla钢结构算量_【BIM应用案例】钢结构第一楼:天津117大厦!
  • matlab 加入高频噪声_电路中共模噪声的产生和抑制机理
  • 类图中表达总体与局部的关系_游戏中的亲密关系表达
  • [译]CSS 居中(Center)方法大合集
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 〔开发系列〕一次关于小程序开发的深度总结
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • golang 发送GET和POST示例
  • Java新版本的开发已正式进入轨道,版本号18.3
  • js继承的实现方法
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • PHP 小技巧
  • php面试题 汇集2
  • vue--为什么data属性必须是一个函数
  • 复杂数据处理
  • 后端_ThinkPHP5
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 如何利用MongoDB打造TOP榜小程序
  • 温故知新之javascript面向对象
  • 我看到的前端
  • 一文看透浏览器架构
  • ​业务双活的数据切换思路设计(下)
  • # 安徽锐锋科技IDMS系统简介
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • $(selector).each()和$.each()的区别
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (BFS)hdoj2377-Bus Pass
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (算法)前K大的和
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)memcache、redis缓存
  • (转)nsfocus-绿盟科技笔试题目
  • ***监测系统的构建(chkrootkit )
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .net wcf memory gates checking failed
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET和.COM和.CN域名区别
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • /bin/rm: 参数列表过长"的解决办法
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决