1 简介
Linux哲学思想:
在Linux中,把几乎所有资源都被视为文件,包括硬件设备,如网络接口、磁盘等,都组织为文件格式,都可以通过访问文件的方式来实现对硬件资源的访问。
linux中提供的程序和可执行文件一般都是功能单一,短小精悍,保证了linux的高速运行。
因为每个linux命令都功能简单,如果要实现复杂任务时,可以通过连接多个简单程序实现复杂的功能,这样可以保证在单个程序的高效性,也可以保证复杂程序也是高效的
目标:实现脚本编程,以自动完成默写功能;
目标:一款使用的文本编辑器即能完成系统配置工作
这是linux思想中的一条,所谓机制,就是“提供什么功能”,策略就是“实现什么功能”,这种独特的设计思想为设计者提供了更大的空间使其更好的实现它。所以,自由一直都是linux的核心思想
2 简单介绍Linux的文件系统
在Linux中绝对起始位置为根(/),称之为根文件系统;Linux的路径是一个倒置的树状结构,使用层次化结构表示文件路径;在指明路径的时候一定有一个起始的位置,如果指定一个起始位置后,再也没有其他可存在的位置了,那么这个起始位置就是绝对起始位置。
目录是什么?
目录只是个路径映射方式而已,一个目录:就是一个名称空间,目录是个特殊的文件。
文件是什么?
文件必定有名字,文件内容是占据了磁盘空间。
Linux中一个文件有两类数据
元数据:metadata,元数据是文件的属性信息,不是文件数组成部分,元数据指向文件的数据;
数据:data
Linux文件名严格区分字符大小写
文件名可以使用除/以外的任意字符,但不建议使用特殊字符,文件名称长度最长不能超过255个字符,所有.开头的文件,都为隐藏文件。
说明:/为根目录,也为路径分隔符
路径:
在 Linux 中,简单的理解一个文件的路径,指的就是该文件存放的位置。
例如, /home/file 就表示的是 file 文件所存放的位置。只要我们告诉 Linux 系统某个文件存放的准确位置,那么它就可以找到这个文件。
我们知道,Linux 系统中所有的文件(目录)都被组织成以根目录“/”开始的倒置的树状结构,如图所示。
绝对路径:
绝对路径一定是由根目录 / 开始写起。例如,使用绝对路径的表示方式指明 bin 文件所在的位置,该路径应写为 /usr/bin
相对路径
和绝对路径不同,相对路径不是从根目录 / 开始写起,而是从当前所在的工作目录开始写起。使用相对路径表明某文件的存储位置时,经常会用到两个特殊目录,即当前目录(用 . 表示)和父目录(用 .. 表示)。
示例:
当我们使用 root 身份登录 Linux 系统时,当前工作目录默认为 /root,如果此时需要将当前工作目录调整到 root 其他子目录中,当然可以使用绝对路径。比如root目录下有一个data子目录,使用绝对路径进入子目录方法如下:
root@ubuntn:~# pwd <-- 显示当前所在的工作路径 /root root@ubuntn:~# cd /root/data/ root@ubuntn:~/data# pwd /root/data root@ubuntn:~/data# |
注意:这里所使用的 pwd 和 cd 命令,目前只需知道它们的功能即可,具体用法会在后续文章中作详细讲解。
可以看到,通过使用绝对路径,我们成功地改变了当前工作路径。但除此之外,使用相对路径的方式会更简单。因为目前处于 /root 的位置,而 data 就位于当前目录下,所以:
root@ubuntn:~# pwd <-- 显示当前所在的工作路径 /root root@ubuntn:~# cd ./data/ root@ubuntn:~/data# pwd /root/data root@ubuntn:~/data# |
此示例中./data 表示的就是data文件相对于 /root 所在的路径。这里在root目录下进入其目录下的其他子目录时./是可以省略的。
总之,绝对路径是相对于根路径 / 来讲的,只要文件不移动位置,那么它的绝对路径是恒定不变的;而相对路径是相对于当前所在目录而言的,随着程序的执行,当前所在目录可能会改变,因此文件的相对路径不是固定不变的。
3 Linux命令
学习Linux首先需要知道命令的基本格式和使用方法,以及相应的查询命令的帮助,因为Linux主要是以命令的方式来实现各种操作的,并且命令条目很多,学会如何得到命令的帮助也非常重要。
Linux命令主要分为两种
内部命令:由shell程序自带的命令
外部命令:有独立的可执行程序文件,位于文件系统某目下,文件名即命令名。
3.1、查看bash内部命令的帮助
help command
例如:
root@ubuntn:~# help history history: history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg [arg...] Display or manipulate the history list.
Display the history list with line numbers, prefixing each modified entry with a `*'. An argument of N lists only the last N entries.
Options: -c clear the history list by deleting all of the entries -d offset delete the history entry at position OFFSET. Negative offsets count back from the end of the history list
-a append history lines from this session to the history file -n read all history lines not already read from the history file and append them to the history list -r read the history file and append the contents to the history list -w write the current history to the history file
-p perform history expansion on each ARG and display the result without storing it in the history list -s append the ARGs to the history list as a single entry
If FILENAME is given, it is used as the history file. Otherwise, if HISTFILE has a value, that is used, else ~/.bash_history.
If the HISTTIMEFORMAT variable is set and not null, its value is used as a format string for strftime(3) to print the time stamp associated with each displayed history entry. No time stamps are printed otherwise.
Exit Status: Returns success unless an invalid option is given or an error occurs. root@ubuntn:~# |
3.2 外部命令
都有一个可执行程序,位于文件系统某目录下:
(1)、COMMAND --help
例如:
(2)、使用手册(manual)
格式为:man # command (命令)
手册:有章节之分,man1---man9,man9一般没有什么用
手册页路径:/usr/share/man/
man1:用户命令,查看命令的帮助
man2:系统调用,查看可被内核调用的函数的帮助
man3:程序库调用,查看函数和函数库的帮助
man4:设备及特殊文件,查看特殊文件的帮助(主要是/dev目录下的文件)
man5:配置文件格式,查看配置文件的帮助
man6:游戏
man7:杂项,惯例与协议等,例如Linux文件系统、网络协议、ASCII code等等的说明
man8:管理类的命令,查看系统管理员可用的命令的帮助
man9:内核内部指令,查看内核相关文件的帮助
注意:有些关键在不止一个章节中存在帮助手册;
要看指定章节手册:man # COMMAND
man命令的配置文件:/etc/man.config
MANPATH /PATH/TO/SOMEWHERE 指明新的手册文件搜索位置
# man -M /PATH/TO/SOMEWHERE COMMAND :到指定位置下搜索COMMAND命令的手册页并显示
如何查看指定命令在哪些章节下有帮助:
whatis COMMAND
注意:
如果使用whatis无法找到,这是因为whatis是根据数据库执行查找操作的,此库为系统定期更新;可使用makewhatis手动更新,
如果提示无法找到makewhatis这条命令,那么这是因为安装的版本不同或者没有安装,这时输入mandb更新。
帮助中命令语法的一些符号说明
[] :表示的是可选
…: 表示的可以存在多个参数
|:表示是可选的
<>:必填
{}:表示作为一个整体存在的
使用man查看命令手册示例:
root@ubuntn:~# man ip
3.3 man的使用机制:
翻屏:
空格键、Ctrl+f、Ctrl+V:向文件尾部翻一屏
b、Ctrl+B: 向文件首部翻一屏
回车键:向文件尾部翻一行
k: 向文件首部翻一行
Ctrl+d: 向文件尾部翻半屏
Ctrl+u: 向文件首部翻并屏
q:退出
#:跳转至第#行
1G:回到文件首部
G:翻至文件尾部
字串搜索:
/keyword: 从文件首部向尾部进行搜索
n: 显示找到的下一个
N:显示找到的上一个
?keyword: 从文件尾部向首部进行搜索
n: 显示找到的下一个
N:显示找到的上一个
3.4 使用man查看及介绍bash命令
root@ubuntn:~# help hash hash: hash [-lr] [-p pathname] [-dt] [name ...] <-----使用格式 Remember or display program locations. 记住或显示程序位置
Determine and remember the full pathname of each command NAME. If no arguments are given, information about remembered commands is displayed.
Options: <----选项 -d forget the remembered location of each NAME 删除一个指定命令的缓存记录 -l display in a format that may be reused as input -p pathname use PATHNAME is the full pathname of NAME -r forget all remembered locations 删除所有命令的缓存记录 -t print the remembered location of each NAME, preceding each location with the corresponding NAME if multiple NAMEs are given Arguments: NAME Each NAME is searched for in $PATH and added to the list of remembered commands.
Exit Status: Returns success unless NAME is not found or an invalid option is given. root@ubuntn:~# |
3.5 hash命令
查看内存中执行的外部命令,
选项使用示例,使用-r清空所有命令的缓存记录
4 history命令详解
history命令用于显示历史记录和执行过的命令,history命令是被保存在内存中的,登录shell时,会读取命令历史文件中记录下的命令,登录进shell后新执行的命令只会记录在缓存中,这些命令会在用户退出时会追加至命令历史文件中,即记录在用户主目录下的".bash_history"中。
在内存中,历史命令仅能够存储1000条历史命令,该数量是由环境变量 HISTSIZE进行控制。
4.1 history的环境变量:
HISTSIZE:命令历史记录的条数
HISTFILE:~/.bash_history
HISTFILESIZE:命令历史文件中记录历史的条数,默认1000个
输出命令历史缓存小:
4.2 history命令用法及常用选项介绍
root@ubuntn:~# help history |
命令用法:
history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg [arg...] |
参数说明:
N:显示最近的N条记录,包括当前命令自身,例如 history 5
-c:清空历史命令缓冲区,但不会清空历史文件,即.bash_history文件中的历史命令不会被清空
-d offset:删除指定的偏移处的命令条目
-a [/path/to/some_history_file]:将当前会话中的命令历史写入指定文件
-r:将历史命令文件中的命令读入当前历史命令缓冲区
-w:将当前历史命令缓冲区命令写入历史命令文件中
4.2.1 常用选项使用示例
(1)、-d选项:删除指定的偏移处的命令条目
使用history查看有7条命令,想删除第3条命令,就可以使用history -d 后面的第几个命令,如history -d 3就是删除第三条命令,如下:
root@ubuntn:~# history 1 reboot 2 adduser test 3 cat /etc/passwd 4 cat /etc/group 5 cd /home/ 6 ll 7 id test root@ubuntn:~# history -d 3 root@ubuntn:~# history 1 reboot 2 adduser test 3 cat /etc/group 4 cd /home/ 5 ll 6 id test 7 history 8 history -d 3 9 history root@ubuntn:~# |
(2)-c:清空当前历史命令;对命令史文件没有影响
(3)、-r:将历史命令文件中的命令读入到当前历史命令缓冲区
将/root/.bash_history中的文件里的命令加到史命令缓冲区,执行history -r后,.bash_history中的文件的命令会加载到命令缓冲区,下面执行后的9至11就是我们前面4条已经提到文件的命令。
4.3 bash调用命令历史列表中的命令:
!#: 执行命令历史中的第#条命令
!!:执行上一条命令
!string: 执行命令历史中最近一次以string开头的命令(从历史命令中最后向前匹配);
!$ :调用上一条命令的最后一个参数
ESC, . :功能同上(先按esc放开后,再按点号)
Alt+. :功能同上(同时按,不是所有终端都支持)
4.4 修改history命令环境变量
history命令历史记录的条数默为1000,如果需要修改历史记录条数,则在/etc/profile文件中修改环境变量,重新加载即可。
在/etc/profile文件最后新增export HISTSIZE=2000变量即可,配置方法如下:
root@ubuntn:~# echo "export HISTSIZE=2000" >> /etc/profile root@ubuntn:~# source /etc/profile ------->使配置生效 root@ubuntn:~# echo $HISTSIZE 2000 root@ubuntn:~# |
4.5 配置history命令记录时间戳
默认查看历史命令是不显示时间的,如果需要显示时间,需要在/etc/profile文件中增加环境变量,在配置文件最后新增如下变量参数,新增后重新加载配置文件使配置生效:
HISTTIMEFORMAT="%F %T " #这里需要注意%T后面有个空格 |
配置方法如下:
root@ubuntn:~# echo 'HISTTIMEFORMAT="%F %T "' >> /etc/profile |
root@ubuntn:~# source /etc/profile ------->加载配置文件使配置生效 |
配置后再次查看历史命令,就会有时间戳显示,如下:
4.6 修改历史命令存放的位置和操作用户
history命令显示的信息时默认保存最近的1000条命令,从历史信息中只能看到执行了某个命令,对于进一步的追踪命令执行的用户则无法查询,无法定位到是哪个用户在哪个时间在哪执行的命令,做以下配置,将以下脚本加入/etc/profile文件中。
###LOG HISTORY COMMAND / LOGNAME / Client IP### USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'` HISTDIR=/LoginAudit/history if [ -z $USER_IP ] then USER_IP=`hostname` fi if [ ! -d $HISTDIR ] then mkdir -p $HISTDIR chmod 777 $HISTDIR fi if [ ! -d $HISTDIR/${LOGNAME} ] then mkdir -p $HISTDIR/${LOGNAME} chmod 300 $HISTDIR/${LOGNAME} fi export HISTSIZE=4000 DT=`date +%Y%m%d_%H%:M:%S` export HISTFILE="$HISTDIR/${LOGNAME}/${USER_IP}-history-$DT" export HISTTIMEFORMAT="[%Y.%m.%d %H:%M:%S] [`who am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`] [$(whoami)]" chmod 600 $HISTDIR/${LOGNAME}/*.history* 2>/dev/null |
将这段脚本加入到/etc/profile的末尾,脚本的作用是把每个用户执行的命令记录在/LoginAudit/history/目录下,并在目录下以用户名生成目录,在用户名目录下历史记录文件名根据用户ip和时间命名保存记录历史命令。
配置后使配置生效:
root@ubuntn:~# source /etc/profile |
使用history命令查看,如下:
进入保存历史命令的目录下,会有以用户名生成的目录保存历史命令。