新聞中心
golang SSH客戶端三件套 - 1遠(yuǎn)程連接 shell
golang SSH客戶端系列文章目錄
南票網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián),南票網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為南票上1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請找那個售后服務(wù)好的南票做網(wǎng)站的公司定做!
SSH(Secure Shell)協(xié)議在遠(yuǎn)程登錄時比較常用,但是除此之外還有一些其它的功能也很好用,比如端口映射,X11轉(zhuǎn)發(fā),sftp文件傳輸?shù)取?/p>
以下三篇文章將介紹golang版SSH的遠(yuǎn)程登錄功能,端口映射功能及sftp文件傳輸功能。X11包含GUI的一些操作,沒有找到相關(guān)的包,故不做介紹
通過golang自帶的ssh包 golang.org/x/crypto/ssh 可以實現(xiàn)遠(yuǎn)程登錄功能, 默認(rèn)是不支持tab鍵和上下箭頭的 ,
通過導(dǎo)入golang.org/x/crypto/ssh/terminal來創(chuàng)建VT100終端可以支持tab等功能,讓golang版本的ssh客戶端體驗和平時用的其它客戶端差不多。
如何使用Go語言實現(xiàn)遠(yuǎn)程執(zhí)行命令
一般命令
所謂一般命令,就是在一定時間內(nèi)會執(zhí)行完的命令。比如 grep, cat 等等。 執(zhí)行命令的步驟是:連接,執(zhí)行,獲取結(jié)果
連接
連接包含了認(rèn)證,可以使用 password 或者 sshkey 2種方式來認(rèn)證。下面的示例為了簡單,使用了密碼認(rèn)證的方式來完成連接。
import (
"fmt"
"time"
"golang.org/x/crypto/ssh"
)
func connect(user, password, host string, port int) (*ssh.Session, error) {
var (
auth []ssh.AuthMethod
addr string
clientConfig *ssh.ClientConfig
client *ssh.Client
session *ssh.Session
err error
)
// get auth method
auth = make([]ssh.AuthMethod, 0)
auth = append(auth, ssh.Password(password))
clientConfig = ssh.ClientConfig{
User: user,
Auth: auth,
Timeout: 30 * time.Second,
}
// connet to ssh
addr = fmt.Sprintf("%s:%d", host, port)
if client, err = ssh.Dial("tcp", addr, clientConfig); err != nil {
return nil, err
}
// create session
if session, err = client.NewSession(); err != nil {
return nil, err
}
return session, nil
}
連接的方法很簡單,只要提供登錄主機的 用戶*, *密碼*, *主機名或者IP*, *SSH端口
執(zhí)行,命令獲取結(jié)果
連接成功后,執(zhí)行命令很簡單
import (
"fmt"
"log"
"os"
"time"
"golang.org/x/crypto/ssh"
)
func main() {
session, err := connect("root", "xxxxx", "127.0.0.1", 22)
if err != nil {
log.Fatal(err)
}
defer session.Close()
session.Run("ls /; ls /abc")
}
上面代碼運行之后,雖然命令正常執(zhí)行了,但是沒有正常輸出的結(jié)果,也沒有異常輸出的結(jié)果。 要想顯示結(jié)果,需要將 session 的 Stdout 和 Stderr 重定向 修改 func main 為如下:
func main() {
session, err := connect("root", "xxxxx", "127.0.0.1", 22)
if err != nil {
log.Fatal(err)
}
defer session.Close()
session.Stdout = os.Stdout
session.Stderr = os.Stderr
session.Run("ls /; ls /abc")
}
這樣就能在屏幕上顯示正常,異常的信息了。
交互式命令
上面的方式無法遠(yuǎn)程執(zhí)行交互式命令,比如 top , 遠(yuǎn)程編輯一個文件,比如 vi /etc/nginx/nginx.conf 如果要支持交互式的命令,需要當(dāng)前的terminal來接管遠(yuǎn)程的 PTY。
func main() {
session, err := connect("root", "olordjesus", "dockers.iotalabs.io", 2210)
if err != nil {
log.Fatal(err)
}
defer session.Close()
fd := int(os.Stdin.Fd())
oldState, err := terminal.MakeRaw(fd)
if err != nil {
panic(err)
}
defer terminal.Restore(fd, oldState)
// excute command
session.Stdout = os.Stdout
session.Stderr = os.Stderr
session.Stdin = os.Stdin
termWidth, termHeight, err := terminal.GetSize(fd)
if err != nil {
panic(err)
}
// Set up terminal modes
modes := ssh.TerminalModes{
ssh.ECHO: 1, // enable echoing
ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud
ssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud
}
// Request pseudo terminal
if err := session.RequestPty("xterm-256color", termHeight, termWidth, modes); err != nil {
log.Fatal(err)
}
session.Run("top")
}
總結(jié)
好了,這樣就可以執(zhí)行交互式命令了,比如上面的 top 也可以通過 vi /etc/nginx/nignx.conf 之類的命令來遠(yuǎn)程編輯文件。
go語言用到的hg和git是什么?
版本控制程序。就是對你的軟件每次修改進(jìn)行記錄,方便出問題時回退。
hg命令本來的軟件名字加mercury, git就叫g(shù)it.
還有svn( subversion), cvs.
目前比較常用的是svn, 比較受人歡迎的是git. 版本控制軟件是軟件開發(fā)的基礎(chǔ)工具,不光go需要用到,所有語言的軟件開發(fā)都用。
一個很好的git的開源軟件平臺叫g(shù)ithub.com,可以試試。還有什么 問題可以加我好友多聊聊。
golang調(diào)用遠(yuǎn)程打印機
golang可以遠(yuǎn)程操控打印機。根據(jù)相關(guān)資料搜索查詢得知,打印機可以支持遠(yuǎn)程打印,不限制設(shè)備和距離,不需要電腦和手機配合。
網(wǎng)站欄目:go語言版本遠(yuǎn)程控制 go遠(yuǎn)程調(diào)試
標(biāo)題路徑:http://fisionsoft.com.cn/article/dddoeoo.html