Golang远程执行Unix命令的库推荐
Golang远程执行Unix命令的库推荐 大家好,
我刚加入这个论坛,在博客中搜索了类似的帖子但没有找到,所以来提问这个问题。
能否请你们推荐一些Go语言库或示例,让我可以通过SSH连接到远程机器 -> 切换到某个账户 -> 执行多个命令?
我的最终目标是在多个Unix机器上使用不同的sudo用户执行多个命令。我可能还需要保持SSH连接一段时间。
提前感谢。
此致, Santosh
4 回复
抱歉,我说的是SSH。感谢您的纠正。让我修正我的问题。
更多关于Golang远程执行Unix命令的库推荐的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
(S)FTP 并非用于执行程序,更不用说进行 sudo 操作了……
它们的设计目的是在计算机之间传输文件。
如果你想在另一端运行程序,必须使用 SSH 或 Telnet。
以下是针对在Go中通过SSH远程执行Unix命令的推荐库和示例代码。这些库支持连接远程机器、切换账户(如使用sudo)和执行多个命令,同时保持SSH会话。
推荐库
- golang.org/x/crypto/ssh:这是Go标准库的一部分,提供SSH客户端功能,适合底层控制。
- github.com/pkg/sftp:如果需要文件传输,可与SSH结合使用。
- 第三方库如
github.com/melbahja/goph:简化SSH连接和命令执行,适合快速实现。
示例代码
以下示例使用 golang.org/x/crypto/ssh 库实现SSH连接、切换到sudo用户并执行多个命令。假设远程机器已配置SSH密钥认证或密码认证。
package main
import (
"fmt"
"log"
"os"
"time"
"golang.org/x/crypto/ssh"
)
func main() {
// SSH连接配置
config := &ssh.ClientConfig{
User: "your_username", // 初始SSH用户名
Auth: []ssh.AuthMethod{
ssh.Password("your_password"), // 使用密码认证;推荐使用SSH密钥,例如:ssh.PublicKeys(key)
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 生产环境中应验证主机密钥
Timeout: 30 * time.Second,
}
// 连接到远程主机
client, err := ssh.Dial("tcp", "remote-host:22", config)
if err != nil {
log.Fatalf("Failed to dial: %v", err)
}
defer client.Close()
// 创建新会话
session, err := client.NewSession()
if err != nil {
log.Fatalf("Failed to create session: %v", err)
}
defer session.Close()
// 设置会话的输入/输出
session.Stdout = os.Stdout
session.Stderr = os.Stderr
// 切换到sudo用户并执行多个命令
// 使用 'sudo -u <user> -s' 切换到目标用户,然后执行命令序列
commands := []string{
"sudo -u target_user -s whoami", // 切换到目标用户并检查当前用户
"sudo -u target_user -s ls -l /home/target_user", // 执行另一个命令
"sudo -u target_user -s pwd",
}
cmdString := ""
for _, cmd := range commands {
cmdString += cmd + "; " // 使用分号分隔多个命令
}
// 执行命令序列
if err := session.Run(cmdString); err != nil {
log.Fatalf("Failed to run command: %v", err)
}
fmt.Println("Commands executed successfully.")
}
说明
- 连接保持:上述代码创建了一个SSH客户端和会话,执行命令后会话关闭。如果需要保持连接执行多个独立命令,可以复用
client创建新会话。 - sudo用户切换:通过
sudo -u target_user -s在命令中切换用户;确保远程机器配置了sudo权限,无需密码提示(或在Auth中处理密码)。 - 认证方式:示例使用密码认证;生产环境推荐使用SSH密钥,例如:
key, err := os.ReadFile("/path/to/private/key") signer, err := ssh.ParsePrivateKey(key) Auth: []ssh.AuthMethod{ssh.PublicKeys(signer)}, - 错误处理:实际应用中应添加重试逻辑和更详细的错误处理。
对于更高级需求(如交互式会话或长时间连接),可以考虑使用 goph 库简化操作:
package main
import (
"fmt"
"log"
"github.com/melbahja/goph"
)
func main() {
client, err := goph.New("your_username", "remote-host", goph.Password("your_password"))
if err != nil {
log.Fatal(err)
}
defer client.Close()
// 执行命令
out, err := client.Run("sudo -u target_user -s whoami; ls -l")
if err != nil {
log.Fatal(err)
}
fmt.Printf("Output: %s\n", out)
}
这些示例覆盖了基本场景,可根据具体需求调整命令和认证方式。

