环境变量中能写脚本吗

今天早上回顾了昨天写的一篇文章,无意中发现我在环境变量中写入脚本,一下子有了疑问:环境变量中也能写脚本吗?那么不是说通过环境变量也能删库跑路。

使用golang写个简单的例子试试:

1
2
3
4
5
6
7
8
9
package main

import "fmt"
import "os"

func main() {
var foo = os.Getenv("foo")
fmt.Println(foo)
}

1
go build main.go
1
2
jukay@~/Code/Golang/env$ env foo="$(echo Hello World)" ./main
Hello World

输出foo环境变量的值是Hello World

1
2
jukay@~/Code/Golang/env$ env foo="$(echo $GOPATH)" ./main
/Users/jukay/Code/Go

环境变量中写脚本使用另一个环境变量

1
2
3
4
5
6
7
jukay@~/Code/Golang/env$ touch bar.txt
jukay@~/Code/Golang/env$ ls
bar.txt main main.go
jukay@~/Code/Golang/env$ env foo="$(rm bar.txt)" ./main

jukay@~/Code/Golang/env$ ls
main main.go

可以删除文件

1
2
3
4
5
6
jukay@~/Code/Golang/env$ cat bar.sh
#!/usr/bin/env bash

echo Hello World
jukay@~/Code/Golang/env$ env foo="$(sh bar.sh)" ./main
Hello World

在环境变量中能够启动另一个脚本

1
foo="$( foo(){ echo Hello World ;} ; foo )" ./main

这个复杂了一点,在环境变量中定义一个函数,也就是说环境变量中可能还有bash炸弹

我能够在环境变量中将当成进程切换成sudo用户吗?
答案是:不可以,因为当前进程已经启动了,环境变量中的shell是另外的一个bash进程。

给一个思考题:这里获取环境变量会阻塞10秒钟,为什么能够阻塞,是怎么做到的.

1
env foo="$(sleep 100)" ./main