Golang SSH load LD_PRELOAD和LD_LIBRARY_PATH环境变量
我正在尝试使用连接到远程服务器,但我的工作站和此远程服务器之间存在连接问题Golang SSH load LD_PRELOAD和LD_LIBRARY_PATH环境变量,go,ssh,socks,Go,Ssh,Socks,我正在尝试使用连接到远程服务器,但我的工作站和此远程服务器之间存在连接问题 我只需设置LD_预加载和LD_库路径,然后运行以下命令即可连接到服务器: $ 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_
我只需设置LD_预加载和LD_库路径,然后运行以下命令即可连接到服务器:
$ 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设置为“是”
有没有办法“强制”Golang SSH使用这些环境变量?(编辑:此答案不一定适用于Go 1.8及以上版本。有关讨论,请参阅注释)
LD_PRELOAD
和LD_LIBRARY_PATH
是程序启动时由处理的环境变量。如果在程序中设置这些环境变量,它们不会对程序本身产生影响,因为链接器没有看到它们
另一方面,环境变量将影响从程序内部运行的外部应用程序(例如ssh
命令),因为链接器被赋予解析应用程序使用的共享库的控制权
如果您在运行Go程序之前设置这些环境变量,我认为您将获得预期的效果。(这仅适用于编译后的程序链接到共享标准C库的情况。有关更多详细信息,请参阅下面的@JimB注释。)LD_PRELOAD和LD_library_PATH与ssh本身无关,即将一些共享库注入到openssh进程中。如果不使用openssh二进制文件,则无法将其他共享库预加载到其中。不,这不会产生预期效果,因为Go不使用要重写的C库套接字调用。Go程序在运行时可能不使用任何C共享库(尽管std库在启用时对解析器和用户数据库使用cgo),并且可能完全是静态的linked@JimB谢谢你指出这一点!我已经根据你的评论更新了我的答案,在快速核实确实如此之后。你确定吗?
ssh
包中的Dial()
函数使用net
包中的DialTimeout()
。我编写了一个简单的程序,它使用了DialTimeout()
,并且我能够使用LD\u PRELOAD
通过SOCKS
代理进行隧道传输。(这是在Linux上启用了CGO_
并将其设置为true/undefined。go build
生成了一个动态链接的可执行文件,我对此进行了测试。)哦,是的,我忘了它只需要拦截拨号。然而,我认为当前版本的Go已经开始默认为本机拨号程序,除非本地配置文件需要。你使用的是什么版本的围棋?(即使如此,您仍然可以导出GODEBUG=netdns=cgo以强制使用cgo解析器)好的,这就是我的想法。因此,如果您想依赖LD_PRELOAD,则需要在所有情况下强制主机解析器,这可以通过GODEBUG=netdns=cgo
或使用netcgo
标记进行构建。