管道符与通配符
管道符与通配符
管道命令符
管道符,其执行格式为“命令 A | 命令 B”。命令符的作用:“把前一个命令原本要输出到屏幕的数据当作是后一个命令的标准输入”。
例如:
[root@bogon test]# grep "/sbin/nologin" /etc/passwd | wc
37 78 2007
[root@bogon test]#
大家千万不要误以为管道命令符只能在一个命令组合中使用一次,我们完全可以这样使用:“命令 A | 命令 B | 命令 C | ...”。
命令行的通配符
如果就记得一个文件的开头几个字母,想遍历查找出所有以这个关键词开头的文件,该怎么操作呢?
通配符就是通用的匹配信息的符号,常用通配符如下:
符号 | 作用 |
---|---|
* | 表示匹配零个或多个字符 |
? | 表示匹配单个字符 |
[0-9] | 表示匹配0~9之间的单个数字字符 |
[abc] | 表示匹配a、b、c三个字符中的任意一个字符 |
[root@bogon test]# find /etc/ -name "t*"
/etc/terminfo
/etc/alternatives/tnameserv
/etc/alternatives/tnameserv.1.gz
/etc/selinux/tmp
/etc/selinux/targeted
/etc/selinux/targeted/active/modules/100/targetd
/etc/selinux/targeted/active/modules/100/tcpd
/etc/selinux/targeted/active/modules/100/tcsd
/etc/selinux/targeted/active/modules/100/telepathy
/etc/selinux/targeted/active/modules/100/telnet
/etc/selinux/targeted/active/modules/100/tftp
[root@bogon test]# find /etc/mcelog/ -name "trigger?"
/etc/mcelog/triggers
[root@bogon test]# ll /dev/sda[0-9]
brw-rw----. 1 root disk 8, 1 12月 29 01:28 /dev/sda1
brw-rw----. 1 root disk 8, 2 12月 29 01:28 /dev/sda2
[root@bogon test]#
转义字符
Shell 解释器还提供了特别丰富的转义字符来处理输入的特殊数据。
常用的转义字符
字符 | 作用 |
---|---|
\(反斜杠) | 使反斜杠后面的变量变为一个单词的字符串 |
'(单引号) | 转义其中所有的变量为单词的字符串 |
"(双引号) | 保留其中的变量属性,不进行转义处理 |
`(反引号) | 将其中的命令执行后返回结果 |
[root@bogon test]# PRICE=10
[root@bogon test]# echo "The is $PRICE"
The is 10
[root@bogon test]# echo 'The is $PRICE'
The is $PRICE
[root@bogon test]# echo The is $PRICE
The is 10
[root@bogon test]# echo The is \$PRICE
The is $PRICE
[root@bogon test]# echo The is\ \$PRICE
The is $PRICE
[root@bogon test]# echo The is \\$PRICE
The is \10
[root@bogon test]#
[root@bogon test]# echo `uname -a`
Linux bogon 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@bogon test]#
环境变量
变量是计算机系统用于保存可变值的数据类型。
在 Linux 系统中,变量名称一般都是大写的,这是一种约定俗成的规范。我们可以直接通过变量名称来提取到对应的变量值。
Linux系统中的环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录、邮件存放位置等。
命令执行的流程
在 Linux 系统中一切都是文件,Linux 命令也不例外。那么,在用户执行了一条命令之后,Linux 系统中到底发生了什么事情呢?简单来说,命令在 Linux 中的执行分为 4 个步骤:
- 判断用户是否以绝对路径或相对路径的方式输入命令,如果是,则直接执行;
- Linux会检查用户输入的命令是否为“别名命令;
- Bash解释器会判断用户输入的是内部命令还是外部命令;
- 系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量成为PATH,作用是告诉 Bash 解释器待执行的命令可能存放的位置,然后 Bash 解释器就会乖乖地在这些位置中逐个查找。
其中:
- “别名命令”,即用一个自定义的命令名称来替换原本的命令名称。可以用 alias 命令来创建一个属于自己的命令别名,格式为“alias 别名=命令”。若要取消一个命令别名,则是用 unalias 命令,格式为“unalias 别名”。
- 内部命令是解释器内部的指令,会被直接执行;而用户在绝大部分时间输入的是外部命令,外部命令由Bash解释器处理。
- 可以使用“type 命令名称”来判断用户输入的命令是内部命令还是外部命令。
- PATH 是由多个路径值组成的变量,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到 Bash 解释器对Linux 命令的查找。
[root@bogon test]# pwd
/home/test/test
[root@bogon test]# alias a=pwd
[root@bogon test]# a
/home/test/test
[root@bogon test]# unalias a=pwd
bash: unalias: a=pwd: 未找到
[root@bogon test]# unalias a
[root@bogon test]# a
bash: a: 未找到命令...
[root@bogon test]#
[root@bogon test]# type ifconfig
ifconfig 已被哈希 (/usr/sbin/ifconfig)
[root@bogon test]# type a
bash: type: a: 未找到
[root@bogon test]# type pwd
pwd 是 shell 内嵌
[root@bogon test]#
[root@bogon test]# echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/test/.local/bin:/home/test/bin
[root@bogon test]#
注意:有一个比较经典的问题:“为什么不能将当前目录(.)添加到 PATH 中呢? ” 原因是,尽管可以将当前目录(.)添加到 PATH 变量中,从而在某些情况下可以让用户免去输入命令所在路径的麻烦。但是,如果黑客在比较常用的公共目录/tmp 中存放了一个与 ls 或 cd 命令同名的木马文件,而用户又恰巧在公共目录中执行了这些命令,那么就极有可能中招了。
可以使用 env 命令来查看到 Linux 系统中所有的环境变量,Linux系统中最重要的十个环境变量,如下:
变量名称 | 作用 |
---|---|
HOME | 用户的主目录(家目录) |
SHELL | 用户所使用的shell解释器名称 |
HISTSIZE | 输出的历史命令记录条数 |
HISTFILESIZE | 保存的历史命令记录条数 |
邮件保存路径 | |
LANG | 系统语言、语系名称 |
RANDOM | 生产一个随机数字 |
PS1 | Bash解释器的提示符 |
PATH | 定义解释器搜索用户执行命令的路径 |
EDITOR | 用户默认的文本编辑器 |
[root@bogon test]# echo $PS1
[\u@\h \W]\$
[root@bogon test]# echo $RANDOM
29050
[root@bogon test]# echo $RANDOM
13016
[root@bogon test]# echo $RANDOM
14264
[root@bogon test]# echo $MAIL
/var/spool/mail/test
[root@bogon test]# echo $LANG
zh_CN.UTF-8
[root@bogon test]#
Linux 作为一个多用户多任务的操作系统,能够为每个用户提供独立的、合适的工作运行环境,因此,一个相同的变量会因为用户身份的不同而具有不同的值。
变量
其实变量是由固定的变量名与用户或系统设置的变量值两部分组成的,我们完全可以自行创建变量,来满足工作需求。例如设置一个名称为 WORKDIR 的变量,方便用户更轻松地进入一个层次较深的目录:
[root@bogon test]# pwd
/home/test/test
[root@bogon test]# WORKDIR=/home/test/test/
[root@bogon test]# cd ../../
[root@bogon home]# pwd
/home
[root@bogon home]# cd $WORKDIR
[root@bogon test]# pwd
/home/test/test
[root@bogon test]#
注意:这样的变量不具有全局性,作用范围也有限,默认情况下不能被其他用户使用。如果工作需要,可以使用 export 命令将其提升为全局变量,这样其他用户也就可以使用它了。
[root@bogon test]# export WORKDIR
[root@bogon test]# su test
[test@bogon test]$ cd ../../
[test@bogon home]$ pwd
/home
[test@bogon home]$ cd $WORKDIR
[test@bogon test]$ pwd
/home/test/test
[test@bogon test]$
本文系作者 @小白学安全 原创发布在 xbxaq.com 站点,未经许可,禁止转载!
评论