我尝试使用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使用这些环境变量吗?
答案 0 :(得分:1)
(编辑:此答案不一定适用于Go 1.8及以上版本。请参阅评论以供讨论)
LD_PRELOAD
和LD_LIBRARY_PATH
是程序启动时由dynamic linker处理的环境变量。如果在程序中设置这些环境变量,它们不会对程序本身产生影响,因为链接器没有看到它们。
另一方面,环境变量将影响您在程序中运行的外部应用程序(例如ssh
命令),因为链接器具有控制权以解析应用程序使用的共享库。
如果您在运行Go程序之前设置了这些环境变量,我认为您将获得所需的效果。(仅当编译的程序链接到共享标准时才适用C库。有关详细信息,请参阅下面的@ JimB&#39评论。)