go语言可以交互式吗 go语言能够替代c语言吗( 二 )


1.它可以在一台计算机上用几秒钟的时间编译一个大型的Go程序 。
2.Go语言为软件构造提供了一种模型,它使依赖分析更加容易,且避免了大部分C风格include文件与库的开头 。
3.Go语言是静态类型的语言,它的类型系统没有层级 。因此用户不需要在定义类型之间的关系上花费时间 , 这样感觉起来比典型的面向对象语言更轻量级 。
4.Go语言完全是垃圾回收型的语言,并为并发执行与通信提供了基本的支持 。
按照其设计,Go打算为多核机器上系统软件的构造提供一种方法 。
Go语言是一种编译型语言,它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性 。它也打算成为现代的,支持网络与多核计算的语言 。要满足这些目标,需要解决一些语言上的问题:一个富有表达能力但轻量级的类型系统,并发与垃圾回收机制,严格的依赖规范等等 。这些无法通过库或工具解决好,因此Go也就应运而生了 。
如何使用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
)
【go语言可以交互式吗 go语言能够替代c语言吗】// 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)

推荐阅读