不曾想过的的命令执行技巧

在这里插入图片描述
你可以在美丽的Unix世界中用shell执行你喜欢的任何命令,但是有时一个命令可以被用来执行另一个命令,这就是你不曾想过的命令执行技巧

举例来说,下面是用tar命令简介执行任意命令的方式:
在这里插入图片描述
但是再稍微研究一下,看上去有一大堆方法能用流行的unix命令做到这一点,规则很简单:

不可以从shell中运行命令
利用另一个命令的“副作用”
最终达到命令被执行

我用了一个小脚本,叫做runme.sh

mitsurugi@mitsu:~/tmp$ cat runme.sh 
#! /bin/bash 
echo "The name's 0xMitsurugi!" 
echo "Remember it!" 
mitsurugi@mitsu:~/tmp$

如果脚本运行时显示这段话了,你就赢了,来继续测试吧:

1/ tcpdump

$ tcpdump -n -i lo -G1 -w /dev/null -z ./runme.sh 
tcpdump: listening on lo, link-type EN10MB (Ethernet), capture size 65535 bytes 
The name's 0xMitsurugi! 
Remember it! 
The name's 0xMitsurugi! 
Remember it! 
^C6 packets captured 
12 packets received by filter 
0 packets dropped by kernel$

因为每一个数据包(-G),我们用指定的程序(-z)处理输出的文件(-w)
(附译者测试截图:)
在这里插入图片描述
2/ tar

$ tar c a.tar -I ./runme.sh a 
tar: a.tar: Cannot stat: No such file or directory 
The name's 0xMitsurugi! 
Remember it! 
tar: Exiting with failure status due to previous errors$

因为你可以在命令行指定任意压缩程序给tar(-I)并且我们并不在乎它报错与否
(附译者测试截图:)
在这里插入图片描述
3/ zip

$ zip z.zip a -T -TT ./runme.sh 
The name's 0xMitsurugi! 
Remember it! 
test of z.zip OK 
$

zip有自动测试zip文件的友好功能(-T),并且用另一个程序测试解压缩(-TT)
译者注:这里的a必须是存在的文件,否则报错会不运行
(附译者测试截图:)
在这里插入图片描述
4/ ftp (and many others…)
很多程序可以将你的命令返回给shell执行,这里我演示ftp是因为它在老版本Unix上很通用

$ ftp 
ftp> ! ./runme.sh 
The name's 0xMitsurugi! 
Remember it! 
ftp>

还有vi、gdb之类等等,你甚至可以用~^Z来退出ssh的session
(附译者测试截图:)
在这里插入图片描述
5/ man
这个就是玩一玩而已,但是你必须给出程序的完整路径。用-P选项指定默认的分页程序。

$ man -P /tmp/runme.sh man 
The name's 0xMitsurugi! 
Remember it! 
$

附译者测试截图:)
在这里插入图片描述
6/ git (and man, and…)
如果你可以操纵环境变量,那么就有很多好玩的事情了:

$ export PAGER=./runme.sh
$ git -p help
The name's 0xMitsurugi!
Remember it!
$

(附译者测试截图:)
在这里插入图片描述
没错,“man”命令也可以这样利用,并且肯定许多其他的程序只要定义了PAGER环境变量也一定可以。

但是别急,git能做的还有好多,如果你可以写入任何$PATH中的目录中,你可以做到:
(译者注:在git 1.9.1 中文版上未测试成功,不明觉厉,不明源作者所用版本)

$ export PATH=/tmp:$PATH 
$ ln -sf /tmp/runme.sh /tmp/git-help 
$ git --exec-path=/tmp help 
The name's 0xmitsurugi 
remember it! 
$

尽管我不知道这该怎么玩,但我确信别人会找到用途 :) 由于不明原因,要想运行必须要有–exec-path在$PATH中才行

7/ 最想不到的:bash $HOME 变量
恩,是的,有办法弄二级的shell:
(译者注:原文命令如下,但是原作者忘了一条: ln -sf /root/runme.sh /root/.bashrc)

$ pwd 
/tmp 
$ ls -la .bashrc 
lrwxrwxrwx 1 mitsurugi mitsurugi    8 juin  19 14:03 .bashrc -> runme.sh 
$ export HOME=. 
$ bash 
The name's 0xMitsurugi! 
Remember it! 
$

(附译者测试截图:)
在这里插入图片描述
在我尝试之前我本以为这是100%会失败的事情。

8/ awk (and many others)
当你有一个“system”命令时,一切都变的太简单了:

$ awk 'BEGIN {system("./runme.sh")}' 
The name's 0xMitsurugi! 
Remember it! 
$

(附译者测试截图:)
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值