前言

在玩dvwa的命令注入漏洞的时候,遇到了没有预料到的错误,执行

ping 127.0.0.1 & echo "<?php phpinfo(); ?>" > shell.php

发现返回的执行结果如下图



理论上在dvwa的根目录里应该有一个shell.php但是并没有出现

root@kali:/var/www/html/dvwa# ls
about.php docs hackable login.php README.md test.php
CHANGELOG.md dvwa ids_log.php logout.php robots.txt vulnerabilities
config external index.php phpinfo.php security.php
COPYING.txt favicon.ico instructions.php php.ini setup.php
root@kali:/var/www/html/dvwa#

原因

经几次尝试,发现问题出在&上。将其换成|就可以完成写入shell,但是对& && | ||的功能不是很了解,于是在Linux终端尝试了一下,基本上搞清楚了涵义和用法

看结论请直接拉到最后点这里

尝试过程

使用了一个Linux命令sleep,输入sleep --help显示帮助,系统给出的介绍如下:

root@kali:~# sleep --help
Usage: sleep NUMBER[SUFFIX]...
or: sleep OPTION
Pause for NUMBER seconds. SUFFIX may be 's' for seconds (the default),
'm' for minutes, 'h' for hours or 'd' for days. Unlike most implementations
that require NUMBER be an integer, here NUMBER may be an arbitrary floating
point number. Given two or more arguments, pause for the amount of time
specified by the sum of their values. --help 显示此帮助信息并退出
--version 显示版本信息并退出 root@kali:~#

其余的是简单的ifconfig、uname和echo命令

还有一条设定:cmd1 操作符 cmd2 操作符 cmd3 ......,把整个称作一个命令

&

执行ifconfig & echo hello,返回的执行结果如下:



这个结果有一些值得注意的点,一是奇怪的[1] 3187,二是先显示的hello(执行了echo),再另起一行显示了ifconfig的结果,按说应该是先执行ifconfig显示网络配置信息,接着才应该执行echo,三是最后的已完成,这与平常命令执行结束明显的不同

执行echo hello & ifconfig,返回的执行结果如下:



对比上个命令的执行结果,有很多不同。这个结果貌似是符合我们的预期的,先执行了echo再执行了ifconfig,但是还有莫名的方框数字和已完成

上网以关键词linux &查询到,在Linux下,命令之后加上&,表示把该命令以后台方式执行。其中,[1]表示后台任务的标识,之后的数字表明后台执行的任务的UID,那就意味着shell将这个后台命令以多进程的方式在运行。

于是猜想cmd1 & cmd2执行的方式是以后台方式执行cmd1,同时执行cmd2。验证如下:



echo命令执行较快,于是首先输出了hello,sleep强制停止了5秒,于是在后台显示在运行中,5秒之后完成。

&&

&没有逻辑功能,那么猜想&&真正完成了逻辑与的功能,从左到右依次执行各项命令

动态效果不好演示,可以通过输入sleep 5 && echo ends看一下动态的效果。执行的结果确实是暂停了5秒,之后显示了ends

但是还可以以其他方式表现,譬如如下的命令



很明显的证明cmd1和cmd2的执行顺序关系

此时应有补充资料:

shell 在执行某个命令的时候,会返回一个返回值,该返回值保存在 shell 变量 $? 中。当 $? == 0 时,表示执行成功;当 $? != 0 时,表示执行失败。

这篇博文详细的列出了Linux里的返回值,供参考

由编程的知识很容易理解,0&&!0 ==0,这样,任意一个cmd出现了错误,只要有可以正确执行返回0的cmd,整体命令返回值就是0,将不会影响到其他cmd的执行,只会单独关于某个错误的cmd报一个错误

|

鉴于&不表示逻辑与,那么|也不一定表达逻辑或的含义,实验一下命令

发现第一条命令输出了hello,同时命令并没有终止,光标等待了5秒之后,才另起一行。这表明两个子命令一起被执行,但是与&不同,cmd1被放在前台执行。可以推断shell将cmd1和cmd2分为两个线程执行。

发现第二条命令没有显示ifconfig应有的输出,但是如下图所示:



可以看到,cmd1实际上已经被执行了,只是返回的信息没有被显示在终端上

那么可以总结出,cmd1 | cmd2中,cmd1和cmd2同时在前台被执行,但是cmd1的执行结果不会被显示在终端上。

||

跟&&类似,cmd之间使用||接,从而实现逻辑或的功能

实验如下命令:

只有在||左边的命令返回假(命令返回值 $? != 0),||右边的命令才会被执行。这和 c 语言中的逻辑或语法功能相同,(0||!0 == 0),即实现短路逻辑或操作。同时,只要有一个命令返回真(命令返回值 $? == 0),后面的命令就不会被执行,直到返回真的地方停止执行。

总结

再看一下设定:cmd1 操作符 cmd2 操作符 cmd3 ......,把整个称作一个命令

&:除了最后一个cmd,前面的cmd均已后台方式静默执行,执行结果显示在终端上,个别的cmd错误不影响整个命令的执行,全部的cmd同时执行

&&:从左到右顺序执行cmd,个别cmd错误不产生影响

|:各个cmd同时在前台被执行,但是除最后的cmd之外,其余的执行结果不会被显示在终端上

||:从左到右顺序执行cmd,只有左侧的cmd执行出错,右边的cmd才会被执行,同时一旦有cmd被成功执行,整个命令就会结束,返回终端

Linux shell中&,&&,|,||的用法的更多相关文章

  1. Linux Shell中有三种引号的用法

    Linux Shell中有三种引号,分别为双引号(" ").单引号(' ')以及反引号(` `). 其中双引号对字符串中出现的$.''.`和\进行替换:单引号不进行替换,将字符串中 ...

  2. 理解 Linux shell 中的一个方言:2>&1

    理解 Linux shell 中的一个方言:2>&1  2016-11-14 杜亦舒 前言 在使用 linux 命令或者 shell 编程时,这个用法常会遇到 2>&1 如 ...

  3. Linux shell中的竖线(|)——…

    原文地址:Linux shell中的竖线(|)--管道符号作者:潇潇 管道符号,是unix一个很强大的功能,符号为一条竖线:"|". 用法: command 1 | command ...

  4. [转载]Linux shell中的竖线(|)——管道符号

    原文地址:Linux shell中的竖线(|)--管道符号作者:潇潇 管道符号,是unix一个很强大的功能,符号为一条竖线:"|". 用法: command 1 | command ...

  5. Linux Shell中的特殊符号和含义简明总结(包含了绝大部份)

    case语句适用于需要进行多重分支的应用情况. case分支语句的格式如下: case $变量名 in 模式1) 命令序列1 ;; 模式2) 命令序列2        ;; *) 默认执行的命令序列  ...

  6. (12)Linux shell之read 用法

    Linux shell之read 用法 #!/bin/bash#read 用来读取屏幕输入或是读取文件内容.read -p  "please input you  name: " ...

  7. linux shell 中的sleep命令

    开始还以为是这样的语法: sleep(1), 后面发现是: linux shell 中的sleep命令 分类: LINUX 在有的shell(比如linux中的bash)中sleep还支持睡眠(分,小 ...

  8. linux shell 中的位置变量

    对于linux shell 中的位置变量,我一直以来都是吐不出来又咽不下去,每次看到都不懂,不懂了就去百度google,看完了又忘,真是慢性咽炎啊.现在认真想想也是,其实自己一直以来都没有好好学习过, ...

  9. Linux shell中的一个问题 ${}带正则匹配的表达式

    目前在准备龙芯项目的PMON,在研究其编译过程的时候,看到一些make 语句,百思不得其解.后来在shell编程中看到一点资料,牵扯到Shell中的正则表达式.故记录下来,以备后来查阅. 问题: 在某 ...

  10. Linux shell 中提取zip或jar文件中的某个文件

    Linux shell 中提取zip或jar文件中的某个文件 假如有个压缩包 abc.jar, 里面文件如下 (可以用unzip -l abc.jar 查看): data/1.txt data/2.t ...

随机推荐

  1. 20165302 2017-2018-2《Java程序设计》课程总结

    20165302 2017-2018-2<Java程序设计>课程总结 每周作业汇总 预备作业1 对师生关系的看法 预备作业2 C语言基础调查 预备作业3 安装虚拟机,初步学习虚拟机及常用命 ...

  2. Python自动化之迭代器不能在迭代的时候更改值

    除列表外的其他序列都是不可变的, 所以危险就发生在这里. 一个序列的迭代器只是记录你当前到达第多少个元素, 所以如果你在迭代时改变了元素, 更新会立即反映到你所迭代的条目上.在迭代字典的 key 时, ...

  3. java学习笔记-JavaWeb篇一

    JavaWEB篇一 1 Tomcat的安装和配置 2 JavaWeb开发的目录结构 3 使用Eclipse开发JavaWeb项目 4 第一个Servlet程序 5 Servlet 的配置及生命周期方法 ...

  4. 如何解决安卓(系统版本低) CSS3 动画问题---高性能动画

    目前对提升移动端CSS3动画体验的主要方法有几点: 尽可能多的利用硬件能力,如使用3D变形来开启GPU加速 -webkit-transform: translate3d(0, 0, 0); -moz- ...

  5. 【题解】洛谷P1070 道路游戏(线性DP)

    次元传送门:洛谷P1070 思路 一开始以为要用什么玄学优化 没想到O3就可以过了 我们只需要设f[i]为到时间i时的最多金币 需要倒着推回去 即当前值可以从某个点来 那么状态转移方程为: f[i]= ...

  6. 学习Java 采取令牌的方式避免重复提交

    重复提交原因 从提交页面到成功页面的跳转一般采用视图定位,由于视图定位是在服务端跳转的,如果用户在点击提交之后再次刷新页面,会导致重复提交,数据库的数据会有重复. 采用令牌措施 1.在转账展示页面生成 ...

  7. iview的Affix插件遇到滚动时候的bug处理方法

    最近有个需求,是用vue做的页面,其中嵌入了一个tinymce编辑器,编辑器设置了自动调整高度,也就是说编辑器中内容越多,高度就会自动撑高 我们需要再页面最下方放一个保存按钮,保存按钮必须固定在屏幕下 ...

  8. LeetCode 队列与BFS--岛屿的数量

    tags = ["leetcode","队列","BFS","C++","Go"] 岛屿的个数 给定 ...

  9. react router animation example

    https://github.com/reactjs/react-router/tree/80c71d57c936ed54babdde44309c01f6a4b56b77/examples/anima ...

  10. 20145209刘一阳《JAVA程序设计》第六周课堂测试

    第六周课堂测试 1.现有以下代码,哪些选项插入到第5行可以通过编译?(BDF) 1.import java.util.*; 2. 3.Class FindStuff { 4.public static ...