Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Golang SSH load LD_PRELOAD和LD_LIBRARY_PATH环境变量_Go_Ssh_Socks - Fatal编程技术网

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
标记进行构建。