Golang SSH 加载 LD_PRELOAD 和 LD_LIBRARY_PATH 环境变量

标签 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 使用这些环境变量?

最佳答案

(编辑:此答案不一定适用于 Go 1.8 及更高版本。请参阅评论进行讨论)

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

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

如果你在运行 Go 程序之前设置这些环境变量,我想你会得到预期的效果。(这仅适用于编译后的程序链接到共享标准 C 库的情况. 有关详细信息,请参阅下面@JimB 的评论。)

关于Golang SSH 加载 LD_PRELOAD 和 LD_LIBRARY_PATH 环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45444513/

相关文章:

go - 通过 AWS SDK GO 将 gzip 文件流式传输到 S3

arrays - 解码 map 和 array json

Go:如何在不重命名的情况下处理包冲突?

linux - SSH 和窗口 ID

c++ - 来自 Qt 的 Ssh 命令

c - SOCKS5 - 连接身份验证

使用 Socks 的 Java JDBC 连接

security - 将证书和 key 作为字符串传递给 ListenAndServeTLS

ssh - "SOCKS5 proxying"和 "ssh tunneling"是同一个东西吗?

ssh - 通过 SSH 通过另一台服务器将 MySQL 连接到服务器