目的
Golang中可以使用 golang.org/x/crypto/ssh 包作為SSH客戶端或者SSH服務(wù)使用。這篇文章將簡單記錄下作為客戶端使用的一些內(nèi)容。
Package ssh implements an SSH client and server.
基礎(chǔ)說明
作為客戶端與SSH服務(wù)器操作上來說主要分為三步:
- 使用一定的參數(shù)與SSH服務(wù)器建立連接得到
Client
對象; - 在
Client
之上建立會話Session
,設(shè)置會話的輸入輸出等配置; - 通過
Session
進(jìn)行單次或是連續(xù)通訊;
使用演示
單次通訊
Session
的 Run
Output
CombinedOutput
方法都可用于單次通訊,下面是個簡單的演示:
package main
import (
"bytes"
"fmt"
"log"
"golang.org/x/crypto/ssh"
)
func main() {
// 設(shè)置客戶端請求參數(shù)
// var hostKey ssh.PublicKey
config := &ssh.ClientConfig{
User: "root",
Auth: []ssh.AuthMethod{
ssh.Password("naisu233"),
},
// HostKeyCallback: ssh.FixedHostKey(hostKey),
HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 忽略主機(jī)密鑰
}
// 作為客戶端連接SSH服務(wù)器
client, err := ssh.Dial("tcp", "192.168.31.142:22", config)
if err != nil {
log.Fatal("Failed to dial: ", err)
}
defer client.Close()
// 創(chuàng)建會話
session, err := client.NewSession()
if err != nil {
log.Fatal("Failed to create session: ", err)
}
defer session.Close()
// 設(shè)置會話標(biāo)準(zhǔn)輸出,運(yùn)行命令
var b bytes.Buffer
session.Stdout = &b
if err := session.Run("cat /proc/cpuinfo"); err != nil {
log.Fatal("Failed to run: " + err.Error())
}
fmt.Println(b.String())
}
需要注意的是每個 Session
只能進(jìn)行一次通訊,并且上述的幾個方法通訊時會阻塞。另外需要注意的是這幾個方法只會在指令運(yùn)行結(jié)束時才會返回結(jié)果,不適合用在持續(xù)進(jìn)行的命令中(比如 top
命令)。
連續(xù)通訊(遠(yuǎn)程終端)
連續(xù)通訊只要使用 Session
的 Start
Shell
方法,使用這兩者時需要使用 Wait
方法來等待結(jié)束會話。 Shell
方法可以作為遠(yuǎn)程終端使用:
package main
import (
"log"
"os"
"golang.org/x/crypto/ssh"
"golang.org/x/term"
)
func main() {
// 設(shè)置客戶端請求參數(shù)
// var hostKey ssh.PublicKey
config := &ssh.ClientConfig{
User: "root",
Auth: []ssh.AuthMethod{
ssh.Password("naisu233"),
},
// HostKeyCallback: ssh.FixedHostKey(hostKey),
HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 忽略主機(jī)密鑰
}
// 作為客戶端連接SSH服務(wù)器
conn, err := ssh.Dial("tcp", "192.168.31.142:22", config)
if err != nil {
log.Fatal("unable to connect: ", err)
}
defer conn.Close()
// 創(chuàng)建會話
session, err := conn.NewSession()
if err != nil {
log.Fatal("unable to create session: ", err)
}
defer session.Close()
// 設(shè)置會話的標(biāo)準(zhǔn)輸出、錯誤輸出、標(biāo)準(zhǔn)輸入
session.Stdout = os.Stdout
session.Stderr = os.Stderr
session.Stdin = os.Stdin
// 設(shè)置終端參數(shù)
modes := ssh.TerminalModes{
ssh.ECHO: 0, // disable echoing
ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud
ssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud
}
termWidth, termHeight, err := term.GetSize(int(os.Stdout.Fd())) // 獲取當(dāng)前標(biāo)準(zhǔn)輸出終端窗口尺寸 // 該操作可能有的平臺上不可用,那么下面手動指定終端尺寸即可
if err != nil {
log.Fatal("unable to terminal.GetSize: ", err)
}
// 設(shè)置虛擬終端與遠(yuǎn)程會話關(guān)聯(lián)
if err := session.RequestPty("xterm", termHeight, termWidth, modes); err != nil {
log.Fatal("request for pseudo terminal failed: ", err)
}
// 啟動遠(yuǎn)程Shell
if err := session.Shell(); err != nil {
log.Fatal("failed to start shell: ", err)
}
// 阻塞直至結(jié)束會話
if err := session.Wait(); err != nil {
log.Fatal("exit error: ", err)
}
}
文章來源:http://www.zghlxwxcb.cn/news/detail-696891.html
總結(jié)
Golang作為客戶端與SSH服務(wù)器交互還是比較方便的,實(shí)際使用中更多的需要注意阻塞方法以及持續(xù)執(zhí)行的外部程序的處理。文章來源地址http://www.zghlxwxcb.cn/news/detail-696891.html
到了這里,關(guān)于Golang筆記:使用ssh包作為客戶端與SSH服務(wù)器交互的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!