今天早上回顾了昨天写的一篇文章,无意中发现我在环境变量中写入脚本,一下子有了疑问:环境变量中也能写脚本吗?那么不是说通过环境变量也能删库跑路。
使用golang写个简单的例子试试:1
2
3
4
5
6
7
8
9package main
import "fmt"
import "os"
func main() {
var foo = os.Getenv("foo")
fmt.Println(foo)
}
1 | go build main.go |
1 | jukay@~/Code/Golang/env$ env foo="$(echo Hello World)" ./main |
输出foo
环境变量的值是Hello World
。
1 | jukay@~/Code/Golang/env$ env foo="$(echo $GOPATH)" ./main |
环境变量中写脚本使用另一个环境变量
1 | jukay@~/Code/Golang/env$ touch bar.txt |
可以删除文件
1 | jukay@~/Code/Golang/env$ cat bar.sh |
在环境变量中能够启动另一个脚本
1 | foo="$( foo(){ echo Hello World ;} ; foo )" ./main |
这个复杂了一点,在环境变量中定义一个函数,也就是说环境变量中可能还有bash炸弹
我能够在环境变量中将当成进程切换成sudo
用户吗?
答案是:不可以,因为当前进程已经启动了,环境变量中的shell是另外的一个bash进程。
给一个思考题:这里获取环境变量会阻塞10秒钟,为什么能够阻塞,是怎么做到的.1
env foo="$(sleep 100)" ./main