我正在尝试使用 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 使用这些环境变量?
最佳答案
(编辑:此答案不一定适用于 Go 1.8 及更高版本。请参阅评论进行讨论)
LD_PRELOAD
和 LD_LIBRARY_PATH
是由 dynamic linker 处理的环境变量当程序启动时。如果您在程序中设置这些环境变量,它们不会对程序本身产生影响,因为链接器看不到它们。
另一方面,环境变量将影响您从程序内部运行的外部应用程序(例如 ssh
命令),因为链接器被赋予控制权来解析共享库应用程序使用。
如果你在运行 Go 程序之前设置这些环境变量,我想你会得到预期的效果。(这仅适用于编译后的程序链接到共享标准 C 库的情况. 有关详细信息,请参阅下面@JimB 的评论。)
关于Golang SSH 加载 LD_PRELOAD 和 LD_LIBRARY_PATH 环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45444513/