新聞中心
如何使用Go語言實現遠程執(zhí)行命令
一般命令
我們注重客戶提出的每個要求,我們充分考慮每一個細節(jié),我們積極的做好網站制作、做網站服務,我們努力開拓更好的視野,通過不懈的努力,成都創(chuàng)新互聯公司贏得了業(yè)內的良好聲譽,這一切,也不斷的激勵著我們更好的服務客戶。 主要業(yè)務:網站建設,網站制作,網站設計,重慶小程序開發(fā),網站開發(fā),技術開發(fā)實力,DIV+CSS,PHP及ASP,ASP.Net,SQL數據庫的技術開發(fā)工程師。
所謂一般命令,就是在一定時間內會執(zhí)行完的命令。比如 grep, cat 等等。 執(zhí)行命令的步驟是:連接,執(zhí)行,獲取結果
連接
連接包含了認證,可以使用 password 或者 sshkey 2種方式來認證。下面的示例為了簡單,使用了密碼認證的方式來完成連接。
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í)行,命令獲取結果
連接成功后,執(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í)行了,但是沒有正常輸出的結果,也沒有異常輸出的結果。 要想顯示結果,需要將 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")
}
這樣就能在屏幕上顯示正常,異常的信息了。
交互式命令
上面的方式無法遠程執(zhí)行交互式命令,比如 top , 遠程編輯一個文件,比如 vi /etc/nginx/nginx.conf 如果要支持交互式的命令,需要當前的terminal來接管遠程的 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")
}
總結
好了,這樣就可以執(zhí)行交互式命令了,比如上面的 top 也可以通過 vi /etc/nginx/nignx.conf 之類的命令來遠程編輯文件。
Golang 綁定mac和ip地址,限制服務器
實際業(yè)務:go 二進制文件在私有化部署中,需要對客戶的服務器mac和ip進行綁定,系統只能運行在綁定的服務器上。把mac和ip地址配置到config中。
運行效果:系統可正常編譯,正常訪問,在用戶Auth接口進行核對。
//檢驗Mac和內網IP,測試環(huán)境不做校驗
func (c *CommonBase)CheckMacAndIp()error {
ipCfg :=g.Cfg().GetString("machine.Ipaddr")
macCfg :=g.Cfg().GetString("machine.Macip")
if ipCfg =="127.0.0.1" {
return nil
}
macArray,_ :=gipv4.GetMacArray()
if len(macArray) ==0 {
return gerror.New("mac地址獲取失敗")
}
if garray.NewStrArrayFrom(macArray).Contains(macCfg) ==false {
return gerror.New("示授權的應用MAC,請聯系")
}
ipArray,_ :=gipv4.GetIpArray()
ipIntranetArray,_ :=gipv4.GetIntranetIpArray()
if len(ipArray) ==0 len(ipIntranetArray) ==0 {
return gerror.New("ip地址獲取失敗")
}
if garray.NewStrArrayFrom(ipArray).Merge(ipIntranetArray).Contains(ipCfg) ==false {
return gerror.New("示授權的應用IP,請聯系")
}
return nil
}
項目使用GoFrame框架1.6??紤]到客戶可能會對內存數據做分析破解,可以把mac和ip地址做AES加密。
golang echo(二)---請求與響應
上一章節(jié)介紹了使用echo啟動一個http服務器并提供一個簡單的GET接口,這一章對請求與響應做一下詳細的講解。
了解請求與響應之前首先要知道ehco框架提供了一個Context接口,Context 表示當前 HTTP 請求的上下文,我們需要知道的是Context的實現結構體context,context中包含了請求(request)、響應(response)以及參數等結構體,context是一個內部結構體,但是對外提供了訪問的方法,我們可以在開發(fā)中使用context提供的方法做很多事情,比如獲取請求路徑、客戶端ip、請求參數等等。
request是包含了當前請求信息的結構體,我們從中可以獲取到前后端約定好的參數來作出相應的業(yè)務邏輯,這下面開始模擬請求
首先模擬一個添加用戶的POST請求,這里使用了c.bind()這個方法,這個方法起到的作用是把表單參數或者JSON參數綁定至對應的結構體(這里必須是指針類型),字段需要一一對應,也就是說前端需要傳遞的表單或JSON參數名為name、age、gender才能綁定到結構體中。
接下來模擬一個GET請求用來獲取用戶信息
response是包含了返回信息的結構體,echo提供了多種類型的返回結果
上面編寫了處理請求的handler,這里介紹一下如何把handler注冊到路由中,這里對應的就是上面handler。
新聞標題:go語言模擬ip訪問,go 獲取本機ip
分享路徑:http://fisionsoft.com.cn/article/hojhij.html