go语言中的tcpconn是阻塞还是非阻塞的阻塞socket和非阻塞socket的区别: 1、读操作 对于阻塞的socket,当socket的接收缓冲区中没有数据时 , read调用会一直阻塞?。钡接惺莸嚼床欧祷?。当socket缓冲区中的数据量小于期望读取的数据量时,返回实际读取的字节数 。
go语言tcp客户端怎么和服务端链接网络连接需要用socket,易语言用查易语言socket用或者看看否TCP协议相关组件
go语言中想同时开http服务和监听tcp端口怎么做func main() {
m := martini.Classic()
m.Get("/device/:serialnumber" , func(params martini.Params) string {
detail := GetDeviceState(params["serialnumber"])
result , _ := json.Marshal(detail)
return string(result)
})
m.Get("/device/ctrl/:serialnumber/:state" , func(params martini.Params) string {
detail := DeviceStateUpdate(params["serialnumber"] , params["state"])
result , _ := json.Marshal(detail)
return string(result)
})
如何使用Go语言实现远程执行命令一般命令
所谓一般命令,就是在一定时间内会执行完的命令 。比如 grep, cat 等等 。执行命令的步骤是:连接,执行,获取结果
连接
连接包含了认证,可以使用 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
addrstring
clientConfig *ssh.ClientConfig
client *ssh.Client
session *ssh.Session
errerror
)
// 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端口
执行,命令获取结果
连接成功后,执行命令很简单
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")
}
上面代码运行之后 , 虽然命令正常执行了,但是没有正常输出的结果 , 也没有异常输出的结果 。要想显示结果,需要将 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")
}
这样就能在屏幕上显示正常 , 异常的信息了 。
交互式命令
上面的方式无法远程执行交互式命令,比如 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 {
推荐阅读
- 怎么在excel表中打勾,怎样在excel表中打勾
- sqlserver代理无法启动服务,sqlserver2016代理服务无法启动
- 没有桌面图标的游戏叫什么,没有桌面图标的游戏叫什么游戏
- linux退出浏览器命令 linux如何退出view
- oracle配置文件导出,oracle配置文件tnsnames
- 360胎压安卓机安装,360胎压监测仪plus安装方法
- 视频号粉丝团级别是怎么算的,视频号粉丝牌是什么意思
- vb.net怎么创建 vbnet新建文件夹
- 变量改变没有触发js的简单介绍