shell
是一个命令解释器,提供用户和机器之间的交互,每个用户都有自己独特的shell,常用的shell有bash,zsh,ksh
history
默认可以显示所有当次登录所输入历史命令和原来已经记录过的历史命令
内容过多,截取前十行
-c表示清空内存中存放的历史命令
-d 选项:删除某一条命令
历史命令文件存放在家目录下的.bash_history
环境变量HISTSIZE存放历史命令的最大条数,默认为1000条。当正常退出终端的时候,内存中的历史命令才会写入到文件中,
使用命令echo $HISTSIZE进行查看
修改存放条数修改配置文件/etc/profile的HISTSIZE参数
保存退出后,使用source /etc/profile或. /etc/profile使配置文件生效。
设置环境变量:HISTTIMEFORMAT=“%Y/%m/%d %H:%M:%S” 可以显示历史命令的执行时间。
将~/.bash_history文件用chattr给加上a的特殊属性后,无论HISTSIZE变量设置的多少,都不会再删除以前的命令。
!!执行上一条命令,!n执行对应序号的命令,!ls执行最近一次以ls开头的命令
命令补齐及别名
使用TAB补全命令或文件名,但是不能补齐参数,安装bash-completion软件包后可以补齐参数
alias restartnet='systemctl restart network.service'
使用alias查看当前用户自定义的别名,查看家目录下的.bashrc文件可以查看用户的别名
使用unalias 别名,去掉别名
通配符
*代表任意字符,?代表一个字符,[1-9]代表范围,从1到9任意一个,{1,2,3}用法和[123]一样
输入输出重定向
>标准输出,并覆盖
>>标准输出,并追加
2>错误输出,并覆盖
2>>错误输出,并追加
&>正确与错误一起输出,并覆盖
&>>正确与错误一起输出,并追加
>1.txt 2>2.txt将两者分开
<标准输入,如wc -l < 1.txt左边必须是命令
管道符和作业控制
|将前一个命令的输出作为另一个命令的输入,常用环境变量有:PATH、HOME、PWD
xargs可以将标准的输入转换为命令行参数。
工作管理
暂停任务 Ctrl+Z可以暂停当前正在执行的任务,将任务放到后台
jobs命令可以查看处于后台的任务,-n 指定工作号
fg+工作号可以将后台指定的程序调回前台 ,bg命令可以将后台已经暂停的任务在后台运行起来,使用命令+&可以将命令放入后台执行
shell变量
env查看系统环境变量
set查看包活系统环境变量,还有用户自定义的变量
自定义变量:变量名只能使用字母、数字和下划线,并且变量名不能以数字开头。使用echo $变量调用变量值,使用unset 变量对一个变量进行取消
使用export定义的变量为全局变量,可以在当前终端的子Shell中生效,没有使用export定义的变量,只会在当前终端当前Shell生效,可以使用pstree命令查看当前所在的shell
shell特殊符号
*号可以代表任意数量的任意字符
?只能代表任意一个字符
井号表示这一行只是一个注释说明
\可以使一些原本具有特殊功能的符号失去特殊的功能.称为脱义字符
\n 可以让n视为一个换行符, \t,可以让t视为一个制表符
管道符: ” | ” ,它可以将管道符左边的命令的输入内容,传递给右边的命令
cut的主要功能为截取字符串,可以与管道符配合使用,截取命令输出的内容
-d 指定分隔符,“:”表示以:为分隔符
-f指定输出哪一段,f1表示输入第一段,f1,3表示输入1~3段
-c指定输出第几个字符,1-5指定范围
eg:cat /etc/passwd | cut -d ":" -f1,3
sort可以帮我们进行排序,默认按照ASCII码进行排序
-n指定用数字进行排序
-r反向排序
-u去掉相邻的重复行
-t :指定分隔符,默认是用 [tab] 键来分隔-k :以分隔符隔开的第几段进行排序,通常与-t同时使用
wc命令可以统计文件内容或者标准输出的内容中的行数、字符数等信息。
-l 查看行数
-m查看字符数
-w查看单词数
uniq命令可以帮助我们去除内容中相同的行,并且可以统计内容相同的行数
-i:去除相同内容的行,忽略字母的大小写
-c:统计内容相同的行的数量,需要先进行排序
tee可以进行双向重定向,可以将命令的输出内容同时输入到文件和终端显示,必须配合管道符进行使用
-a选项以追加的方式将内容输入文件,不使用-a选项时会覆盖文件原来的内容
tr命令可以用来删除或替换标准输入的内容,eg:tr 'a-z' 'A-Z' /etc/passwd
split命令可以将一个文件分割为多个小文件, 可以按大小分割,或者按行数分割,实际工作中可能会遇到较大的日志文件,可以通过split对日志文件进行分割,方便查看
-m 指定分割文件的大小
-l 指定分割文件的行数
扩展:
1:简单命令审计系统
有时候我们需要对线上用户操作记录进行历史记录待出现问题追究责任人
但Linux系统自带的history命令用户有自行删除权限
那怎么设置可以让用户的操作记录实时记录,并保证普通用户无权删除呢?
1:创建记录命令历史日志文件的目录
[root@long01 test]# mkdir -p /usr/local/command_history/ #创建相关目录
[root@long01 test]# chmod 777 /usr/local/command_history/ #更改目录的权限为所有人可读写执行
[root@long01 test]# chmod +t /usr/local/command_history/ #+t权限,可以使不是文件的拥有者的用户无法删除文件
[root@long01 test]# ls -dl /usr/local/command_history/
drwxrwxrwt 2 root root 6 Jun 3 02:41 /usr/local/command_history/
2:在/etc/profile文件最后添加下面的代码。
if [ ! -d /usr/local/command_history/${LOGNAME} ] #判断每个用户的记录目录是否不存在
then
mkdir -p /usr/local/command_history/${LOGNAME} #如果不存在则用用户名创建一个该用户的目录
chmod 300 /usr/local/command_history/${LOGNAME} #将目录权限改为300,用户只能写入和执行,不能读取。
fi
export HISTORY_FILE="/usr/local/command_history/${LOGNAME}/bash_history" #定义记录用户命令历史的文件路径变量。
#定义PROMPT_COMMAND环境变量,vi
export PROMPT_COMMAND='{ date "+%Y-%m-%d %T ##### $(who am i | awk "{print \$1\" \"\$2\" \"\$6}") ##### $(history 1 | { read x cmd; echo "$cmd"; })"; } >> $HISTORY_FILE'
3:PROMPT_COMMAND环境变量说明:
Bash在显示输出内容之后再执行 PROMPT_COMMAND 变量定义的内容
例如这样设置会在每次执行命令之后显示系统当前的时间。
[root@long01 etc]# export PROMPT_COMMAND='date "+%F %T"'
2018-06-03 03:05:56
[root@long01 etc]# cd ~
2018-06-03 03:06:00
[root@long01 ~]# echo 123
123
2018-06-03 03:06:30
前面在/etc/profile定义PROMPT_COMMAND变量:
export PROMPT_COMMAND='{ date "+%Y-%m-%d %T ##### $(who am i | awk "{print \$1\" \"\$2\" \"\$6}") ##### $(history 1 | { read x cmd; echo "$cmd"; })"; } >> $HISTORY_FILE'
其可以大致可分为四段:
date "+%F %T" #获取当前系统时间
$(who am i |awk "{print \$1\" \"\$2\" \"\$6}") #获取当前用户,终端和IP
$(history 1 | { read x cmd; echo "$cmd"; }) #获取最后一条历史命令,
>>$HISTORY_FILE #将前面获取到的内容追加到记录用户历史命令的文件中。