Golang SSH加载LD_PRELOAD和LD_LIBRARY_PATH环境变量

时间:2017-08-01 17:42:29

标签: go ssh socks

我尝试使用Golang SSH package连接到远程服务器,但我的工作站和此远程服务器之间有一个SOCKS。

我只需设置LD_PRELOAD和LD_LIBRARY_PATH然后运行即可连接到服务器:

$ export LD_PRELOAD="/path/to/lib"
$ export LD_LIBRARY_PATH="/path/to/lib"
$ ssh user@hostname

但是当我在Go代码中设置这些变量时,它不起作用:

os.Setenv("LD_PRELOAD", "/path/to/file")
os.Setenv("LD_LIBRARY_PATH", "/path/to/file")

如果我在Go代码中设置这些变量并尝试以下操作,则可以:

ssh := exec.Command("ssh", "hostname")
output, _ := ssh.Output()
fmt.Println(string(output))

ssh PermitUserEnvironment设置为yes

有没有办法强迫"强迫" Golang SSH使用这些环境变量吗?

1 个答案:

答案 0 :(得分:1)

(编辑:此答案不一定适用于Go 1.8及以上版本。请参阅评论以供讨论)

LD_PRELOADLD_LIBRARY_PATH是程序启动时由dynamic linker处理的环境变量。如果在程序中设置这些环境变量,它们不会对程序本身产生影响,因为链接器没有看到它们。

另一方面,环境变量将影响您在程序中运行的外部应用程序(例如ssh命令),因为链接器具有控制权以解析应用程序使用的共享库。

如果您在运行Go程序之前设置了这些环境变量,我认为您将获得所需的效果。(仅当编译的程序链接到共享标准时才适用C库。有关详细信息,请参阅下面的@ JimB&#39评论。)