如何查看网站域名,wordpress主题去版权乱码,wordpress 个人简介,网站多语言2.文件基本操作【文件操作#xff08;一#xff09;】
目标 理解Linux下路径的表示方法能够使用命令(mkdir和touch)在指定位置创建目录和文件能够使用命令(rm)删除指定的目录和文件能够使用命令(ls)列出目录里的文件能够使用命令(cat,head,tail,less,more)查看文件内容理解标… 2.文件基本操作【文件操作一】
目标 理解Linux下路径的表示方法能够使用命令(mkdir和touch)在指定位置创建目录和文件能够使用命令(rm)删除指定的目录和文件能够使用命令(ls)列出目录里的文件能够使用命令(cat,head,tail,less,more)查看文件内容理解标准输入、标准输出和标准错误的含义 2.1 CentOs6.7桌面环境操作
2.1.1桌面环境介绍
用户登录成功后会进入CentOS桌面环境桌面环境大致分为三部分控制面板工作区任务栏。 2.1.2 终端的基本操作
操作系统与用户交互模式有两种图形界面和命令行。
所有的命令需要在一个载体上执行这个载体就叫做终端。终端上所有命令都需要一个 东西翻译解析一下计算机才能理解并执行。这个翻译解析的东西叫SHELL解释器 RedHat和Centos默认shell解释器叫bash。
打开多个终端 CtrlAltF1-F6快捷键设置 快捷键 作用 Tab键 命令或文件补全 CtrlA 把光标移动到命令行开头。 CtrlE 把光标移动到命令行结尾。 CtrlC 强制终止当前的命令 CtrlL 清屏相当于clear命令 CtrlU 删除或剪切光标之前的命令。 CtrlY 粘贴CtrlU剪切的内容。 2.1.3 命令格式 重要Linux下一切皆文件 命令 [可选项] 参数 [rootlocalhost ~]# ls -l /root 命令整条shell命令的主体 选项会影响或微调命令的行为通常以-, -- 参数命令作用的对象 2.2 Linux的目录树结构
2.2.1了解目录树结构 目录 说明 备注 /root 管理员root的家目录 /home 普通用户的默认家目录 /home/bozai /home/heima /bin—/usr/bin 普通用户的命令 /usr/bin/date /usr/bin/ls /sbin—/usr/sbin 管理员使用的命令 /usr/sbin/shutdown /usr/local 第三方源码包默认安装目录 类似windows下 C:\Program Files /etc 系统和服务相关配置文件 /etc/passwd /var 动态可以变化的数据文件日志文件 /var/log/xxx /tmp 临时文件存放目录 全局可写系统或程序产生临时文件 /dev 设备文件 /dev/sda /dev/nvme0n1 /lib—/usr/lib 库文件 软连接文件 /lib64—/usr/lib64 库文件 软连接文件 /proc 虚拟的文件系统 反映出来的是内核进程信息或实时状态 /boot 系统内核引导程序相关文件 /media 移动设备默认的挂载点 /mnt 手工挂载设备的挂载点
说明 usr 是 unix system resources 的缩写
2.2.2 理解文件路径表示方法 Who——当前登录系统的用户
Where?——路径
我要在哪儿创建文件
我要删除什么地方的什么文件
我所要查看的文件在哪里
What?——操作命令
How——理清思路找到方法做就对了
◆ 绝对路径 1. 一定是以/(根)开头它是唯一一个绝对能够描述文件所在路径的方式。 2. / 根目录是linux操作系统最顶级的目录没有任何路径比它还要靠前。 3. 表示bozai家目录/home/bozai/file1 ◆ 相对路径 1. 路径是相对的文件所在的路径是相对于当前所在路径而言的。 2. 当前路径使用.或./ 表示当前目录的上一级目录使用..或../ 表示 3. 当前用户家目录使用~ 表示上次工作路径使用- 表示 ◆ 路径切换和查看的相关命令 举例说明 [rootheima ~]# pwd 打印当前工作路径 /root [rootheima ~]# cd /home 切换到/home目录下 [rootheima home]# cd ../ 切换到当前路径的上一级目录 [rootheima /]# pwd / [rootheima /]# cd ~ 切换到当前用户家目录 [rootheima ~]# cd - 切换到上一次工作路径 / [rootheima /]# cd 切换到当前用户家目录 [rootheima ~]# pwd /root 2.3 CentOs6.7文件操作管理
2.3.1 判断文件类型(file)
◆ 常见文件类型 ◆ 用file 命令来判断文件类型 [rootlocalhost ~]# file /root /root: directory 目录 [rootlocalhost ~]# file /root/install.log /root/install.log: ASCII text 普通的文本文件 [rootlocalhost ~]# file /dev/sda /dev/sda: block special 块设备文件存放数据 [rootlocalhost ~]# file /dev/tty1 /dev/tty1: character special 字符设备 [rootlocalhost ~]# file /bin/sh /bin/sh: symbolic link to bash 软连接文件 2.3.2 列出目录内容(ls) 常见选项 -a all,查看目录下的所有文件包括隐藏文件 -l 长列表显示 -h human以人性化方式显示出来 -d 只列出目录名不列出其他内容 -t 按修改时间排序 -r 逆序排列 -S 按文件的大小排序 -i 显示文件的inode号索引号 -R 递归列出目录中的内容 -m 用逗号分隔显示内容 示例以不同的选项列出/root目录里的内容 [rootlocalhost ~]# ls -a /root [rootlocalhost ~]# ls -l /root [rootlocalhost ~]# ls -lh /root [rootlocalhost ~]# ls -lt /root [rootlocalhost ~]# ls -S /root [rootlocalhost ~]# ls -R /root [rootlocalhost ~]# ls -d /root 查看/root目录本身的信息
注意ls列出的结果颜色说明其中蓝色的名称表示文件夹黑色的表示文件绿色的其权限为拥有所有权限。
2.3.3 创建目录(mkdir) 常见选项 -p 级联创建 [rootlocalhost ~]# mkdir /test/ 在根下创建test目录 [rootlocalhost ~]# mkdir ./test/ 在当前目录下创建test目录 [rootlocalhost ~]# mkdir -p /test/yunwei/redhat 说明 1.如果创建的目录的上一级目录不存在就需要加-p参数-p在前面和后面都可以
2.3.4 创建文件(touch)
注意Linux下文件的命名规则
1. 文件名严格区分大小写 file FILE
2. 文件名不能包含特殊符号如(/或*等)
3. 文件名最多可达255个字符
● 创建一个新的空文件目标文件不存在 [rootlocalhost ~]# touch /tmp/file1 在/tmp目录下创建file1文件 [rootlocalhost ~]# touch file1 在当前目录下创建file1文件 思考这2个file1文件是同一个文件吗 答不是同一个文件因为路径不一样。
● 修改文件的时间目标文件存在
1查看文件的相关时间 [rootlocalhost tmp]# stat file1 查看文件的状态信息 File: file1 Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd00h/64768d Inode: 915714 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2019-04-01 17:36:00.353096343 0800 Modify: 2019-04-01 17:36:00.353096343 0800 Change: 2019-04-01 17:36:00.353096343 0800 Access:文件的查看访问时间 Modify:文件的修改时间 Change:文件的属性时间,文件的大小、权限等信息发生改变时该时间会变化
2修改文件的时间 [rootlocalhost tmp]# touch file1 [rootlocalhost tmp]# stat file1 查看文件的状态信息 File: file1 Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd00h/64768d Inode: 915714 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2019-04-01 17:41:00.353096343 0800 Modify: 2019-04-01 17:41:00.353096343 0800 Change: 2019-04-01 17:41:00.353096343 0800 其他修改 [rootlocalhost tmp]# touch -a file1 -t 201506161320 修改文件点访问时间 [rootlocalhost tmp]# touch -m file1 -t 201612121330 修改文件修改时间 -a访问时间 -m修改时间 -t时间类型格式 [rootlocalhost tmp]# touch -d 20110808 file1 修改文件日期 [rootlocalhost tmp]# touch -d 1215 file1 修改文件时间 [rootlocalhost tmp]# touch -d 20101012 11:11:11 file1 修改文件的日期和时间 说明大家只需要掌握touch -d的用法即可。 注RHEL6开始relatimeatime延迟修改必须满足其中一个条件 1. 自上次atime修改后已达到86400秒 2. 发生写操作时
2.3.5 查看文件内容
● cat 命令一般查看小文件从第一行到最后一行列出来
常见选项
-n显示行号
-A显示控制字符如换行符,制表符等 linux $ 和 Windows ^M$
● tac 命令一般查看小文件从最后一行到第一行列出来
● more和less 命令一般查看大文件q退出查看可以搜索建议less命令
● head 命令默认查看文件前10行 head -n 15或head -15 表示查看前15行
● tail 命令默认查看文件后10行 tail -n 15或tail -15 表示查看后15行 -f 表示动态查看
● ldd 命令一般用来查看二进制的命令文件 [rootlocalhost tmp]# cat /etc/passwd 查看/etc/passwd文件内容 [rootlocalhost tmp]# cat -n /etc/passwd 查看/etc/passwd文件内容并打印行号 [rootlocalhost tmp]# tac /etc/passwd 查看/etc/passwd文件内容 [rootlocalhost tmp]# head -5 /etc/passwd 查看/etc/passwd文件的前5行内容 [rootlocalhost tmp]# tail -5 /etc/passwd 查看/etc/passwd文件的后5行内容 [rootlocalhost tmp]# more /var/log/messages [rootlocalhost tmp]# less /var/log/messages [rootlocalhost tmp]# ldd /bin/mkdir 查看mkdir命令文件二进制的内容
2.3.6 拷贝文件(cp)
注意本地文件拷贝
1用法 cp [选项] 需要拷贝的文件 拷贝到哪里去
2常用选项 3举例说明 # cp /root/file1 /home 拷贝/root/下的file1文件到/home目录下 # cp -r /home/itcast /root 拷贝/home/itcast目录到/root目录下 # su - user01 切换到user01用户下 $ touch file1 # cp -p /home/user01/file1 /tmp/ 拷贝home/user01/file1文件包含属性信息到/tmp下 # cp /root/file1 /tmp/test1 拷贝文件并且重命名 问-a和-p有什么区别 答相同点都是需要拷贝文件的属性信息比如拥有者谁创建的等不同点在于-p只能拷贝文件-a既可以拷贝文件也可以拷贝目录。
2.3.7 移动或重命名文件(mv) 移动文件用法不同路径下 # mv 需要移动的文件 移动到新的路径下 注意文件的路径不一样 重命名用法相同路径下 # mv 原来文件的名字 新文件的名字 注意老文件和新文件的路径一样 # mv /root/file1 /tmp 移动/root/file1文件到/tmp目录下 # mv /tmp/file1 /tmp/test1 将/tmp目录下的file1文件重命名成test1
2.3.8 删除文件(rm) 常用选项 -r 递归删除一般用于删除目录 -f 直接删除不提示 [rootlocalhost tmp]# rm file1 删除当前目录下的file1文件有提示 [rootlocalhost tmp]# rm -r dir1 删除当前目录下的dir1目录有提示 [rootlocalhost tmp]# rm -f /root/file1 强制删除/root/file1文件不提示直接删 2.4 Linux下如何获取帮助扩展补充
2.4.1 简约求帮助(help) help命令知道该命令的含义相关参数不知道可以使用help 内部命令求帮助help 命令 外部命令求帮助命令 --help cp --help help cd 如何判断一个命令是内部命令还是外部命令 type 命令 内部命令shell内置的命令bash 外部命令第三方程序软件带来的命令
2.4.2 详细求帮助(man) # man man ANUAL SECTIONS The standard sections of the manual include: 1 User Commands 所有用户使用命令 2 System Calls 系统调用 3 C Library Functions 函数库 4 Devices and Special Files 设备与特殊文件 5 File Formats and Conventions 文档格式说明 6 Games et. Al. 游戏 7 Miscellanea 杂项 8 System Administration tools and Deamons 系统管理员与程序用户相关 一般情况是不需要使用章节号例如 # man 1 ls # man ls # man useradd # man setfacl /EXAMPLES # man -f passwd 列出所有章节中的passwd手册 # man 1 passwd passwd命令的帮助 # man 5 passwd 用户配置文件的帮助 # man -a passwd 在所有章节中查找 # man -k passwd 以关键字导出man page
2.5 Bash的标准输入输出扩展补充
2.5.1 名词解释
● 标准输入stdin键盘上的输入 文件描述符—0
● 标准输出stdout屏幕上正确的输出 文件描述符—1
● 标准错误stderr屏幕上错误的输出 文件描述符—2
2.5.2 相关符号
一般命令的输出都会显示在终端中有些时候需要将一些命令的执行结果想要保存到文件中进行后续的分析/统计则这时候需要使用到的输出重定向技术。 标准输出重定向, 覆盖重定向, 1或 标准输出重定向 2 标准错误重定向 重定向追加, 1 标准输出追加 2 标准错误追加 标准输入 标准输出标准错误重定向
2.5.3 举例说明
① 环境准备 编写简单脚本先直接复制用后面说 [rootlocalhost ~]# echo -e date\nuuu 1.sh 创建1.sh脚本文件 [rootlocalhost ~]# cat 1.sh date uuu 执行1.sh脚本屏幕上有输出结果如下 [rootlocalhost ~]# bash 1.sh Thu Feb 28 21:22:27 CST 2019 正确的结果叫标准输出 1.sh: line 2: uuu: command not found 错误的结果叫标准错误
② 需求1
将标准输出屏幕上的正确结果重定向到/tmp/1.log文件中 [rootlocalhost ~]# bash 1.sh /tmp/1.log 1.sh: line 2: uuu: command not found 标准错误(错误结果)依然在屏幕正确结果到文件中了 [rootlocalhost ~]# cat /tmp/1.log 文件里是标准输出的结果 Thu Feb 28 21:24:12 CST 2019
③ 需求2 将标准错误屏幕上的错误结果重定向到/tmp/2.log文件中 [rootlocalhost ~]# bash 1.sh 2 /tmp/2.log Thu Feb 28 21:26:15 CST 2019 标准输出依然在屏幕标准错误重定向到了文件中 [rootlocalhost ~]# cat /tmp/2.log 1.sh: line 2: uuu: command not found 文件里是标准错误的结果 注意或者2都表示覆盖重定向 查看/etc/hosts文件内容并将标准输出重定向到/tmp/1.log [rootlocalhost ~]# cat /etc/hosts /tmp/1.log [rootlocalhost ~]# cat /tmp/1.log 查看该文件发现原来内容被覆盖 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 总结或者1表示标准输出重定向2表示标准错误重定向
④ 需求3 将标准输出和标准错误一起重定向到/tmp/3.log里 [rootlocalhost ~]# bash 1.sh /tmp/3.log [rootlocalhost ~]# cat /tmp/3.log Thu Feb 28 21:33:36 CST 2019 1.sh: line 2: uuu: command not found 说明 表示标准输出和标准错误一起重定向
2.5.4 echo命令
echo会将输入的字符串送往标准输出并在最后加上换行符。 可以理解为打印字符串。 常见选项 -n 不输出最后的换行符“\n” -e解释转义字符字符串中出现\n、\t等特殊字符则特别加以处理而不会将它当成一般文字输出
举例说明 [rootlocalhost ~]# echo hello world 打印hello world hello world [rootlocalhost ~]# echo aaaa 打印aaaa aaaa [rootlocalhost ~]# echo hello file1 将hello重定向到file1文件中 [rootlocalhost ~]# cat file1 Hello 总结 1. echo表示打印字符串默认将字符串送往标准输出默认会打印一个换行符 2. echo可以结合或者符号来使用进行文件的创建或内容追加。 常见控制字符 \t 表示制表符 \n 表示换行符 [rootlocalhost ~]# echo -e date\nuuu 1.sh //-e表示将\n解释为换行符 [rootlocalhost ~]# cat 1.sh date uuu
2.2 文件操作二
目标:
能够使用find命令根据文件类型查找文件能够使用find命令根据文件的修改时间来查找文件能够使用find命令根据文件的大小来查找文件能够使用gzip、bzip2、xz相关工具对文件进行压缩和解压缩能够使用tar工具进行打包压缩文件能够使用date命令查看和设置系统时间
2.2.1 Linux下文件查找命令
2.2.1.1 命令查找
Linux下一切皆文件
which 命令找出命令的绝对路径
whereis 命令找出命令的路径以及文档手册信息 [rootheima ~]# which mkdir /usr/bin/mkdir [rootheima ~]# whereis mkdir mkdir: /usr/bin/mkdir /usr/share/man/man1/mkdir.1.gz /usr/share/man/man1p/mkdir.1p.gz /usr/share/man/man2/mkdir.2.gz /usr/share/man/man3p/mkdir.3p.gz
2.2.1.2 文件查找(find)
find 命令精确查找磁盘搜索IO读写CPU开销大
1用法1找出来输出到屏幕
根据需求查找出来直接输出到屏幕
find 查找路径 选项 关键字 举例说明 0环境准备 # mkdir /test # touch /test/file1 # touch /test/FILE1 # cp -a /home/heima/* /test/ 1根据文件名查找 [rootheima ~]# find /test -name file1 [rootheima ~]# find /test -iname file1 [rootheima ~]# find /etc -name *.conf 2根据文件类型查找 [rootheima ~]# find /usr/bin/ -type l [rootheima ~]# find /dev -type b [rootheima ~]# cd /test [rootheima test]# find . -type d [rootheima test]# find . -type f 3根据文件大小查找 [rootheima test]# find . -type f -size 1M [rootheima test]# find . -type f -size -1M [rootheima test]# find . -type f -size -1024k [rootheima test]# find . -type f -size 9M 4根据文件属性权限创建者和所属组 [rootheima test]# find . -user heima -group heima -type f [rootheima test]# find . -type f -perm 644
-mtime选项举例 [rootheima test]# find ./ -type f -mtime 2 [rootheima test]# find ./ -type f -mtime -2 [rootheima test]# find ./ -type f -mtime 2 2用法2找出来执行命令
根据需求查找出来后执行某个动作(命令)
find 路径 选项 关键字 动作
举例说明 语法结构 注意 1. -exec或者-ok后面写完命令必须以空格反斜杠\;结尾 \; 2. {}表示find命令所找出来的内容
2.2.2 Linux下文件压缩工具
2.2.2.1 常见的压缩与解压缩工具 2.2.2.2 工具的用法
① zip工具 压缩 zip 压缩后的文件 需要压缩的文件 选项 -r 递归压缩,压缩目录 注意zip压缩默认压缩后的格式就是.zip当然也可以加后缀.zip,一般都加上 解压缩 -d 指定解压缩路径
② gzip工具 压缩 gzip 需要压缩的单个文件 选项 -d 解压缩 -r 递归压缩目录 解压缩 gunzip 需要解压的文件 或者 gzip -d 需要解压的文件 gunzip file* 一次解压多个文件*代表通配符file*表示以file开头所有文件 ③ bzip2工具 压缩 bzip2 需要压缩的文件 选项 -d 解压缩
④ xz工具 选项 -z 压缩,默认 -d 解压缩 或者 unxz 压缩 xz 文件名 解压缩 unxz 文件名 或者 xz -d 文件名
2.2.3 Linux下文件打包工具
tar 命令可以将多个文件打包成一个并且压缩不会改变文件的属性很常用。
2.2.3.1 用法
tar 选项 打包后的文件 需要打包的文件 注意 1. 以上选项前面的横杠-可以省略 2. 如果已经将文件压缩打包那么就不能追加如果只是打包就可以追加。 3. 参数顺序需要注意最好把-f参数放到所有参数后面。 4. 当出现以下提示时加一个大P参数解决。 tar: Removing leading / from member names
2.2.3.2 示例 1. 将/tmp目录里的dir1目录和/etc/hosts文件打包到/tmp/dir4里叫dabao.tar [rootlocalhost tmp]# tar -cvf /tmp/dir4/dabao.tar ./dir1 /etc/hosts ./dir1/ ./dir1/test1.gz.bz2 ./dir1/aaa/ ./dir1/aaa/file2.gz ./dir1/file1.gz.bz2 tar: Removing leading / from member names /etc/hosts 注意以上错误提示可以忽略 查看打包后的文件内容 [rootlocalhost tmp]# tar -tf dir4/dabao.tar ./dir1/ ./dir1/test1.gz.bz2 ./dir1/aaa/ ./dir1/aaa/file2.gz ./dir1/file1.gz.bz2 etc/hosts 2. 将/boot目录和/root/install.log文件打包并压缩到/tmp目录下叫backup_boot.tar.gz [rootlocalhost ~]# tar -cvzf /tmp/backup_boot.tar.gz /boot install.log 3. 解压tar包 [rootlocalhost tmp]# tar -xf backup_boot.tar.gz 解压到当前路径 [rootlocalhost tmp]# tar -xf backup_boot.tar.gz -C dir1/ 解压到指定路径 2.2.4 日期相关指令扩展补充
2.2.4.1 date命令重点
date :打印或者设置当前系统日期和时间
date --help 自己先求帮助
1打印日期或时间 打印系统当前日期或时间 [rootheima ~]# date [rootheima ~]# date %D [rootheima ~]# date %F [rootheima ~]# date %Y-%m-%d [rootheima ~]# date %T [rootheima ~]# date %X [rootheima ~]# date %F %X [rootheima ~]# date %c 打印系统非当前日期或时间 [rootheima ~]# date -d 3days %F [rootheima ~]# date -d -3days %F [rootheima ~]# date -d 3days %F [rootheima ~]# date -d 3days ago %F [rootheima ~]# date --date30days %F
2设置系统日期或时间 选项-s 设置当前系统时间只有root权限才能设置其他只能查看。 date -s 20200523 设置成20100523这样会把具体时间设置成空00:00:00 date -s 01:01:01 2020-05-2 这样可以设置全部时间 date -s 01:01:01 20200523 这样可以设置全部时间 date -s 2020-05-23 01:01:01 这样可以设置全部时间 date -s 20200523 01:01:01 这样可以设置全部时间
3应用案例
有时候我们需要用到当前的系统时间如何调用比如以当前系统日期命名创建目录或文件。 2020-10-10.log.tar.gz 2020-10-11.log.tar.gz $()括号里面的命令优先执行 date %F 2019-06-23 创建目录和文件以当前系统日期命名 [rootheima ~]# mkdir $(date %F) [rootheima ~]# touch $(date -d 3days %Y%m%d).log
2.2.4.2 cal命令了解
cal :查看日历 cal 或者 cal -1 表示直接输出当前月份的日历 cal -3 表示输出上一个月本月下个月的日历 cal -y 年份 表示输出某一个年份的日历
2.3 文件编辑工具(vim)
目标:
能够使用vim编辑器修改并保存文件
2.3.1 vim概述
Linux平台下的文本编辑器emas、nano、gedit、vi、vim
vi(visual editor)编辑器通常被简称为vi它是linux和unix系统上最基本的文本编辑器类似于windows系统下的记事本。学会它后我们将在linux的世界里游刃有余。
为什么要学习vim
① 所有的Unix like系统都会内置vi编辑器。其它的文本编辑器不一定会存在
② 很多软件的编辑接口都会主动调用vi
③ vim具有程序编辑的能力可以主动以字体颜色辨别语法的正确性方便程序设计
④ 程序简单编辑速度快
⑤ vim是vi的升级版
2.3.2 vim编辑器三种模式
2.3.2.1 命令行模式
问命令行可以干什么
答可以进行一些基本的复制、删除、跳转、撤销、移动等操作。 举例说明
① 环境准备 1) 删除 /tmp/目录里的所有内容 2) 将/etc/passwd文件拷贝到/tmp目录里 # rm -rf /tmp/* # cp /etc/passwd /tmp/
② 使用vim工具打开文件 用法1 vim 文件名 默认会进入命令行模式 [rootlocalhost ~]# vim /tmp/passwd 用法2 vim 数字 文件名 打开指定的文件并且将光标移动到指定行 [rootlocalhost ~]# vim 5 /tmp/passwd 用法3 vim /关键字 文件名 打开指定的文件并且高亮显示关键词 [rootlocalhost ~]# vim /shutdown /tmp/passwd
2.3.2.2 编辑模式
功能编辑文件内容 2.3.2.3 底行模式
1如何进入底行模式
命令模式进入底行模式按冒号
编辑模式进入底行模式先按Esc键退出命令模式然后按冒号
2底行模式能做什么
① 保存和退出
● 保存文件命令w另存为其他文件命令w 文件名
● 保存退出命令wq强制保存退出wq!
● 退出不保存命令q强制退出q!
● 命令x在文件没有修改的情况下表示直接退出(等价于q)在文件修改的情况下表
示保存并退出(:wq)
② 搜索替换 搜索摸索 :/root n往下匹配;N往上匹配 替换模式 :%s/root/ROOT/ 全文搜索,替换每一行匹配到的第一个关键字 :%s/root/ROOT/g 全文搜索,替换每一行所有匹配的关键字 :%s/root/ROOT/gc 交互式替换 :%s/\/sbin\/nologin/\/bin\/bash/ \转义符 :%s#/sbin/nologin#/bin/bash#g 更换分隔符 :7s/shutdown/SHUTDOWN/g 只替换第7行的内容 取消高亮 :noh no highlight
③ 其他功能 临时设置行号 :set number 或 :set nu 永久设置行号 echo set number /etc/vimrc :set list 查看控制符 地址定位 :1,5 w /tmp/5.txt 保存前5行内容到/tmp/5.txt :r /tmp/5.txt 在光标所在行下面读取/tmp/5.txt文件内容 :3r /tmp/5.txt 在当前文本的第3行后读取/tmp/5.txt文件 :1,8d 删掉文本的1到8行 :nr !command 在第n行下面读取命令所执行的结果 :n! command 用命令的执行结果替换第n行内容
2.3.3 vim编辑器三种模式切换 2.3.4 多窗口编辑问题
当两个终端同时打开或者意外结束文件时会产生一个.swap文件交换文件
举例说明
你在两个终端同时打开/tmp/passwd文件会产生/tmp/.passwd.swp。这时有六个按钮可以使用 O(pen for Read-Only):打开成只读文件。 E(dit):用正常方式打开要编辑的文件并不会载入暂存文件的内容。这很容易出现两个用户相互改变对方的文件的问题。 R(ecover)加载暂存文件的内容。 D(elete)如果你确定这个暂存文件是没有用的则可以删除。 Q(uit)不进行任何操作回到命令行。 A(bort)忽略这个编辑行为和Q类似。 需要注意的是 这个暂存文件不会因为你结束vim后自动删除必须要手动删除。否则每次打开对应的文件时都会出现这样的提示。 2.3.5 可视化模式(了解)
按键ctrlv(可视块)或v(可视行)然后按下↑ ↓ ← →方向键来选中需要复制的区块按下y键进行复制(不要按下yy)最后按下p键粘贴
退出可视模式按下Esc键
2.4 Linux下用户管理和组管理
目标:
能够根据需求创建普通用户能够根据需求修改用户基本信息能够将用户加入到指定组里能够使用两种方法给用户设置密码能够删除用户能够创建并删除组 2.4.1 Linux下用户管理
2.4.1.1 用户概念及作用(了解)
用户指的是linux操作系统中用于管理系统或者服务的人
一问管理系统到底在管理什么
答linux下一切皆文件所以用户管理的是相应的文件
二问如何管理文件呢
答①文件基本管理比如文件的创建、删除、复制、查找、打包压缩等等文件的权限增加、减少等
②文件高级管理比如程序文件的安装、卸载、配置等。终极目的是对外提供稳定的服务。
2.4.1.2 用户的分类(了解)
1超级用户
超级用户也叫管理员root。该用户(root)具有所有权限UID0并且绝对只能是0。
2系统用户
系统用户也叫程序用户。一般都是由程序创建用于程序或者服务运行时候的身份。
默认不允许登录系统。1UID499
比如后面学的web服务的管理用户apache文件共享ftp服务的管理用户ftp等
注意Centos7/RHEL8中系统用户UID范围: 1UID999
3普通用户
普通用户一般都是由管理员创建用于对系统进行有限的管理维护操作。
默认可以登录系统500UID60000
注意Centos7/RHEL8中普通用户UID范围: 1000UID60000
特别说明
①用户指的是操作系统上管理系统或服务的人是人就有相关的属性信息
②用户的属性信息包括但不限于如家目录、唯一身份标识(UID)、所属组(GID)等
③今天我们讨论的用户指的是普通用户即由管理员创建的用户。
2.4.1.3 用户的基本管理(掌握)
1创建用户(useradd)
① 基本语法和选项 useradd [选项] 用户名 常用选项 -u 指定用户uid唯一标识必须唯一 -g 指定用户的默认组(主组) -G 指定用户附加组(一个用户可以加入多个组但是默认组只有一个) -d 指定用户家目录(每个用户都有一个自己的家并且默认在/home/xxx) -s 指定用户默认shell 查看系统支持的shell(命令解释器) [rootheima ~]# cat /etc/shells /bin/sh 软连接文件 /bin/bash 系统默认的解释器 /usr/bin/sh 软连接文件 /usr/bin/bash 系统默认的解释器 其他shell /sbin/nologin 不能登录操作系统也叫非交互式shell /bin/dash /bin/tcsh /bin/csh
② 示例说明
1) 创建默认用户 创建一个用户stu1 [rootheima ~]# useradd stu1 查看用户信息 [rootheima ~]# id stu1 uid501(stu1) gid501(stu1) groups501(stu1) 注意当创建一个默认用户时系统会给该用户以下东西以stu1为例说明 1用户的UID(唯一标识) 501系统自动分配 2用户的默认组(主组) stu1组默认跟该用户的用户名一致组ID(501),默认和用户UID一致 3用户的家目录 /home/stu1 4拷贝相应的文件到用户的家里 [rootheima ~]# su - stu1 [stu1localhost ~]$ ls -a . .. .bash_logout .bash_profile .bashrc .gnome2 .mozilla 2) 根据需求创建用户 1. 创建用户stu2但是不能登录操作系统 注意 -s 指定用户的默认shell/sbin/nologin表示不能登录系统也叫非交互 [rootheima ~]# useradd -s /sbin/nologin stu2 验证 [rootheima ~]# id stu2 uid502(stu2) gid502(stu2) groups502(stu2) 切换用户失败说明该用户不能登录系统 [rootheima ~]# su - stu2 This account is currently not available. 2. 创建用户stu2同时指定该用户的家目录为/rhome/stu2 注意 -d 指定用户的家目录前提该用户家目录的上一级目录/rhome必须存在 [rootheima ~]# mkdir /rhome [rootheima ~]# useradd -d /rhome/stu2 stu2 [rootheima ~]# id stu2 uid502(stu2) gid502(stu2) groups502(stu2) 说明指定stu2家目录/rhome/stu2时只需要/rhome存在即可系统会默认在/rhome下创建stu2目录
2用户密码设置(passwd) passwd 用户名 表示给指定用户修改密码 passwd 直接回车 表示给当前用户修改密码 [rootheima ~]# passwd stu1 Changing password for user stu1. New password: 密码不显示 BAD PASSWORD: it is WAY too short BAD PASSWORD: is too simple Retype new password: 密码不显示 passwd: all authentication tokens updated successfully. 说明 1.管理员root可以给任何用户修改密码 2.普通用户可以自己给自己修改密码但是密码复杂度要符合规范 [rootheima ~]# echo 123|passwd --stdin stu2 更改用户 stu2 的密码 。 passwd所有的身份验证令牌已经成功更新。 说明使用这种方法不用交互可以直接设置成功一般用于脚本中。
① 保存用户信息的文件 1. 用户信息保存文件/etc/passwd 了解相关配置文件内容可以通过求man文档解决即 man 5 passwd 以冒号:分割为7列如下 account -- stu1 用户名称 password -- x 密码,将密码单独存放在另外一个文件中 UID -- 501 用户ID GID -- 501 组ID GECOS -- 用户自定义, 描述说明 directory -- /home/stu1 用户的家目录 shell -- /bin/bash 用户的默认shell,其中/sbin/nologin表示非交互不能登录系统 2. 用户密码信息保存文件/etc/shadow 了解相关配置文件内容可以通过求man文档解决即 man 5 shadow 以冒号:分隔为9列如下 login name 登录的用户名 encrypted password 加密后的密码;!!表示没有设置密码 date of last password change 最后一次更改密码的天数距离1970年的1月1日到现在的天数 minimum password age 密码的最小生存周期;0表示可以立刻修改密码如果是3则表示3天后才能更改密码 maximum password age 密码的最大生存周期;如果30表示每隔30天需要更新一次密码 password warning period 密码过期前几天发出警告7表示过期前7天开始警告 password inactivity period 密码的宽限期如果3表示允许密码过期3天,3天内还能登录系统但是要求修改密码。3天后密码过期3天后账户被封锁需要联系管理员 account expiration date 账户过期的时间账户过期的用户不能登录密码过期用户不能用原来的密码登录。以1970年1月1日算起。 reserved field 保留
② 更改用户的账号信息(chage) chage --help -d 修改用户最后一次更改密码的时间 -m 修改密码的最小存活期几天后才能修改密码 -M 修改密码的最大存活期每隔多少天更新一次密码 -W 修改密码过期前警告过期前几天发出警告 -I 修改允许密码过期几天 -E 修改账户过期时间 -l 列出账户的信息 举例说明 查看用户账号的相关信息命令chage -l stu1 [rootheima ~]# chage -l stu1 Last password change : Mar 04, 2019 Password expires : never Password inactive : never Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7 修改用户账号的过期时间2019-03-10过期 [rootheima ~]# chage -E 2019-03-10 stu1 [rootheima ~]# chage -l stu1 Last password change : Mar 04, 2019 Password expires : never Password inactive : never Account expires : Mar 10, 2019 Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7 修改用户账号的过期时间为10天以后 [rootheima ~]# chage -E $(date %F -d 10days) stu1
3修改用户信息(usermod)
① 基本语法选项 usermod [选项] 用户名 常用选项 -u 指定用户uid唯一标识必须唯一 -g 指定用户的默认组(主组) -G 指定用户附加组(一个用户可以加入多个组但是默认组只有一个) -d 指定用户家目录(每个用户都有一个自己的家并且默认在/home/xxx) -s 指定用户默认shell -m 移动用户家目录和-d一起使用
② 举例说明 1. 修改stu3用户的UID为1100 [rootheima ~]# usermod -u 1100 stu3 [rootheima ~]# tail -5 /etc/passwd yunwei:x:1001:1001::/home/yunwei:/sbin/nologin stu1:x:1002:1002::/home/stu1:/bin/bash stu2:x:1003:1003::/rhome/stu2:/bin/bash stu3:x:1100:1004::/rhome/stu3:/bin/bash stu4:x:1005:1005::/home/stu4:/sbin/nologin 2.修改stu4用户的默认shell为可登录系统 [rootheima ~]# su - stu4 This account is currently not available. [rootheima ~]# usermod -s /bin/sh stu4 [rootheima ~]# tail -5 /etc/passwd yunwei:x:1001:1001::/home/yunwei:/sbin/nologin stu1:x:1002:1002::/home/stu1:/bin/bash stu2:x:1003:1003::/rhome/stu2:/bin/bash stu3:x:1100:1004::/rhome/stu3:/bin/bash stu4:x:1005:1005::/home/stu4:/bin/sh 3.修改stu5用户的家目录 [rootheima ~]# useradd -d /rhome/stu5 stu5 [rootheima ~]# usermod -md /home/stu5 stu5
4删除用户(userdel)
① 基本语法选项 userdel [选项] 用户名 常用选项: -r 删除用户并且移除其家目录和邮箱 -f 强制删除正在登录的用户
② 举例说明 说明 创建完用户后家目录默认在/home/用户名下用户的邮箱在/var/spool/mail/用户名 1. 删除stu4用户以及家目录 [rootheima ~]# userdel -r stu4 [rootheima ~]# id stu4 id: stu4: No such user 2.强制删除一个正在登录的用户 [rootheima ~]# userdel -r stu5 userdel: user stu5 is currently used by process 7998 [rootheima ~]# id stu5 uid1101(stu5) gid1101(stu5) 组1101(stu5) [rootheima ~]# userdel -rf stu5 userdel: user stu5 is currently used by process 7998 [rootheima ~]# id stu5 id: “stu5”无此用户 3. 只删除用户user02不删除其家目录 [rootheima ~]# userdel stu1
2.4.1.4 总结
1创建用户(useradd)
①useradd 用户名 -à家目录/home/用户名、邮箱、UID、默认组GID [用户主组]
② useradd [选项] 用户名 -à常用选项-d/ -s/ -u/ -g/ -G
2设置用户密码(passwd)
① passwd 用户名 -à给指定的用户(管理员可以给任何人设置任何密码)
② echo 密码|passwd –stdin 用户名 -à非交互式(用于脚本中)
③ 用户基本信息和用户密码信息保存文件 -à/etc/passwd和/etc/shadow
④ 扩展chage命令-à用来修改用户密码信息(账号过期时间、密码最小生存周期等)
3修改用户信息(usermod)
① usermod [选项] 用户名 -à usermod –md 新家 用户名
4删除用户(userdel)
① userdel 用户名 -à 只删除用户不删除用户家目录、邮箱等信息
② userdel –r 用户名 -à 删除用户以及其他信息
③ userdel –f 用户名 -à 强制删除用户(删除正在登录的用户)
2.4.2 Linux下组管理
2.4.2.1 组和用户的关系理解 1核心组的目的是为了方便管理用户
◆ 用户是操作系统上管理维护系统或服务的人
◆ 组是用户的一个属性信息
◆ 任何一个用户默认都会有一个主组默认组
◆ 一个用户除了主组也可以有多个其他组附加组
2用户的主组和附加组到底有啥关系
用户的主组和附加组半毛钱的关系都木有
3那要这个主组和附加组有什么用呢
组的目的是方便管理用户用户的目的是管理操作文件文件又有权限这个属性。
①用户要操作一些文件文件是由用户创建不同用户创建的文件的属性信息也就不一样
②文件的属性都有啥呢比如文件的创建者文件属于哪个组文件大小文件时间等
③其中不同用户所创建的文件的属组就是该用户的主组默认组
④A用户附加组也有可能是其他用户的主组道理同上权限章节再细细体会组的作用
2.4.2.2 组的管理掌握
1创建组(groupadd)
① 基本语法 groupadd [选项] 组名 常用选项 -g 指定组的GID(编号)默认唯一
② 举例说明 1.创建一个组admin [rootheima ~]# groupadd admin 2.查看组信息 [rootheima ~]# tail -1 /etc/group admin:x:1005: 说明关于/etc/group配置文件说明可以man 5 group找帮助 3.创建一个组sysadmin指定组的GID为1111 [rootheima ~]# groupadd -g 1001 sysadmin [rootheima ~]# tail -1 /etc/group admin:x:1005: sysadmin:x:1111
2删除组(groupdel)
① 基本语法 groupdel 组名
② 举例说明 [rootheima ~]# groupdel admin [rootheima ~]# groupdel stu2 groupdel: cannot remove the primary group of user stu2 注意以上信息说明不能删除属于其他用户的主组
3组成员管理(gpasswd)
① 基本语法 gpasswd [选项] 组名 常见选项 -a 添加用户到组 -d 从组中删除成员 -A 指定管理员 -M 指定组成员可以批量添加用户到组中 -r 删除密码 gpasswd 组名 给组设置密码
② 举例说明
1添加用户到组里 1. 创建3个用户user01~user03 2. 将user01添加到sysadmin组里 方法:1指定user01用户的附加组为sysadmin站在用户角度 # usermod -G sysadmin user01 方法2使用gpasswd命令添加用户到组里 # gpasswd -a user01 sysadmin -a选项表示往组里追加用户 # gpasswd -M user02,user03 sysadmin 设置sysadmin组成员为user02,user03 -M选项表示覆盖设置组成员会覆盖原来的成员列表
2删除组成员 将user03用户从组sysadmin里移除 # gpasswd -d user03 sysadmin 2.4.2.3 总结
1创建组(groupadd)
组的信息保存文件-à/etc/group和/etc/gshadow
2删除组(groupdel)
什么样的组不能删除-à不能删除属于其他用户的主组
3管理组成员(gpasswd)
①添加用户到组里-àgpasswd –a user1 组名 或 gpasswd –M user1,user2,… 组名
②从组里移除用户--àgpasswd –d user1 组名
2.5 Linux下文件权限管理
目标:
理解rwx分别对于普通文件和目录的不同含义能够使用chmod命令的数字、字母形式修改文件的权限能够使用chown命令更改文件的拥有者和所属组
2.5.1 权限概述
2.5.1.1 什么是权限
权限在计算机系统中权限是指某个计算机用户具有使用软件资源的权利。
思考计算机资源分为哪两部分
● 硬件资源 硬盘、CPU、内存、网卡等物理硬件资源
● 软件资源 软件操作系统(特殊的软件)、应用程序。只要不启动这些软件就是一堆静态的文件并且静静的躺在我们计算机的磁盘中。 软件资源linux系统中一切皆文件SO这里的软件资源就是文件资源。
总结
我们今天所讲的权限指的就是文件资源所拥有的相关权限即文件权限。
2.5.1.2 权限设置的目的
文件权限设置的目的是想让某个用户(linux操作系统中的用户)有权利操作文件
2.5.1.3 文件权限的分类
□ 普通权限
用户正常情况去操作文件所具有的权限
□ 高级权限
用户对某个文件操作有特殊需求而普通权限不能满足需要给文件设置高级权限
□ 默认权限
用户在系统中创建一个文件该文件默认都有一个权限该权限是默认的
注意
权限是设置在文件上的而不是用户设置权限的目的是让相应的人(用户)去操作相应的文件。
2.5.2 普通权限(重点)
2.5.2.1 理解普通权限rwx含义
1读权限—r(read)
针对目录
一个目录有r权限说明可以查看该目录里的内容(ls命令列出)
针对普通文件 一个普通文件拥有r权限说明可以查看该文件的内容(cat/head/tail/less/more等命令查看)
读权限r(read)用数字表示是4
2写权限—w(write)
针对目录
一个目录有w权限说明可以在该目录里创建、删除、重命名等操作(mkdir/touch/mv/rm等)
针对普通文件 一个普通文件拥有w权限说明可以修改该文件的内容(vi/vim编辑器编辑文件)
写权限w(write)用数字表示是2
3执行权限—x(execute)
针对目录
一个目录拥有x权限说明可以进入或切换到该目录里(cd命令)
针对普通文件 一个普通文件拥有x权限说明可以执行该文件 (一般程序文件、脚本文件、命令都需要执行权限)
执行限x(execute)用数字表示是1
4没有权限—横杠-
没有任何权限用横杠-表示数字表示是0
2.5.2.2 理解UGO的含义
1UGO指的是什么
UGO指的是用户身份每个字母代表不同的用户身份。
◆ U (the user who owns it)
文件的拥有者(owner)或者创建者
◆ G (other users in the file’s group)
在文件的所属组(默认是创建文件的用户的主组)里的用户
◆ O (other users not in the file’s group)
既不是文件的创建者也不是文件属组里的用户称为其他人
注意 除了上面ugo以外还有一个字母a (all users)表示所有用户包含ugo
2如何判断不同身份的用户对文件的权限 查看文件详细信息包含权限信息 [rootlocalhost ~]# ls -l total 144 -rw-r--r--. 1 root root 9 Mar 2 20:38 1.sh -rw-------. 1 root root 1651 Feb 28 11:00 anaconda-ks.cfg drwxr-xr-x. 2 root root 4096 Mar 6 18:34 Desktop drwxr-xr-x. 2 root root 4096 Feb 28 14:12 dir1 2.5.2.3 修改文件普通权限(chmod)
1chmod命令用法 chmod [选项] 模式 文件名 常见选项 -R, --recursive 递归更改目录和目录里文件的权限
2举例说明
① 通过字母形式更改文件权限 u:表示文件拥有者 g:表示文件属组里的用户 o:表示其他人即不是文件的创建者也不在文件属组里 a:表示所有人
环境准备 [rootheima ~]# mkdir /tmp/dir1 [rootheima ~]# touch /tmp/dir1/file{1..5} [rootheima ~]# touch /tmp/test{1..3} [rootheima ~]# ll /tmp/ -R
使用字母形式修改文件权限 [rootheima tmp]# pwd /tmp [rootheima tmp]# ll test1 -rw-r--r--. 1 root root 0 Mar 6 20:45 test1 [rootheima tmp]# chmod ux test1 [rootheima tmp]# ll test1 -rwxr--r--. 1 root root 0 Mar 6 20:45 test1 [rootheima tmp]# chmod gw test1 [rootheima tmp]# ll test1 -rwxrw-r--. 1 root root 0 Mar 6 20:45 test1 [rootheima tmp]# chmod o-r test1 [rootheima tmp]# ll test1 -rwxrw----. 1 root root 0 Mar 6 20:45 test1 [rootheima tmp]# ll test2 -rw-r--r--. 1 root root 0 Mar 6 20:45 test2 [rootheima tmp]# chmod ax test2 [rootheima tmp]# ll test2 -rwxr-xr-x. 1 root root 0 Mar 6 20:45 test2 [rootheima tmp]# ll test3 -rw-r--r--. 1 root root 0 Mar 6 20:45 test3 [rootheima tmp]# chmod ux,gw,o-r test3 [rootheima tmp]# ll test3 -rwxrw----. 1 root root 0 Mar 6 20:45 test3 [rootheima tmp]# chmod urw,grx,or test3 [rootheima tmp]# ll test3 -rw-r-xr--. 1 root root 0 Mar 6 20:45 test3 修改目录的权限 [rootheima tmp]# ll -d dir1/ drwxr-xr-x. 2 root root 4096 Mar 6 20:45 dir1/ [rootheima tmp]# ll dir1/ total 0 -rw-r--r--. 1 root root 0 Mar 6 20:45 file1 -rw-r--r--. 1 root root 0 Mar 6 20:45 file2 -rw-r--r--. 1 root root 0 Mar 6 20:45 file3 -rw-r--r--. 1 root root 0 Mar 6 20:45 file4 -rw-r--r--. 1 root root 0 Mar 6 20:45 file5 1.只修改目录本身的权限 [rootheima tmp]# chmod gw dir1/ [rootheima tmp]# ll -d dir1/ drwxrwxr-x. 2 root root 4096 Mar 6 20:45 dir1/ [rootheima tmp]# ll dir1/ total 0 -rw-r--r--. 1 root root 0 Mar 6 20:45 file1 -rw-r--r--. 1 root root 0 Mar 6 20:45 file2 -rw-r--r--. 1 root root 0 Mar 6 20:45 file3 -rw-r--r--. 1 root root 0 Mar 6 20:45 file4 -rw-r--r--. 1 root root 0 Mar 6 20:45 file5 说明目录下面文件的权限并没有修改 2.修改目录以及目录里所有文件的权限递归修改使用-R参数 [rootheima tmp]# chmod -R ow dir1/ [rootheima tmp]# ll -d dir1/ drwxrwxrwx. 2 root root 4096 Mar 6 20:45 dir1/ [rootheima tmp]# ll dir1/ total 0 -rw-r--rw-. 1 root root 0 Mar 6 20:45 file1 -rw-r--rw-. 1 root root 0 Mar 6 20:45 file2 -rw-r--rw-. 1 root root 0 Mar 6 20:45 file3 -rw-r--rw-. 1 root root 0 Mar 6 20:45 file4 -rw-r--rw-. 1 root root 0 Mar 6 20:45 file5
② 通过数字形式更改文件权限
● 学会用数字表示权限 字母和数字对应关系 r——4 w——2 x——1 -——0 rw- r-x r-- 用数字表示就是654 rwx rw- --- 用数字表示就是760 755 用字母表示就是rwx r-x r-x 644 用字母表示就是rw- r-- r--
● 使用数字形式修改文件权限 # chmod 644 file1 rw-r--r-- # chmod 700 file2 # chmod -R 755 dir1 2.5.2.4 总结
1普通权限当中rwx含义
● 目录rls列出目录内容w创建、删除、重命名等操作xcd进入目录
● 文件rcat等相关工具查看文件内容w修改文件内容x可执行程序脚
本文件等
2理解用户身份(UGO)
● U文件的拥有者创建
● G文件所属组里成员
● O陌生人其他人
3如何设置文件的权限-àchmod命令
● 用字母形式 chmod ux,grw,o-x filename
● 用数字形式 r——4 w——2 x——1 -——0 rw- r-x r-- 654 chmod 755 filename rwx r-x r-x 4是否可以在目录里创建或删除文件
看当前目录本身是否由w权限
5对于正常操作目录而言一般都会具有r和x权限
2.5.3 默认权限(了解)
2.5.3.1 什么是文件的默认权限
所谓文件的默认权限(遮罩权限)是指用户创建文件后文件天生就有的权限不需要设置。
2.5.3.2 文件默认权限由谁控制
文件默认权限由一个叫做umask的东西来控制。
2.5.3.3 umask如何控制文件默认权限
1临时控制
● 什么是临时控制
临时控制指的是用命令umask临时设置只在当前终端当前进程中生效。 查看当前用户的umask [rootlocalhost ~]# umask 0022 [rootlocalhost ~]# su - user01 [user01localhost ~]$ umask 0002 注意 1. 管理员和普通用户的umask不同就表示管理员和普通用户创建的文件的默认权限不同 2. 第1位数字表示高级权限后面3位数字表示普通权限
● 如何临时设置用户的umask?
写在前面
linux系统中默认创建目录的最大权限是0777文件的最大权限是0666 [rootlocalhost ~]# umask 0007 临时设置root用户的umask为0007 问umask0007那么在当前终端上root用户所创建目录和普通文件的权限分别是什么呢 计算过程如下 umask文件的最大权限-文件的默认权限 目录 目录的默认权限0777-umask0777-00070770 rwxrwx--- 普通文件 文件的默认权限0666-umask0666-00070660 rw-rw---- 说明 1.权限用数字表示时没有负数所以最小就是0 2.默认权限规则遵循Linux系统中权限最小化原则 特殊情况 $ stu1 umask 0003 目录0777-00030774 rwxrwxr-- 文件0666-00030663 rw-rw--wx 实际权限rw-rw-r-- $ user01 umask 0005 文件0666-00050661 rw-rw---x 实际权限:rw-rw--w-
2永久控制
● 什么是永久设置
永久设置指的是通过修改配置文件设置对用户的所有终端所有进程生效。
● 修改哪个配置文件呢
① 相关配置文件介绍 全局配置文件针对所有用户所有进程 /etc/profile 系统和用户的环境变量信息当用户第一次登录时,该文件被读取 /etc/bashrc 每个运行的bash信息系统别名、函数及默认权限的定义当bash被打开时,该文件被读取 局部配置文件针对某个特定用户以及用户的所有进程 ~/.bashrc 当前用户的bash信息当用户登录和每次打开新的shell时该文件被读取 ~/.bash_profile 当前用户的环境变量当用户登录时该文件被读取 ~/.bash_history 保存当前用户历史命令的文件 ~/.bash_logout 当用户退出bash或者终端时会首先执行该文件里的代码然后再退出
② 如何永久设置用户的umask 1.针对所有用户生效 # vim /etc/bashrc 在该文件的最后增加以下内容 umask 0007 重新读取该配置文件让其立马生效 # source /etc/bashrc 或者 # . /etc/bashrc 2.针对某个用户生效 比如只针对user01用户生效 [user01localhost ~]$ vim ~/.bashrc 在该文件的最后增加以下内容 umask 0007 总结 1. 配置文件分为全局配置和局部配置 2. 全局和局部配置冲突一般情况下以局部配置为准二般情况看情况
2.5.3.4 默认权限总结
1什么是文件的默认权限
文件被用户创建出来后天生自带的权限
2文件的默认权限由谁来控制
由umask的值来控制文件的默认权限
umask值针对的是用户
3如何去更改或设置用户的umask
① 临时设置
umask 007 只针对当前用户在当前终端生效
② 永久设置 针对所有人生效 --à /etc/bashrc重新读取生效 针对某个人生效 --à ~/.bashrc重新读取生效
2.5.4 文件的属主和属组
2.5.4.1 如何查看文件的属主和属组 2.5.4.2 如何修改文件的属主和属组
1chown命令修改
chown命令既可以修改文件的属主也可以修改文件的属组。 只修改文件的属主 # chown 用户名 文件名 修改文件的属主和属组 # chown 用户名.组名 文件名 # chown 用户名:组名 文件名 # chown 用户名. 文件名 //没有指定组名默认是用户的主组 只修改文件的属组 # chown .组名 文件名 # chown :组名 文件名 可以加-R选项表示递归修改 2chgrp命令修改
chgrp命令只能修改文件的属组 # chgrp 组名 文件名 2.6 shell编程
2.6.1 shell与shell脚本的概念
Shell介于内核与用户之间负责命令的解释。 Shell是一个用C语言编写的程序通过Shell用户可以访问操作系统内核服务。它类似于DOS下的command和后来的cmd.exe。
Shell既是一种命令语言又是一种程序设计语言。 Shell语言是解释型语言 shell解析器会逐行的解释shell程序代码然后一行一行的去运行。
Shell就是人机交互的一个桥梁。有GUI和cmdline两种人机交互模式
GUI图形用户界面特点是操作简单、易学易用适合使用电脑来工作的人。cmdline(命令行界面)譬如linux的终端和windows的cmd特点是不易用易学优点是可以进行方便的shell编程适合做开发的人。
linux的Shell种类众多一个系统可以存在多个shell可以通过cat/etc/shells命令查看系统中安装的shell。 [rootMissHou ~]# cat /etc/shells /bin/sh #是bash的一个快捷方式 /bin/bash #bash是大多数Linux默认的shell包含的功能几乎可以涵盖shell所有的功能 /sbin/nologin #表示非交互不能登录操作系统 /bin/dash #小巧高效功能相比少一些 /bin/csh #具有C语言风格的一种shell具有许多特性但也有一些缺陷 /bin/tcsh #是csh的增强版完全兼容csh
Bash由于易用和免费在日常工作中被广泛使用。同时Bash也是大多数linux系统默认的shell。
Shell script是一种为Shell编写的脚本程序。Shell编程一般指shell脚本编程不是指开发shell本身。
Shell编程跟java、php编程一样只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
脚本的作用重复化、复杂化的工作通过把工作的命令写成脚本以后仅仅需要执行脚本就能完成这些工作。
2.6.2 shell脚本基本格式
使用vi编辑器新建一个文件xx.sh。扩展名并不影响脚本执行见名知意。比如用php写shell脚本扩展名就用.php。 #!/bin/env bash # 以下内容是对脚本的基本信息的描述 # Name: 名字 # Desc:描述describe # Path:存放路径 # Usage:用法 # Update:更新时间 #下面就是脚本的具体内容 commands ... 1脚本第一行魔法字符#!指定解释器【必写】
#!/bin/bash 表示以下内容使用bash解释器解析
注意 如果直接将解释器路径写死在脚本里可能在某些系统就会存在找不到解释器的兼容性问题所以可以使用: #!/bin/env 解释器
2脚本第二部分注释(#号)说明对脚本的基本信息进行描述【可选】
3脚本第三部分脚本要实现的具体代码内容
示例 #!/bin/sh //指定脚本编辑器这里是用/bin/sh做解释器 cd ~ mkdir shell_tut //创建一个目录shell_tut cd shell_tut //切换到shell_tut目录 for ((i0; i10; i)); do //循环条件一共循环10次 touch test_$i.txt //创建一个test_0…9.txt文件 done //循环体结束
说明mkdir, touch都是系统自带的程序一般在/bin或者/usr/bin目录下。 for, do, done是sh脚本语言的关键字。
2.6.3 shell程序的运行
shell程序的运行有多种方法这里介绍三种方法
第一种./xx.sh和运行二进制可执行程序方法一样。这样运行shell要求shell程序必须具有可执行权限。chmod ax xx.sh来添加可执行权限。
第二种source xx.shsource是linux的一个命令这个命令就是用来执行脚本程序的。这样运行不需要脚本具有可执行权限。
第三种bash xx.shbash是一个脚本程序解释器本质上是一个可执行程序。这样执行相当于我们执行了bash程序然后把xx.sh作为argv[1]传给他运行。
2.6.4 Shell变量
2.6.4.1 语法格式
变量值如your_name”itcast.cn”
注意变量名和等号之间不能有空格同时变量名的命名必须遵循如下规则
首个字符必须为字母a-z, A-Z中间不能有空格可以使用下划线_不能使用标点符号不能使用bash里的关键字可用help命令查看保留关键字
2.6.4.2 变量使用
使用一个定义过的变量只要在变量名前面加$即可。
your_name”itcast.cn”
echo $your_name
echo ${your_name}
花括号是可选的加不加都行加花括号是为了帮助解释器识别变量的边界。
已定义的变量可以被重新定义。
2.6.4.3 变量类型
局部变量 局部变量在脚本或命令中定义仅在当前shell实例中有效其他shell启动的程序不能访问局部变量。
环境变量 所有的程序包括shell启动的程序都能访问环境变量。有些程序需要环境变量来保证其正常运行。可以用set命令查看当前环境变量。
shell变量 shell 变量是由shell程序设置的特殊变量。Shell变量中有一部分是环境变量有一部分是局部变量这些变量保证了shell的正常运行。
2.6.5 Shell参数传递
在执行Shell脚本时可以向脚本传递参数。
脚本被获取参数的格式为$n。n代表一个数字1为执行脚本的第一个参数2为执行脚本的第二个参数依次类推….. $0表示当前脚本名称。
2.6.5.1 特殊字符 $# 传递到脚本的参数个数 $* 以一个单字符串显示所有向脚本传递的参数 $$ 脚本运行的当前进程ID号 $! 后台运行的最后一个进程的ID号 $ 与$*相同但是使用时加引号并在引号中返回每个参数 $? 显示最后命令的退出状态。0表示没有错误其他任何值表明有错误 例子
#!/bin/bash
echo “第一个参数为$1”;
echo “参数个数为$#”;
echo “传递的参数作为一个字符串显示$*”;
执行脚本./test.sh 12,38,56,79
2.6.5.2 $*和$区别
相同点都表示传递给脚本的所有参数。
不同点
不被””包含时$*和$都以$1 $2 …$n的形式组成参数列表。
被””包含时$*会将所有的参数作为一个整体以 ”$1 $2 …$n”的形式组成一个
整串” $”会将各个参数分开以”$1 $2 …$n”的形式组成一个参数列表。
2.6.6 Shell运算符
Shell和其他编程语言一样支持包括算术、关系、布尔、字符串等运算符。原生bash不支持简单的数学运算但是可以通过其他命令来实现例如expr。expr是一款表达式计算工具使用它能完成表达式的求值操作。
例如两个数相加
valexpr 2 2
echo $val
注意
表达式和运算符之间要有空格例如22是不对的必须写成2 2。
完整的表达式要被包含注意不是单引号在Esc键下边。
2.6.7 条件判断
2.6.7.1 条件判断语法结构 格式1 test 条件表达式 格式2 [ 条件表达式 ] 格式3 [[ 条件表达式 ]] 支持正则 说明 [ ] 为test命令的另一种形式但要注意 1.必须在左括号的右侧和右括号的左侧各加一个空格否则会报错。 2.test命令使用标准的数学比较符号来表示字符串的比较而用文本符号来表示数值的比较。 3.大于符号或小于符号必须要转义否则会被理解成重定向。 [[ ]] 测试变量时如果变量为空且变量未加引号不会报错但[]会; [[ ]] 测试字符串支持正则表达式匹配 [[ ]] 是内建于bash的[ ]可能是个外部命令
2.6.7.2 条件判相关参数
① 判断文件类型 ② 判断文件权限 ③ 判断文件新旧
说明这里的新旧指的是文件的修改时间。 ④ 判断整数 ⑤ 判断字符串 ⑥ 多重条件判断 特别说明 前面的表达式为真才会执行后面的代码
|| 前面的表达式为假才会执行后面的代码
; 只用于分割命令或表达式
示例说明
数值比较 [rootserver ~]# [ $(id -u) -eq 0 ] echo the user is admin [rootserver ~]$ [ $(id -u) -ne 0 ] echo the user is not admin [rootserver ~]$ [ $(id -u) -eq 0 ] echo the user is admin || echo the user is not admin [rootserver ~]# uidid -u [rootserver ~]# test $uid -eq 0 echo this is admin this is admin [rootserver ~]# [ $(id -u) -ne 0 ] || echo this is admin this is admin [rootserver ~]# [ $(id -u) -eq 0 ] echo this is admin || echo this is not admin this is admin [rootserver ~]# su - stu1 [stu1server ~]$ [ $(id -u) -eq 0 ] echo this is admin || echo this is not admin this is not admin
类C风格的数值比较 注意在(( ))中表示赋值表示判断 [rootserver ~]# ((12));echo $? [rootserver ~]# ((12));echo $? [rootserver ~]# ((21));echo $? [rootserver ~]# ((2!1));echo $? [rootserver ~]# ((id -u0));echo $? [rootserver ~]# ((a123));echo $a [rootserver ~]# unset a [rootserver ~]# ((a123));echo $?
字符串比较 注意双引号引起来看作一个整体 和 在 [ 字符串 ] 比较中都表示判断 [rootserver ~]# ahello world;bworld [rootserver ~]# [ $a $b ];echo $? [rootserver ~]# [ $a $b ];echo $? [rootserver ~]# [ $a ! $b ];echo $? [rootserver ~]# [ $a ! $b ];echo $? 错误 [rootserver ~]# [ $a $b ];echo $? [rootserver ~]# test $a ! $b;echo $? 2.6.8 流程控制
2.6.8.1 if else语句
方式一 if [ condition ];then command1 else command2 fi 方式二 if [ condition1 ];then command1 结束 elif [ condition2 ];then command2 结束 else command3 fi 注释 如果条件1满足执行命令1后结束如果条件1不满足再看条件2如果条件2满足执行命令2后结束如果条件1和条件2都不满足执行命令3结束.
示例
让用户自己输入字符串如果用户输入的是hello请打印world否则打印“请输入hello” #!/bin/env bash read -p 请输入一个字符串: str if [ $str hello ];then echo world else echo 请输入hello! fi 1 #!/bin/env bash 2 3 read -p 请输入一个字符串: str 4 if [ $str hello ] 5 then 6 echo world 7 else 8 echo 请输入hello! 9 fi echo 该脚本需要传递参数 1 if [ $1 hello ];then 2 echo hello 3 else 4 echo 请输入hello 5 fi 2.6.8.2 for循环语句
1列表循环
列表for循环用于将一组命令执行已知的次数 for variable in {list} do command command … done 或者 for variable in a b c do command command done
示例 # for var in {1..10};do echo $var;done # for var in 1 2 3 4 5;do echo $var;done # for var in seq 10;do echo $var;done # for var in $(seq 10);do echo $var;done # for var in {0..10..2};do echo $var;done # for var in {2..10..2};do echo $var;done # for var in {10..1};do echo $var;done # for var in {10..1..-2};do echo $var;done # for var in seq 10 -2 1;do echo $var;done 2不带列表循环
不带列表的for循环执行时由用户指定参数和参数的个数 for variable do command command … Done
示例 #!/bin/bash for var do echo $var done echo 脚本后面有$#个参数 3类C风格的for循环 for(( expr1;expr2;expr3 )) do command command … Done for (( i1;i5;i)) do echo $i done expr1定义变量并赋初值 expr2决定是否进行循环条件 expr3决定循环变量如何改变决定循环什么时候退出
示例 # for ((i1;i5;i));do echo $i;done # for ((i1;i10;i2));do echo $i;done # for ((i2;i10;i2));do echo $i;done 2.6.8.3 while循环语句
特点条件为真就进入循环条件为假就退出循环 while 表达式 do command... done while [ 1 -eq 1 ] 或者 (( 1 2 )) do command command ... done
示例循环打印1-5数字 FOR循环打印 for ((i1;i5;i)) do echo $i done while循环打印 i1 while [ $i -le 5 ] do echo $i let i done
let命令是BASH中用于计算的工具用于执行一个或多个表达式变量计算中不需要加上$来表示变量。自加操作let no 自减操作let no-- 2.6.8.4 case语句
case语句为多重匹配语句如果匹配成功执行相匹配的命令 case var in 定义变量;var代表是变量名 pattern 1) command1 需要执行的语句 ;; 两个分号代表命令结束 pattern 2) command2 ;; pattern 3) command3 ;; *) default不满足以上模式默认执行*)下面的语句 command4 ;; esac esac表示case语句结束 2.6.9 函数的使用
所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分直至shell解释器首次发现它时才可以使用。调用函数仅使用其函数名即可。 [function] funname[()] { action; [return int;] }
说明可以带function fun()定义也可以直接fun()定义不带任何参数。
示例1 #!/bin/env bash demoFun() { echo “这是我的第一个shell函数” } echo “-------函数开始执行-------” demoFun echo “-------函数执行完毕-------”
函数中return说明
return可以“结束一个函数”。类似于循环控制语句break(结束当前循环执行循环体后面的代码)。return默认返回函数中最后一个命令状态值也可以给定参数值范围是0-256之间。如果没有return命令函数将返回最后一个指令的退出状态值。
示例2 #!/bin/env bash funWithReturn() { echo “这个函数会对输入的两个数字进行相加运算…” echo “输入第一个数字” read aNum echo “输入第二个数字” read anotherNum echo “两个数字分别为$aNum和$anotherNum !” return $(($aNum $anotherNum)) } funWithReturn echo “输入的两个数字之和为$? !” 函数返回值在调用该函数后通过$? 来获得。 在shell中调用函数时可以向其传递参数。在函数体内部通过$n的形式来获取参数的值例如$1表示第一个参数$2表示第二个参数…
注意当n10时需要使用${n}来获取参数。 #!/bin/env bash funWithParam(){ echo “第一个参数为$1 !” echo “第二个参数为$2 !” echo “第十个参数为$10 !” echo “第十个参数为${10} !” echo “第十一个参数为${11} !” echo “参数总数有$# 个!” echo “作为一个字符串输出所有参数$* !” } funWithParam 1 2 3 4 5 6 7 8 9 34 73
2.7 Makefile工程管理器
2.7.1 Makefile概述
1、为什么需要MakefileMakefile是用来管理工程的在一个正式的软件项目中由很多个.c和.h文件构成此时如果直接在命令行编译需运行“gcc *.c *.S -o exe”命令每次编译都要重新输入该命令此问题严重影响工作效率我们通过Makefile来进行一键编译。
2、Makefile中的一些基本概念
目标目标顶格写后面是冒号冒号后面是依赖依赖依赖是用来产生目标的原材料命令命令前面一定是Tab不能是顶格也不能是多个空格命令即要生成目标需要做的动作。
3、Makefile的基本工作原理当我们执行“make xx”的时候Makefile会自动执行xx这个目标下面的命令语句当我们“make xx”的时候是否执行命令是取决于依赖的依赖如果成立就会执行命令否则不执行我们直接执行make和make第1个目标的效果是相同的第1个目标即默认目标。
4、进阶学习Makefile的资料我们学习Makefile的思路为先学会基本的概念和应用先理解Makefile的概念和使用方法及工作原理先自己会写简单的Makefile来管理工程一般先学到这里就可以了更深入的内容可在工作中碰到再学习即可若需深入学习Makefile建议参考《跟我一起学Makefile》作者陈皓学习前期学习前6个章节内容即可。
示例 用编辑器编辑源文件hello.c #includestdio.h int main(void){ printf(“Hello World!”); return 0; } gcc hello.c -o hello //生成可执行文件hello gcc hello.c //默认生成可执行文件a.out Makefile文件 hello:hello.c Tabgcc –o hello hello.c 或者 hello:hello.o Tabgcc –o hello hello.o hello.o:hello.c Tabgcc –c –o hello.o hello.c 或者 hello:hello.o Tabgcc –o hello hello.o hello.o:hello.c Tabgcc –o hello.o –c hello.c .PHONY:clean all clean: -rm -rf *.o Makefile文件的执行 Makefile //默认第一个目标文件为生成文件 Makefile hello //生成可执行文件 2.7.2 通配符%和Makefile自动推导规则
1、%是Makefile中的通配符代表一个或几个字母。也就是说%.o就代表所有以.o为结尾的文件。
2、所谓自动推导其实就是Makefile的规则。当Makefile需要某一个目标时他会把这个目标去套规则说明一旦套上了某个规则说明则Makefile会试图寻找这个规则中的依赖如果能找到则会执行这个规则用依赖生成目标。
2.7.3 Makefile中定义和使用变量
Makefile中定义和使用变量和shell脚本中非常相似。相似是说都没有变量类型直接定义使用引用变量时用$var
2.7.4 伪目标.PHONY
1、伪目标意思是这个目标本身不代表一个文件执行这个目标不是为了得到某个文件或东西而是单纯为了执行这个目标下面的命令。
2、伪目标一般都没有依赖因为执行伪目标就是为了执行目标下面的命令。既然一定要执行命令了那就不必加依赖因为不加依赖意思就是无条件执行。
3、伪目标可以直接写不影响使用但是有时候为了明确声明这个目标是伪目标会在伪目标的前面用.PHONY来明确声明它是伪目标。
2.7.5 使用Makefile时的注意事项
1、Makefile的文件名合法的一般有2个Makefile或者makefile
2、有时候Makefile总体比较复杂因此分成好几个Makefile来写。然后在主Makefile中引用其他的用include指令来引用。引用的效果也是原地展开和C语言中的头文件包含非常相似。
3、Makefile中注释使用#和shell一样。
2.7.6 命令前面的用来静默执行
1、在makefile的命令行中前面的表示静默执行。
2、Makefile中默认情况下在执行一行命令前会先把这行命令给打印出来然后再执行这行命令。
3、如果你不想看到命令本身只想看到命令执行就静默执行即可。
2.7.7 Makefile中几种变量赋值运算符
1、 最简单的赋值
2、: 一般也是赋值
以上这两个大部分情况下效果是一样的但是有时候不一样。
用赋值的变量在被解析时他的值取决于最后一次赋值时的值所以你看变量引用的值时不能只往前面看还要往后面看。
用:来赋值的则是就地直接解析只用往前看即可。
3、? 如果变量前面并没有赋值过则执行这条赋值如果前面已经赋值过了则本行被忽略。实验可以看出所谓的没有赋值过其实就是这个变量没有被定义过
4、 用来给一个已经赋值的变量接续赋值意思就是把这次的值加到原来的值的后面有点类似于strcat。在shell makefile等文件中可以认为所有变量都是字符串就相当于给字符串stcat接续内容注意一个细节续接的内容和原来的内容之间会自动加一个空格隔开
注意Makefile中并不要求赋值运算符两边一定要有空格或者无空格这一点比shell的格式要求要松一些。
2.7.8 Makefile中使用通配符
1、* 若干个任意字符
2、? 1个任意字符
3、[] 将[]中的字符依次去和外面的结合匹配
还有个%也是通配符表示任意多个字符和*很相似但是%一般只用于规则描述中又叫做规则通配符。
2.7.9 Makefile的自动变量
1、为什么使用自动变量。在有些情况下文件集合中文件非常多描述的时候很麻烦所以我们Makefile就用一些特殊的符号来替代符合某种条件的文件集这就形成了自动变量。
2、自动变量的含义预定义的特殊意义的符号。就类似于C语言编译器中预制的那些宏__FILE__一样。
3、常见自动变量
$ 规则的目标文件名
$ 规则的依赖文件名
$^ 依赖的文件集合