Linux入门及history命令介绍(五)

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命令查看,如下:

进入保存历史命令的目录下,会有以用户名生成的目录保存历史命令。

猜你喜欢

转载自blog.csdn.net/yjun89/article/details/131747999