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