信息安全系统设计基础第一周学习总结(上) 20135321 余佳源
实验一
Linux 简介
实验介绍
本节主要介绍 Linux 的历史,Linux 与 Windows 的区别等入门知识。
一、Linux 为何物
Linux 就是一个操作系统,就像你多少已经了解的 Windows(xp,7,8)和 Max OS ,至于操作系统是什么,就不用过多解释了,如果你学习过前面的入门课程,应该会有个基本概念了,这里简单介绍下操作系统在整个计算机系统中的角色。
我们的 Linux 也就是系统调用和内核那两层,当然直观的来看,我们使用的操作系统还包含一些在其上运行的应用程序,比如文本编辑器,浏览器,电子邮件。
四、Linux 与 Windows 到底有哪些不同
1.免费与收费
2.软件与支持
3.安全性
4.使用习惯
5.可定制性
6.应用范畴
或许你之前不知道 Linux ,要知道,你之前在 Windows 使用百度,谷歌,上淘宝,聊 QQ 时,支撑这些软件和服务的,是后台成千上万的 Linux 服务器主机,它们时时刻刻都在进行着忙碌的数据处理和运算,可以说世界上大部分软件和服务都是运行在 Linux 之上的。
7.Windows 没有的
8.Linux 没有的
大致的学习路径如下:
实验二 基本概念及操作
本节实验主要有:
1、实验楼环境介绍 2、常用 Shell 命令及快捷键 3、Linux 使用小技巧
相对于现在的 Windows 系统,UNIX/Linux 本身是没有图形界面的,我们通常在 Unix/Linux 发行版上看到的图形界面实际都只是运行在 Linux 系统之上的一套软件,类似 Windows95 之前的Windows 的图形界面实则也只是运行在 DOS 环境的一套软件。而 Linux 上的这套软件以前是XFree86,现在则是 xorg(X.Org),而这套软件又是通过 X 窗口系统(X Window System,也常被称为X11或X)实现的,X 本身只是工具包及架构协议,而 xorg 便是 X 架构规范的一个实现体,也就是说它是实现了 X 协议规范的一个提供图形用户界面服务的服务器,就像实现了 http 协议提供 web 服务的 Apache。如果只有服务器也是不能实现一个完整的桌面环境的,当然还需要一个客户端,我们称为 X Client,像如下几个大家熟知也最流行的实现了客户端功能的桌面环境KDE,GNOME,XFCE,LXDE,其中就有你看到的,实验楼目前使用的 XFCE桌面环境,部分老用户可能可以回想起,实验楼之前使用的环境是 LXDE。这也意味着在 Linux 上你可以自己选择安装不同的桌面环境,甚至可以定制自己的专属桌面。
通常在我们使用 Linux 时,我们并不是直接与系统打交道,而是通过一个叫做 Shell 的中间程序来完成的,在图形界面下为了实现让我们在一个窗口中完成接受用户输入和显示输出,Linux 系统还提供了一个叫做终端模拟器的程序(Terminal),下面几个比较常见的终端模拟器,例如 gnome-terminal,kconsole,xterm,rxvt,kvt,nxterm 和 eterm,目前我们的实验中的终端程序是 xfce 桌面环境自带的 xfce-terminal。不过要注意的是这里所说的终端(Terminal)和控制台(Console)是有区别的。
终端本质上是对应着 Linux 上的 /dev/tty 设备,Linux 的多用户登陆就是通过不同的 /dev/tty 设备完成的,Linux 默认提供了 6 个纯命令行界面的 “terminal”(准确的说这里应该是 6 个 virtual consoles)来让用户登录,在物理机系统上你可以通过使用[Ctrl]
+[Alt]
+[F1]
~
[F6]
进行切换,不过在我们的在线实验环境中可能无法切换,因为特殊功能按键会被你主机系统劫持。当你切换到其中一个终端后想要切换回图形界面,你可以按下[Ctrl]
+[Alt]
+[F7]
来完成。
通常在图形界面中对实际体验带来差异的不是上述的不同发行版的各种终端模拟器,而大都是这个 Shell(壳),有壳就有核,这里的核就是指的 UNIX/Linux 内核,Shell 是指“提供给使用者使用界面”的软件(命令解析器),类似于 DOS 下的 command(命令行)和后来的 cmd.exe。普通意义上的 Shell 就是可以接受用户输入命令的程序。它之所以被称作 Shell 是因为它隐藏了操作系统底层的细节。同样的 Unix/Linux 下的图形用户界面 GNOME 和 KDE,有时也被叫做“虚拟 shell”或“图形 shell”。
Unix/Linux 操作系统下的 Shell 既是用户交互的界面,也是控制系统的脚本语言。当然在这点也有别于 Windows 下的命令行,虽然也提供了很简单的控制语句。在Windows 操作系统下,可能有些用户从来都不会直接的使用 Shell,然而在 UNIX 系列操作系统下,Shell 仍然是控制系统启动、X11 启动和很多其他实用工具的脚本解释程序。
在 UNIX/Linux 中比较流行的常见的 Shell 有 bash,zsh,ksh,csh 等等,Ubuntu 终端默认使用的是 bash,默认的桌面环境是 GNOME 或者 Unity(基于 GNOME),但我们的环境中使用的分别是zsh 和 xfce。
如图,双击桌面上的Xface
终端
图标,打开终端,打开终端后会自动运行 Shell 程序,然后我们就可以输入命令让系统来执行了:
按键 |
作用 |
|
键盘输入结束或退出终端 |
|
暂定当前程序,暂停后按下任意键恢复运行 |
|
将当前程序放到后台运行,恢复到前台为命令 |
|
将光标移至输入行头,相当于 |
|
将光标移至输入行末,相当于 |
|
删除从光标所在位置到行末 |
|
向前删除一个单词 |
|
将终端显示向上滚动 |
|
将终端显示向下滚动 |
很简单,你可以使用键盘上的方向上
键,恢复你之前输入过的命令,你一试便知。
通配符是一种特殊语句,主要有星号(*)和问号(?),用来对对字符串进行模糊匹配(比如文件名,参数名)。当查找文件夹时,可以使用它来代替一个或多个真正字符;当不知道真正字符或者懒得输入完整名字时,常常使用通配符代替一个或多个真正的字符。
终端里面输入的通配符是由 Shell 处理的,不是由所涉及到命令语句处理的,它只会出现在命令的“参数值”里(它不用在 命令名称里, 命令不记得,那就用Tab
补全)。当 Shell 在“参数值”中遇到了通配符时,Shell 会将其当作路径或文件名去在磁盘上搜寻可能的匹配:若符合要求的匹配存在,则进行代换(路径扩展);否则就将该通配符作为一个普通字符传递给“命令”,然后再由命令进行处理。总之,通配符 实际上就是一种 Shell 实现的路径扩展功能。在 通配符被处理后, Shell 会先完成该命令的重组,然后再继续处理重组后的命令,直至执行该命令。
Shell 常用通配符:
字符 |
含义 |
|
匹配 0 或多个字符 |
|
匹配任意一个字符 |
|
匹配 list 中的任意单一字符 |
|
匹配 除list 中的任意单一字符以外的字符 |
|
匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z] |
|
匹配 sring1 或 string2 (或更多)其一字符串 |
|
匹配 c1-c2 中全部字符 如{1..10}
|
在 Linux 环境中,如果你遇到困难,可以使用man
命令,它是Manual page
的缩写。
Manual pages 是在 UNIX 或类 UNIX 操作系统在线软件文档的一种普遍的形式。 内容包括计算机程序(包括库和系统调用),正式的标准和惯例,甚至是抽象的概念。用户可以通过执行 man 命令调用手册页。
你可以使用如下方式来获得某个命令的说明和使用方式的详细介绍:
$ man <
command_name>
比如你想查看 man 命令本身的使用方式,你可以输入:
man man
通常情况下,man 手册里面的内容都是英文的,这就要求你有一定的英文基础。man 手册的内容很多,涉及了 Linux 使用过程中的方方面面,为了便于查找,是做了分册(分区段)处理的,在Research UNIX、BSD、OS X 和 Linux 中,手册通常被分为8个区段,安排如下:
区段 |
说明 |
1 |
一般命令 |
2 |
系统调用 |
3 |
库函数,涵盖了C标准函数库 |
4 |
特殊文件(通常是/dev中的设备)和驱动程序 |
5 |
文件格式和约定 |
6 |
游戏和屏保 |
7 |
杂项 |
8 |
系统管理命令和守护进程 |
实验二操作及截图:
利用tab键补全
不止补全命令,补全目录,补全命令参数都是没问题的:
使用Ctrl+c键来强行终止当前程序(你可以放心它并不会使终端退出):
输入tail
输入find /
卡顿情况导致过多的Ctrl+c
使用通配符找到这两个忘了文件名的文本文件
建立连续文件
Man man 指令
作业:
实验三 用户及文件权限管理
1、Linux 中创建、删除用户,及用户组等操作。 2、Linux 中的文件权限设置
1、Linux 中创建、删除用户,及用户组等操作。 2、Linux 中的文件权限设置。
通过第一节课程的学习,你应该已经知道,Linux 是一个可以实现多用户登陆的操作系统,比如“李雷”和“韩梅梅”都可以同时登陆同一台主机,他们共享一些主机的资源,但他们也分别有自己的用户空间,用于存放各自的文件。但实际上他们的文件都是放在同一个物理磁盘上的甚至同一个逻辑分区或者目录里,但是由于 Linux 的 用户管理 和 权限机制 ,不同用户不可以轻易地查看、修改彼此的文件。
下面我们就来学习一下 Linux 下的账户管理的基础知识。
请打开终端,输入命令:
$ who am i
或者
$who mom likes
输入的第一列表示打开当前伪终端的用户的用户名(要查看当前登录用户的用户名,去掉空格直接使用 whoami
即可),第二列的 pts/0
中 pts
表示伪终端,所谓伪是相对于 /dev/tty
设备而言的,还记得上一节讲终端时的那七个使用[Ctrl]
+[Alt]
+[F1]
~
[F7]
进行切换的 /dev/tty
设备么,这是“真终端”,伪终端就是当你在图形用户界面使用 /dev/tty7
时每打开一个终端就会产生一个伪终端, pts/0
后面那个数字就表示打开的伪终端序号,你可以尝试再打开一个终端,然后在里面输入 who am i
,看第二列是不是就变成 pts/1
了,第三列则表示当前伪终端的启动时间。
who
命令其它常用参数
参数 |
说明 |
|
打印能打印的全部 |
|
打印死掉的进程 |
|
同 |
|
打印当前登录用户数及用户名 |
|
打印当前登录用户登录信息 |
|
打印运行等级 |
在 Linux 系统里, root
账户拥有整个系统至高无上的权利,比如 新建/添加 用户。
root 权限,系统权限的一种,与 SYSTEM 权限可以理解成一个概念,但高于 Administrator 权限,root 是 Linux 和 UNIX 系统中的超级管理员用户帐户,该帐户拥有整个系统至高无上的权力,所有对象他都可以操作,所以很多黑客在入侵系统的时候,都要把权限提升到 root 权限,用 Windows 的方法理解也就是将自己的非法帐户添加到 Administrators 用户组。更比如安卓操作系统中(基于 Linux 内核)获得 root 权限之后就意味着已经获得了手机的最高权限,这时候你可以对手机中的任何文件(包括系统文件)执行所有增、删、改、查的操作。
我们一般登录系统时都是以普通账户的身份登录的,要创建用户需要 root 权限,这里就要用到 sudo
这个命令了。不过使用这个命令有两个大前提,一是你要知道当前登录用户的密码,二是当前用户必须在 sudo
用户组。shiyanlou 用户的密码就是 “shiyanlou” ,它同时也属于 sudo 用户组(稍后会介绍如何查看和添加用户组)。现在我们新建一个叫 lilei 的用户:
$ sudo adduser lilei
按照提示输入 shiyanlou 密码(Linux 下密码输入通常都是不可见的),然后是给 lilei 用户设置密码,后面的选项的一些内容你可以选择直接回车使用默认值:
这个命令不但可以添加用户到系统,同时也会默认为新用户创建 home 目录:
$ ls /home
现在你已经创建好一个用户,并且你可以使用你创建的用户登录了,使用如下命令切换登录用户:
$ su
-llilei
退出当前用户跟退出终端一样可以使用 exit
命令或者使用快捷键 Ctrl+d
。
在 Linux 里面每个用户都有一个归属(用户组),用户组简单地理解就是一组用户的集合,它们共享一些资源和权限,同时拥有私有资源,就跟家的形式差不多,你的兄弟姐妹(不同的用户)属于同一个家(用户组),你们可以共同拥有这个家(共享资源),爸妈对待你们都一样(共享权限),你偶尔写写日记,其他人未经允许不能查看(私有资源和权限)。当然一个用户是可以属于多个用户组的,正如你既属于家庭,又属于学校或公司。
在 Linux 里面如何知道自己属于哪些用户组呢?
$groups shiyanlou
其中冒号之前表示用户,后面表示该用户所属的用户组。这里可以看到 shiyanlou 用户同时属于 shiyanlou 和 sudo 用户组,每次新建用户如果不指定用户组的话,默认会自动创建一个与用户名相同的用户组(差不多就相当于家长的意思,或者说是老总)。默认情况下在sudo用户组里的可以使用sudo命令获得root权限。
/etc/group
文件$ cat /etc/
group| sort
这里 cat
命令用于读取指定文件的内容并打印到终端输出,后面会详细讲它的使用。 | sort
表示将读取的文本进行一个字典排序再输出,然后你将看到如下一堆输出,你可以在最下面看到 shiyanlou 的用户组信息:
没找到,没关系,你可以使用命令过滤掉一些你不想看到的结果:
$ cat /etc/
group| grep -E
"shiyanlou|sudo"
etc/group
文件格式说明/etc/group 的内容包括用户组(Group)、用户组口令、GID 及该用户组所包含的用户(User),每个用户组一条记录。格式如下:
group_name:password:GID:user_list
你看到上面的 password 字段为一个 'x' 并不是说密码就是它,只是表示密码不可见而已。
默认情况下新创建的用户是不具有 root 权限的,也不在 sudo 用户组,可以让其加入sudo用户组从而获取 root 权限。
$ su -l lilei
$ sudo ls
会提示 lilei 不在 sudoers 文件中,意思就是 lilei 不在 sudo 用户组中,至于 sudoers 文件(/etc/sudoers)你现在最好不要动它,操作不慎会导致比较麻烦的后果。
使用 usermod
命令可以为用户添加用户组,同样使用该命令你必需有 root 权限,你可以直接使用 root 用户为其它用户添加用户组,或者用其它已经在 sudo 用户组的用户使用 sudo 命令获取权限来执行该命令
这里我用 shiyanlou 用户执行 sudo 命令将 lilei 添加到 sudo 用户组,让它也可以使用 sudo 命令获得 root 权限
$ su shiyanlou
$ groups lilei
$sudo usermod -
Gsudo lilei
$ groups lilei
然后你再切换会 lilei 用户,现在就可以使用 sudo 获取 root 权限了。
删除用户是很简单的事:
$sudo deluser lilei --remove-home
我们之前已经很多次用到 ls
命令了,如你所见,我们用它来列出并显示当前目录下的文件,当然这是在不带任何参数的情况下,它能做的当然不止这么多,现在我们就要用它来查看文件权限。
使用较长格式列出文件:
$ ls
-l
你可能除了知道最后面那一项是文件名之外,其它项就不太清楚了,那么到底是什么意思呢:
可能你还是不太明白,比如第一项文件类型和权限那一堆东西具体指什么,链接又是什么,何为最后修改时间,下面一一道来:
关于文件类型,这里有一点你必需时刻牢记Linux 里面一切皆文件,正因为这一点才有了设备文件( /dev
目录下有各种设备文件,大都跟具体的硬件设备相关)这一说,还有 socket
(网络套接字,具体是什么,感兴趣的用户可以自己去了解或期待实验楼的后续相关课程),和 pipe
(管道,这个东西很重要,我们以后将会讨论到,这里你先知道有它的存在即可)。软链接文件,链接文件是分为两种的,另一种当然是“硬链接”(硬链接不常用,具体内容不作为本课程讨论重点,而软链接等同于 Windows 上的快捷方式,你记住这一点就够了)
读权限,表示你可以使用 cat <file name>
之类的命令来读取某个文件的内容;写权限,表示你可以编辑和修改某个文件; 执行权限,通常指可以运行的二进制程序文件或者脚本文件,如同 Windows 上的 'exe' 后缀的文件,不过 Linux 上不是通过文件后缀名来区分文件的类型。你需要注意的一点是,一个目录要同时具有读权限和执行权限才可以打开,而一个目录要有写权限才允许在其中创建其它文件,这是因为目录文件实际保存着该目录里面的文件的列表等信息
所有者权限,这一点相信你应该明白了,至于所属用户组权限,是指你所在的用户组中的所有其它用户对于该文件的权限,比如,你有一个艾派德,那么这个用户组权限就决定了你的兄弟姐妹有没有权限使用它破坏它和占有它。
链接到该文件所在的 inode 结点的文件名数目(关于这个概念涉及到 Linux 文件系统的相关概念知识,不在本课程的讨论范围,感兴趣的用户可以自己去了解)。
以 inode 结点大小为单位来表示的文件大小,你可以给 ls 加上 -lh
参数来更直观的查看文件的大小。
明白了文件权限的一些概念,我们顺带补充一下关于 ls
命令的一些其它常用的用法:
$ls -
A
当然,你可以同时使用 '-A' 和 '-l' 参数:
$ls -
Al
查看某一个目录的完整属性,而不是显示目录里面的文件属性:
$ ls -dl
<目录名>
$ls -
AsSh
其中小 s 为显示文件大小,大 S 为按文件大小排序,若需要知道如何按其它方式排序,请使用“man”命令查询。
假设目前是 lilei 用户登录,新建一个文件,命名为 “iphone6”:
$ touch iphone6
可见文件所有者是 lilei :
现在,使用以下命令变更文件所有者为 shiyanlou :
$ cd /home/lilei
$ ls iphone6
$ sudo chown shiyanlou iphone6
$ cp iphone6 /home/shiyanlou
现在查看,发现 文件所有者成功修改为 shiyanlou :
如果你有一个自己的文件不想被其他用户读、写、执行,那么就需要对文件的权限做修改,这里有两种方式:
方式一 :二进制数字表示
每个文件的三组权限(拥有者,所属用户组,其他用户,记住这个顺序是一定的)就对应这一个 "rwx",也就是一个 '7' ,所以如果我要将文件“iphone6”的权限改为只有我自己可以用那么就这样:
为了演示,我先在文件里加点内容:
$
echo"echo \"hello shiyanlou\""
> iphone6
然后修改权限:
$
chmod700
iphone6
现在,其他用户已经不能读这个“iphone6”文件了:
完成上述相同的效果,你可以:
$
chmodgo-rw iphone
'g''o'还有'u',分别表示group,others,user,'+','-' 就分别表示增加和去掉相应的权限。
实验三操作及截图
创建新用户lilei
切换用户
登出lilei用户
列出用户
查看分组
用户组信息
过滤结果
提示 lilei 不在 sudoers 文件中,意思就是 lilei 不在 sudo 用户组中
用 shiyanlou 用户执行 sudo 命令将 lilei 添加到 sudo 用户组,让它也可以使用 sudo 命令获得 root 权限
删除用户
使用较长格式列出文件:
$ ls –A
$ ls –Al
$ ls –AsSh
新建一个文件,命名为 “iphone6” ,文件所有者是 lilei
变更文件所有者为shiyanlou
变更用户权限
作业:
添加loutest用户
实验四 Linux 目录结构及文件基本操作
1、Linux 的文件组织目录结构。 2、相对路径和绝对路径。 3、对文件的移动、复制、重命名、编辑等操作。
有人可能不明白这路径是指什么,有什么用。顾名思义,路径就是你要去哪儿的路线嘛。如果你想进入某个具体的目录或者想获得某个目录的文件(目录本身也是文件)那就得用路径来找到了。
使用 cd
命令可以切换目录,在 Linux 里面使用 .
表示当前目录,..
表示上一级目录(**注意,还记得我们上一节介绍过的,以 .
开头的文件都是隐藏文件,所以这两个目录必然也是隐藏的,你可以使用 ls -a
命令查看隐藏文件), -
表示上一次所在目录,~
通常表示当前用户的"home"目录。使用 pwd
命令可以获取当前所在路径(绝对路径)。
进入上一级目录:
$
cd..
进入你的“home”目录:
$
cd~
# 或者 cd /home/<你的用户名>
使用 pwd
获取当前路径:
$
pwd
关于绝对路径,简单地说就是以根"/"目录为起点的完整路径,以你所要到的目录为终点,表现形式如: /usr/local/bin
,表示根目录下的 usr 目录中的 local 目录中的 bin 目录。
相对路径,也就是相对于你当前的目录的路径,相对路径是以当前目录 .
为起点,以你所要到的目录为终点,表现形式如: usr/local/bin
(这里假设你当前目录为根目录)。你可能注意到,我们表示相对路径实际并没有加上表示当前目录的那个 .
,而是直接以目录名开头,因为这个 usr
目录为 /
目录下的子目录,是可以省略这个 .
的(以后会讲到一个类似不能省略的情况);如果是当前目录的上一级目录,则需要使用 ..
,比如你当前目录为“home”目录,根目录就应该表示为 ../../
,表示上一级目录("home"目录)的上一级目录("/"目录)。
下面我们以你的"home"目录为起点,分别以绝对路径和相对路径的方式进入/usr/local/bin
目录:
# 绝对路径
$
cd/usr/
local/bin
# 相对路径
$
cd../../usr/
local/bin
进入一个目录,可以使用绝对路径也可以使用相对路径,那我们应该在什么时候选择正确的方式进入某个目录呢。就是凭直觉嘛,你觉得怎样方便就使用哪一个,而不用特意只使用某一种。比如假设我当前在 /usr/local/bin
目录,我想进入上一级的 local 目录你说是使用 cd ..
方便还是 cd /usr/local
方便。而如果要进入的是 usr
目录,那么 cd /usr
,就比cd ../..
方便一点了。
提示:在进行目录切换的过程中请多使用 Tab
键自动补全,可避免输入错误,连续按两次Tab
可以显示全部候选结果
使用 touch
命令创建空白文件,关于 touch
命令,其主要是来更改已有文件的时间戳的(比如,最近访问时间,最近修改时间),但其在不加任何参数的情况下,只指定一个文件名,则可以创建一个为指定文件名的空白文件(不会覆盖已有同名文件),当然你也可以同时指定该文件的时间戳,更多关于 touch
命令的用法,会在下一讲文件搜索中涉及。
创建名为 test 的空白文件,因为在其他目录没有权限,所以需要先 cd ~
切换回用户的 /home/shiyanlou
目录:
$
cd~
$ touch
test
使用 mkdir
(make directories)命令可以创建一个空目录,也可同时指定创建目录的权限属性
创建名为"mydir"的空目录:
$
mkdirmydir
使用 -p
参数,同时创建父目录(如果不存在该父目录),如下我们同时创建一个多级目录(这在有时候安装软件,配置安装路径时非常有用):
$
mkdir-p father/son/grandson
后面的目录路径,以绝对路径的方式表示也是可以的。
使用cp
(copy)命令复制一个文件或目录到指定目录。将之前创建的"test"文件复制到"/home/shiyanlou/father/son/grandson"目录中:
$ cp
testfather/son/grandson
是不是很方便啊,如果在图形界面则需要先在源目录复制文件,再进到目的目录粘贴文件,命令行操作步骤就一步到位了嘛。
如果直接使用cp
命令,复制一个目录的话,会出现如下错误:
要成功复制目录需要加上-r
或者-R
参数,表示递归复制,就是说有点“株连九族”的意思:
$ cp -r father family
使用rm
(remove files or directories)命令,删除一个文件或目录:
$ rm
test
有时候你会遇到想要删除一些为只读权限的文件,直接使用rm
删除会显示一个提示
你如果想忽略这提示,直接删除文件,可以使用-f
参数强制删除:
$ rm
-ftest
跟复制目录一样,要删除一个目录,也需要加上-r
或-R
参数:
$ rm -r family
使用mv
(move or rename files)命令,移动文件(剪切)。将文件"file1"移动到"Documents"目录mv
源目录文件
目的目录
:
$mv file1
Documents
将文件"file1"重命名为"myfile" mv
旧的文件名
新的文件名
:
$ mv file1 myfile
要实现批量重命名,mv 命令就有点力不从心了,我们可以使用一个看起来更专业的命令rename
来实现。不过它是要用 perl 正则表达式来作为参数,关于正则表达式我们要在后面才会介绍到,这里只做演示,你只要记得这个rename
命令可以批量重命名就好了,以后再重新学习也不会有任何问题,毕竟你已经掌握了一个更常用的mv
命令。
# 使用通配符批量创建 5 个文件
$touch file{
1..
5}.txt
# 批量将这 5 个后缀为 .txt 的文本文件重命名为以 .c 为后缀的文件
$rename
's/\.txt/\.c/'*.txt
# 批量将这 5 个文件,文件名改为大写
$rename
'y/a-z/A-Z/'*.c
简单解释下上面的命令,rename
是先使用第二个参数的通配符匹配所有后缀为.txt
的文件,然后使用第一个参数提供的正则表达式将匹配的这些文件的.txt
后缀替换为.c
,这一点在我们后面学习了sed
命令后,相信你会更好的理解。
cat
,tac
和nl
命令查看文件这两个命令都是用来打印文件内容到标准输出(终端),其中cat
为正序显示,tac
倒序显示。
标准输入输出:当我们执行一个 shell 命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),默认对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应被重定向到终端的屏幕,以便我们能直接看到输出内容。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。
比如我们要查看之前从"/etc"目录下拷贝来的passwd
文件:
$ cat passwd
可以加上-n
参数显示行号:
$cat -n passwd
nl
命令,添加行号并打印,这是个比cat -n
更专业的行号打印命令。
这里简单列举它的常用的几个参数:
-b : 指定添加行号的方式,主要有两种:
-b a:
表示无论是否为空行,同样列出行号
("cat -n"
就是这种方式
)
-b t:
只列出非空行的编号并列出(默认为这种方式)
-n : 设置行号的样式,主要有三种:
-n ln:
在行号字段最左端显示
-n rn:
在行号字段最右边显示,且不加
0
-n rz:
在行号字段最右边显示,且加
0
-w : 行号字段占用的位数(默认为 6 位)
more
和less
命令分页查看文件如果说上面的 cat 是用来快速查看一个文件内容的,那么这个more
和less
就是天生用来"阅读"一个文件的内容的,比如说"man"手册内部就是使用的 less 来显示内容。其中more
命令比较简单,只能向一个方向滚动,而"less"为基于"more"和"vi"(一个强大的编辑器,我们有单独的课程来让你学习)开发,功能更强大。less 的使用基本和 more 一致,具体使用请查看 man 手册,这里只介绍 more 命令的使用。
使用more
工具打开passwd
文件:
$more passwd
打开后默认只显示一屏内容,终端底部显示当前阅读的进度(百分比)。可以使用Enter
键向下滚动一行,使用Space
键向下滚动一屏,按下h
显示帮助,q
退出。
head
和tail
命令查看文件这两个命令那些性子比较急的人应该会比较喜欢,因为它们一个是只查看的头几行(默认为10行,不足10行则显示全部)和尾几行。还是拿 passwd 文件举例,比如当我们想要查看最近新增加的用户,那么我们可以查看这个/etc/passwd
文件,不过我们前面也看到了,这个文件里面一大堆乱糟糟的东西,看起来实在费神啊。这里想到系统新增加一个用户,应该会将用户的信息添加到passwd文件的最后,那么这时候我们就可以使用tail
命令了:
$ tail /etc/passwd
甚至更直接的只看一行, 加上-n
参数,后面紧跟行数:
$tail -n
1/etc/passwd
关于tail
命令,不得不提的还有它一个很牛的参数-f
,这个参数可以实现不停地读取某个文件的内容并显示。这可让我们动态查看日志起到实时监视的作用,不过我不会在这门基础课程中介绍它的更多细节,感兴趣的用户可以自己去了解。
前面我提到过,在 Linux 下面文件的类型不是根据文件后缀来判断的,我们通常使用file
命令可以查看文件的类型:
$file /bin/ls
这表示这是一个可执行文件,运行在 64 位平台,并使用了动态链接文件(共享库)。
在 Linux 下面编辑文件通常我们会直接使用专门的命令行编辑器比如(emacs,vim,nano),由于涉及 Linux 上的编辑器的内容比较多,且非常重要,故我们有一门单独的基础课专门介绍这其中一个编辑器(vim)。
实验四操作及截图
安装tree
Tree实际图
上一级目录:
进入你的“home”目录:
使用 pwd 获取当前路径:
建立新文件夹
建立文件夹与删除
强制删除
删除目录
查看文件
使用more工具打开passwd文件:
使用head和tail查看文件
Vimtutor
作业:
召唤一双眼睛
实验五 环境变量与文件查找
本节实验介绍环境变量的作用与用法,及几种搜索文件的方法。学会这些技巧高效地使用 Linux。
要解释环境变量,得先明白变量是什么,准确的说应该是 Shell 变量,所谓变量就是计算机中用于记录一个值(不一定是数值,也可以是字符或字符串)的符号,而这些符号将用于不同的运算处理中。通常变量与值是一对一的关系,可以通过表达式读取它的值赋值给其它变量,也可以直接指定数值赋值给任意变量。为了便于运算和处理,大部分的编程语言会区分变量的类型,用于分别记录数值、字符或者字符串等等数据类型。Shell 中的变量也基本如此,有不同类型(但不用专门指定类型名),可以参与运算,有作用域限定。
变量的作用域即变量的有效范围(比如一个函数中、一个源文件中或者全局范围),在该范围内只能有一个同名变量。一旦离开则该变量无效,如同不存在这个变量一般。
在 Shell 中如何创建一个变量,如何给变量赋值和如何读取变量的值呢?这部分内容会在bash 脚本编程这门课中详细介绍,这里我简单举例说明一下:
使用declare
命令创建一个变量名为 tmp 的变量:
$
declaretmp
其实也可以不用 declare 预声明一个变量,直接即用即创建,这里只是告诉你 declare 的作用,这在创建其它指定类型的变量(如数组)时会用到。
使用=
号赋值运算符为变量 tmp 赋值为 shiyanlou:
$ tmp=shiyanlou
读取变量的值,使用echo
命令和$
符号($符号用于表示引用一个变量的值,初学者经常会忘记输入):
$
echo$tmp
注意:关于变量名,并不是任何形式的变量名都是可用的,变量名只能是英文字母,数字或者下划线,且不能以数字作为开头。
简单理解了变量的概念,就很好解释环境变量了,环境变量就是作用域比自定义变量要大,如Shell 的环境变量作用于自身和它的子进程。在所有的 UNIX 和类 UNIX 系统中,每个进程都有其各自的环境变量设置,且默认情况下,当一个进程被创建时,处理创建过程中明确指定的话,它将继承其父进程的绝大部分环境设置。Shell 程序也作为一个进程运行在操作系统之上,而我们在 Shell中运行的大部分命令都将以 Shell 的子进程的方式运行。
通常我们会涉及到的环境变量有三种:
也有三个与上述三种环境变量相关的命令,set
,env
,export
。这三个命令很相似,都可以用于打印相关环境变量,区别在于涉及的是不同范围的环境变量,详见下表:
命令 |
说明 |
|
显示当前 Shell 所有环境变量,包括其内建环境变量(与 Shell 外观等相关),用户自定义变量及导出的环境变量 |
|
显示与当前用户相关的环境变量,还可以让命令在指定环境中运行 |
|
显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量 |
你可以更直观的使用vimdiff
工具比较一下它们之间的差别:
$ temp=shiyanlou
$
exporttemp_env=shiyanlou
$ env|sort>env.txt
$
export|sort>
export.txt
$
set|sort>
set.txt
上述操作将命令输出通过管道|
使用sort
命令排序,再重定向到对象文本文件中。
$ vimdiff env.txt
export.txt
set.txt
使用vimdiff
工具比较导出的几个文件的内容。
关于环境变量,可以简单的理解成在当前进程的子进程是否有效,有效则为环境变量,否则不是(有些人也将所有变量统称为环境变量,只是以全局环境变量和局部环境变量进行区分,我们只要理解它们的实质区别即可)。我们这里用export
命令来体会一下,先在 Shell 中设置一个变量temp=shiyanlou
,然后再新创建一个子 Shell 查看temp
变量的值:
注意:为了与普通变量区分,通常我们习惯将环境变量名设为大写
你可能很早之前就有疑问,我们在 Shell 中输入一个命令,Shell 是怎么知道在哪去找到这个命令然后执行的呢?这是通过环境变量PATH
来进行搜索的,熟悉 Windows 的用户可能知道 Windows 中的也是有这么一个 PATH 环境变量。这个PATH
里面就保存了Shell中执行的命令的搜索路径。
查看PATH
环境变量的内容:
$
echo$PATH
默认情况下你会看到如下输出:
/usr/local/sbin:
/usr/local/bin:
/usr/sbin:
/usr/bin:
/sbin:/bin:
/usr/games:
/usr/local/games
如果你还记得我们在 Linux 目录结构那一节的内容,你就应该知道上面这些目录下放的是哪一类文件了。通常这一类目录下放的都是可执行文件,当我们在 Shell 中执行一个命令时,系统就会按照 PATH 中设定的路径按照顺序依次到目录中去查找,如果存在同名的命令,则执行先找到的那个。
$ vim hello_shell.sh
在脚本中添加如下内容,保存并退出(注意不要省掉第一行,这不是注释,论坛有用户反应会有语法错误,就是因为没有了第一行):
#!/bin/zsh
for((i=
0; i<
10; i++));
do
echo
"hello shell"
done
exit0
为文件添加可执行权限:
$
chmod755
hello_shell.sh
执行脚本
$ ./hello_shell.sh
创建一个 C 语言"hello world"程序:
$ vim hello_world.c
#include <stdio.h>
int main(void)
{
printf
(
"hello world!\n");
return
0
;
}
使用 gcc 生成可执行文件:
$ gcc -o hello_world hello_world.c
gcc 生成二进制文件默认具有可执行权限,不需要修改
在 shiyanlou 家目录创建一个mybin
目录,并将上述 hello_shell.sh 和 hello_world 文件移动到其中:
$ mkdir mybin
$ mv hello_shell.sh hello_world mybin/
现在你可以在mybin
目录中分别运行你刚刚创建的两个程序:
$ cd mybin
$ ./hello_shell.sh
$./hello_world
回到上一级目录,也就是shiyanlou
家目录,当再想运行那两个程序时,会发现提示命令找不到,除非加上命令的完整路径,但那样很不方便,如何做到想使用系统命令一样执行自己创建的脚本文件或者程序呢?那就要将命令所在路径添加到PATH
环境变量了。
在前面我们应该注意到PATH
里面的路径是以:
作为分割符,所以我们可以这样添加自定义路径:
$ PATH=
$PATH:/home/shiyanlou/mybin
注意这里一定要使用绝对路径
现在你就可以在其他任意目录执行那两个命令了。你可能会意识到这样还并没有很好的解决问题,因为我给 PATH 环境变量追加了一个路径,它也只是在当前 Shell 有效,我一旦退出终端,再打开就会发现又失效了。有没有方法让添加的环境变量全局有效?或者每次启动 Shell 时自动执行上面添加自定义路径到 PATH 的命令?下面我们就来说说后一种方式——让它自动执行。
在每个用户的 home 目录中有一个 Shell 每次启动时会默认执行一个配置脚本,以初始化环境,包括添加一些用户自定义环境变量等等。zsh 的配置文件是.zshrc
,相应 Bash 的配置文件为.bashrc
。它们在etc
下还都有一个或多个全局的配置文件,不过我们一般只修改用户目录下的配置文件。
我们可以简单的使用下面命令直接添加内容到.zshrc
中:
$echo
"PATH=$PATH:/home/shiyanlou/mybin">>
.zshrc
上述命令中>>
表示将标准输出以追加的方式重定向到一个文件中,注意前面用到的>
是以覆盖的方式重定向到一个文件中,使用的时候一定要注意分辨。在指定文件不存在的情况下都会创建新的文件。
变量的修改有以下几种方式:
变量设置方式 |
说明 |
|
从头向后开始匹配,删除符合匹配字串的最短数据 |
|
从头向后开始匹配,删除符合匹配字串的最长数据 |
|
从尾向前开始匹配,删除符合匹配字串的最短数据 |
|
从尾向前开始匹配,删除符合匹配字串的最长数据 |
|
将符合旧字串的第一个字串替换为新的字串 |
|
将符合旧字串的全部字串替换为新的字串 |
比如要修改我们前面添加到 PATH 的环境变量。为了避免操作失误导致命令找不到,我们先将 PATH 赋值给一个新的自定义变量 path:
$ path=
$PATH
$
echo$path
$ path=
${path%/home/shiyanlou/mybin}
# 或使用通配符,*表示任意多个任意字符
$ path=
${path%*/mybin}
可以使用unset
命令删除一个环境变量:
$
unsettemp
在上面我们在 Shell 中修改了一个配置脚本文件之后(比如 zsh 的配置文件 home 目录下的.zshrc
),每次都要退出终端重新打开甚至重启主机之后其才能生效,很是麻烦,我们可以使用source
命令来让其立即生效,如:
$
source.zshrc
source
命令还有一个别名就是.
,注意与表示当前路径的那个点区分开,虽然形式一样,但作用和使用方式一样,上面的命令如果替换成.
的方式就该是
$ . ./.zshrc
注意第一个点后面有一个空格,而且后面的文件必须指定完整的绝对或相对路径名,source 则不需要。
与搜索相关的命令常用的有如下几个whereis
,which
,find
,locate
。
whereis
简单快速$whereis who
你会看到它找到了三个路径,两个可执行文件路径和一个 man 在线帮助文件所在路径,这个搜索很快,因为它并没有从硬盘中依次查找,而是直接从数据库中查询。whereis
只能搜索二进制文件(-b),man帮助文件(-m)和源代码文件(-s)。如果想要获得更全面的搜索结果可以使用locate
命令。
locate
快而全通过"/var/lib/mlocate/mlocate.db"数据库查找,不过这个数据库也不是实时更新的,系统会使用定时任务每天自动执行updatedb
命令更新一次,所以有时候你刚添加的文件,它可能会找不到,需要手动执行一次updatedb
命令(在我们的环境中必须先执行一次该命令)。它可以用来查找指定目录下的不同文件类型,如查找 /etc 下所有以 sh 开头的文件:
$ locate /etc/sh
注意,它不只是在 etc 目录下查找并会自动递归子目录进行查找
查找 /usr/share/ 下所有 jpg 文件:
$ locate
/usr/share/\*.jpg
注意要添加*
号前面的反斜杠转义,否则会无法找到
如果想只统计数目可以加上-c
参数,-i
参数可以忽略大小写进行查找,whereis 的-b
,-m
,-s
同样可以是使用。
which
小而精which
本身是 Shell 内建的一个命令,我们通常使用which
来确定是否安装了某个指定的软件,因为它只从PATH
环境变量指定的路径中去搜索命令:
$
whichman
find
精而细find
应该是这几个命令中最强大的了,它不但可以通过文件类型、文件名进行查找而且可以根据文件的属性(如文件的时间戳,文件的权限等)进行搜索。find
命令强大到,要把它将明白至少需要单独好几节课程才行,我们这里只介绍一些常用的内容。
在指定目录下搜索指定文件名的文件:
$ find
/etc/-name interfaces
注意 find 命令的路径是作为第一个参数的,基本命令格式为 find [path] [option] [action]
与时间相关的命令参数:
参数 |
说明 |
|
最后访问时间 |
|
创建时间 |
|
最后修改时间 |
下面以-mtime
参数举例:
-mtime n
: n 为数字,表示为在n天之前的”一天之内“修改过的文件-mtime +n
: 列出在n天之前(不包含n天本身)被修改过的文件-mtime -n
: 列出在n天之前(包含n天本身)被修改过的文件newer file
: file为一个已存在的文件,列出比file还要新的文件名
列出 home 目录中,当天(24 小时之内)有改动的文件:
$find ~ -mtime
0
列出用户家目录下比Code文件夹新的文件: