发布时间:2024-12-23 00:33:29
go get github.com/gliderlabs/ssh
安装完毕后,我们可以开始编写代码了。
下面是一个建立SSH连接的示例:
package main
import (
"fmt"
"golang.org/x/crypto/ssh"
"log"
)
func main() {
config := &ssh.ClientConfig{
User: "your_username",
Auth: []ssh.AuthMethod{
ssh.Password("your_password"),
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
}
client, err := ssh.Dial("tcp", "your_server_address:22", config)
if err != nil {
log.Fatal(err)
}
fmt.Println("Connected to the server!")
// 在这里可以执行想要的操作
client.Close()
}
在这个示例中,我们通过创建一个ClientConfig对象,设置了用户名和密码以及服务器地址。然后,使用Dial函数建立SSH连接。如果连接成功,打印出"Connected to the server!"。最后,我们使用client的Close方法来关闭连接。
下面是一个执行命令的示例:
package main
import (
"fmt"
"golang.org/x/crypto/ssh"
"log"
)
func main() {
config := &ssh.ClientConfig{
User: "your_username",
Auth: []ssh.AuthMethod{
ssh.Password("your_password"),
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
}
client, err := ssh.Dial("tcp", "your_server_address:22", config)
if err != nil {
log.Fatal(err)
}
session, err := client.NewSession()
if err != nil {
log.Fatal(err)
}
defer session.Close()
output, err := session.Output("ls")
if err != nil {
log.Fatal(err)
}
fmt.Println(string(output))
}
在这个示例中,我们先建立SSH连接,然后创建一个Session对象。通过Session对象的Output方法来执行命令,并获取命令的输出。在这个示例中,我们执行了"ls"命令,并打印出输出结果。
下面是一个传输文件的示例:
package main
import (
"fmt"
"golang.org/x/crypto/ssh"
"golang.org/x/crypto/ssh/terminal"
"io/ioutil"
"log"
"os"
"path/filepath"
)
func main() {
config := &ssh.ClientConfig{
User: "your_username",
Auth: []ssh.AuthMethod{
ssh.Password("your_password"),
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
}
client, err := ssh.Dial("tcp", "your_server_address:22", config)
if err != nil {
log.Fatal(err)
}
session, err := client.NewSession()
if err != nil {
log.Fatal(err)
}
defer session.Close()
// 从本地上传文件到远程服务器
file, err := os.Open("local_file.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
stat, err := file.Stat()
if err != nil {
log.Fatal(err)
}
go func() {
w, _ := session.StdinPipe()
defer w.Close()
fmt.Fprintln(w, "C0664", stat.Size(), filepath.Base(file.Name()))
io.Copy(w, file)
fmt.Fprint(w, "\x00")
}()
err = session.Run("/usr/bin/scp -t ~/remote_file.txt")
if err != nil {
log.Fatal(err)
}
fmt.Println("File uploaded!")
// 从远程服务器下载文件到本地
filepath := "remote_file.txt"
file, err = os.Create(filepath)
if err != nil {
log.Fatal(err)
}
defer file.Close()
session.Stdout = file
err = session.Run("/usr/bin/scp -f " + filepath)
if err != nil {
log.Fatal(err)
}
fmt.Println("File downloaded!")
}
在这个示例中,我们首先建立SSH连接,然后创建一个Session对象。利用Session对象的StdinPipe方法来上传文件到远程服务器,并使用Run方法执行scp命令。类似地,我们也可以使用Stdout方法来下载文件到本地。