Linux命令之xargs的分析及隐患
写一个main.c:
#include <stdio.h>
int main(){
printf("foo");
printf("bar");
return 0;
}
然后gcc编译为test.
然后在工作目录下建立两个目录:foo,bar
然后./test | xargs rm -rf
其实以上命令是删除不掉foo和bar的。
然后再来看以下
写一个main.c:
#include <stdio.h>
int main(){
printf("foo\n");
printf("bar\n");
return 0;
}
然后gcc编译为test.
然后在工作目录下建立两个目录:foo,bar
然后./test | xargs rm -rf
其实以上命令是能把foo bar删除了的。
然后再修改main.c
#include <stdio.h>
int main(){
printf("foo\nbar\n");
return 0;
}
以上的修改是也能删除foo和bar
然后再修改main.c
#include <stdio.h>
int main(){
printf("foo bar");
return 0;
}
以上的修改是也能删除foo和bar
所以总结:
xargs是把整个输入流中的字符串遇到空格和换行符'\n'就截断为参数字符串(比如"foo bar"会被截断为两个字符串"foo"和"bar")传递给rm的,之前的foo和bar的输出没有换行符和空格,输出来就是“foobar”,由于工作目录没有建立foobar目录,当然就删除不掉了,所以也删不掉foo,bar目录。这样很显然是违背用户意愿了,如果工作目录下真存在foobar目录呢?万一这个目录很重要呢?那就悲剧了。
真相如下:
如果这回test是输出"foo bar"
有xargs的:(这个很明显能看到xargs的作用了)
./test | xargs strace rm -rf
execve("/bin/rm", ["rm", "-rf", "foo", "bar"], [/* 50 vars */]) = 0
brk(0) = 0x17fc000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6e5fc7b000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=78756, ...}) = 0
mmap(NULL, 78756, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f6e5fc67000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240\30\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1815224, ...}) = 0
mmap(NULL, 3929304, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f6e5f69b000
mprotect(0x7f6e5f850000, 2097152, PROT_NONE) = 0
mmap(0x7f6e5fa50000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b5000) = 0x7f6e5fa50000
mmap(0x7f6e5fa56000, 17624, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f6e5fa56000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6e5fc66000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6e5fc65000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6e5fc64000
arch_prctl(ARCH_SET_FS, 0x7f6e5fc65700) = 0
mprotect(0x7f6e5fa50000, 16384, PROT_READ) = 0
mprotect(0x60c000, 4096, PROT_READ) = 0
mprotect(0x7f6e5fc7d000, 4096, PROT_READ) = 0
munmap(0x7f6e5fc67000, 78756) = 0
brk(0) = 0x17fc000
brk(0x181d000) = 0x181d000
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=93101680, ...}) = 0
mmap(NULL, 93101680, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f6e59dd1000
close(3) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fffd51c9478) = -1 ENOTTY (Inappropriate ioctl for device)
lstat("/", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
newfstatat(AT_FDCWD, "foo", {st_mode=S_IFDIR|0775, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
openat(AT_FDCWD, "foo", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 3
fcntl(3, F_GETFD) = 0
fcntl(3, F_SETFD, FD_CLOEXEC) = 0
fstat(3, {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
fcntl(3, F_GETFL) = 0x38800 (flags O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_NOFOLLOW)
fcntl(3, F_SETFD, FD_CLOEXEC) = 0
fcntl(3, F_DUPFD, 3) = 4
fcntl(4, F_GETFD) = 0
fcntl(4, F_SETFD, FD_CLOEXEC) = 0
getdents(3, /* 2 entries */, 32768) = 48
getdents(3, /* 0 entries */, 32768) = 0
close(3) = 0
unlinkat(AT_FDCWD, "foo", AT_REMOVEDIR) = 0
close(4) = 0
newfstatat(AT_FDCWD, "bar", {st_mode=S_IFDIR|0775, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
openat(AT_FDCWD, "bar", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 3
fcntl(3, F_GETFD) = 0
fcntl(3, F_SETFD, FD_CLOEXEC) = 0
fstat(3, {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
fcntl(3, F_GETFL) = 0x38800 (flags O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_NOFOLLOW)
fcntl(3, F_SETFD, FD_CLOEXEC) = 0
fcntl(3, F_DUPFD, 3) = 4
fcntl(4, F_GETFD) = 0
fcntl(4, F_SETFD, FD_CLOEXEC) = 0
getdents(3, /* 2 entries */, 32768) = 48
getdents(3, /* 0 entries */, 32768) = 0
close(3) = 0
unlinkat(AT_FDCWD, "bar", AT_REMOVEDIR) = 0
close(4) = 0
lseek(0, 0, SEEK_CUR) = 0
close(0) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
没有xargs的:(由以下分析,很显然连“foo bar”这个参数都没有传递进去)
a@a:~/Downloads$ ./test | strace rm -rf
execve("/bin/rm", ["rm", "-rf"], [/* 50 vars */]) = 0
brk(0) = 0x17a9000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1bdbc08000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=78756, ...}) = 0
mmap(NULL, 78756, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f1bdbbf4000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240\30\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1815224, ...}) = 0
mmap(NULL, 3929304, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1bdb628000
mprotect(0x7f1bdb7dd000, 2097152, PROT_NONE) = 0
mmap(0x7f1bdb9dd000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b5000) = 0x7f1bdb9dd000
mmap(0x7f1bdb9e3000, 17624, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1bdb9e3000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1bdbbf3000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1bdbbf2000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1bdbbf1000
arch_prctl(ARCH_SET_FS, 0x7f1bdbbf2700) = 0
mprotect(0x7f1bdb9dd000, 16384, PROT_READ) = 0
mprotect(0x60c000, 4096, PROT_READ) = 0
mprotect(0x7f1bdbc0a000, 4096, PROT_READ) = 0
munmap(0x7f1bdbbf4000, 78756) = 0
brk(0) = 0x17a9000
brk(0x17ca000) = 0x17ca000
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=93101680, ...}) = 0
mmap(NULL, 93101680, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f1bd5d5e000
close(3) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fffa591a788) = -1 ENOTTY (Inappropriate ioctl for device)
lseek(0, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
close(0) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
Linux命令之xargs的分析及隐患的更多相关文章
- Linux命令:xargs命令详解,xargs与管道的区别
阅读目录 为什么要用xargs,问题的来源 xargs是什么,与管道有什么不同 xargs的一些有用的选项 回到顶部 为什么要用xargs,问题的来源 在工作中经常会接触到xargs命令,特别是在别人 ...
- linux命令 host-常用的分析域名查询工具
博主推荐:更多网络测试相关命令关注 网络测试 收藏linux命令大全 host命令是常用的分析域名查询工具,可以用来测试域名系统工作是否正常. 语法 host(选项)(参数) 选项 -a:显示详细的 ...
- N天学习一个linux命令之xargs
用途 标准输入流读取参数(空格或者换行符分隔),传递给需要执行的命令 用法 xargs [options] [command [initial-arguments]] 常用选项 --arg-file= ...
- 每日linux命令学习-xargs命令
xargs命令 xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理.通常情况下,xargs从管道或者stdin中读取数据 ...
- linux命令:xargs
1.命令介绍: xargs用来配合find命令查找的结果然后执行相应的命令 2.命令格式: find -type f -print | xargs file
- Linux命令(1)——xargs命令
1.功能: xargs能够将stdin中以空格或换行符进行分隔的数据.形成以空格分隔的參数(arguments),传递给其它命令.由于以空格作为分隔符,所以有一些文件名称或者其它意义的名词内含有空格的 ...
- 每天一个 Linux 命令(21):find命令之xargs
在使用 find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行.但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出 ...
- linux命令(4):top 命令(性能分析工具)
linux 的top命令详解 简介 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. top显示系统当前的进程和其他状况,是一个 ...
- linux下常用的日志分析命令
linux下常用的日志分析命令 本文介绍下,在linux中常用的一些分析日志的命令行或脚本,有需要的朋友参考下. 形如下面这样的access.log日志内容: 211.123.23.133 ...
随机推荐
- 《Programming WPF》翻译 第3章 2.处理输入
原文:<Programming WPF>翻译 第3章 2.处理输入 在Windows应用程序中,又3种基本的用户输入形式:鼠标.键盘和手写板.同时,还有一种更高级输入方式,其可能来自快捷键 ...
- UML--核心元素之分析类
分析类包括边界类.控制类和实体类. 边界类是一种用于对系统外部环境与其内部运作之间的交互进行建模的类. myself:就像建模时,不是所有的属性都要建模一样.不是所有的方法都要建模一样.学习也是如此, ...
- CSS3 新特性 开放字体格式WOFF
疑问 上面这是虾米玩意? \e806 是在自定义字体表中的字体位置. 好嘛 现在问题来了 WOFF里面是什么东西呢? 怎么才能看到? 用这个:FontCreatorPortable ...
- 第07讲- Android项目的打包apk
第07讲Android项目的打包apk 方法一:在工作目录bin文件夹下有一个与项目同名的apk文件 (最懒惰的方式,不推荐,不安全,不利于版本更新,只有在开发模式时使用) 方法二:使用key方式 签 ...
- Unity 异步加载场景
效果图如下: 今天一直在纠结如何加载场景,中间有加载画面和加载完毕的效果动画! A 场景到 B , 看见网上的做法都是 A –> C –> B. C场景主要用于异步加载B 和 播放一些 ...
- HTTP 协议实现
一.超文本传输协议及HTTP包 HTTP协议用于在Internet上发送和接收消息.HTTP协议是一种请求-应答式的协议--客户端发送一个请求,服务器返回该请求的应答,所有的请求与应答都是HTT ...
- Js操作Select
jquery操作select(取值,设置选中) 每一次操作select的时候,总是要出来翻一下资料,不如自己总结一下,以后就翻这里了. 比如<select class="selecto ...
- 解决angular 与django的冲突
{% block main %} <script type="text/javascript" src="http://cdnjs.cloudflare.com/a ...
- [转]Laravel 4之请求
Laravel 4之请求 http://dingjiannan.com/2013/laravel-request/ 获取请求数据 获取当前请求所包括的所有GET和POST数据 Route::get(' ...
- linux svn安装和配置
linux svn安装和配置,不结合apache http://blog.51yip.com/server/901.html 张映 发表于 2010-07-07 分类目录: 服务器相关 今天有个同事在 ...