V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  2Nfree  ›  全部回复第 1 页 / 共 1 页
回复总数  15
44 天前
回复了 eber 创建的主题 Go 编程语言 各位爹,请教一个 golang 的问题!
@2Nfree 用这个办法可以输入 sudo 的密码,之前写过一个模仿 ansiable 的程序是这么做的,里面部分代码:
package utils

import (
"batch-execution-tool/core"
"bytes"
"fmt"
"golang.org/x/crypto/ssh"
"os"
"sync"
)

func ExecuteScripts() {
var wg sync.WaitGroup
defer wg.Wait()
for _, ip := range core.Config.ServersIP {
wg.Add(1)
go func(ip string) {
defer wg.Done()
SSHClient, errSSH := createSSHConnect(ip)
if errSSH != nil {
core.Logger.Sugar().Errorf("创建 SSH 链接失败:\n%v", errSSH)
return
}
for _, script := range core.Config.Scripts {
for name := range script {
err := exec(SSHClient, ip, name)
if err != nil {
core.Logger.Sugar().Errorf("在 IP 地址为:%v 的服务器,出现错误:\n%v", ip, err)
} else {
core.Logger.Sugar().Debugf("在 IP 地址为:%v 的服务器,执行脚本 %v 成功", ip, name)
}
}
}
}(ip)
}
}

func exec(client *ssh.Client, ip, script string) error {
core.Logger.Sugar().Debugf("正在 IP 地址为:%v 的服务器中执行脚本:%s", ip, script)
session, err := client.NewSession()
if err != nil {
return err
}
var output bytes.Buffer
session.Stderr = &output
remoteDir := "scripts"
if core.Config.Auth.Username == "root" {
if err := session.Start("bash " + remoteDir + "/" + script + " > " + remoteDir + "/" + script + ".log"); err != nil {
return fmt.Errorf("执行脚本 %s 失败: \n%s:%s", script, err, output.String())
}
if err := session.Wait(); err != nil {
return fmt.Errorf("执行脚本 %s 失败: \n%s:%s", script, err, output.String())
}
} else {
if err := session.RequestPty("xterm", 80, 40, ssh.TerminalModes{}); err != nil {
return fmt.Errorf("请求 TTY 出错:%v ,\nos.Stderr:%v", err, os.Stderr)
}
stdin, err := session.StdinPipe()
defer stdin.Close()
if err != nil {
return fmt.Errorf("创建标准管道输出错误: \n%v", err)
}
if err := session.Start("sudo bash " + remoteDir + "/" + script + " > " + remoteDir + "/" + script + ".log"); err != nil {
return fmt.Errorf("执行脚本 %s 失败: \n%s:%s", script, err, output.String())
}
_, err = fmt.Fprintln(stdin, core.Config.Auth.Password)
if err != nil {
return fmt.Errorf("使用标准管道输如密码错误: \n%v", err)
}
if err := session.Wait(); err != nil {
return fmt.Errorf("执行脚本 %s 失败: \n%s:%s", script, err, output.String())
}
}
session.Close()
return nil
}
44 天前
回复了 eber 创建的主题 Go 编程语言 各位爹,请教一个 golang 的问题!
golang.org/x/crypto/ssh 包可以创建标准管道输出
用 session.StdinPipe()
calc time:2897.068977356
all time:6620.0299263%

arm64 7Cores 16G
2021-07-07 09:07:49 +08:00
回复了 2Nfree 创建的主题 MacBook Pro 现在的 M1 有能够安装 Centos 的办法么,除了使用 Docker
@clavichord93 哈哈
2021-07-06 14:34:44 +08:00
回复了 2Nfree 创建的主题 MacBook Pro 现在的 M1 有能够安装 Centos 的办法么,除了使用 Docker
@clavichord93 不过确实 PD 是个好软件但是开发商有点无良
2021-07-06 14:33:30 +08:00
回复了 2Nfree 创建的主题 MacBook Pro 现在的 M1 有能够安装 Centos 的办法么,除了使用 Docker
@clavichord93 UTM 我这边虚拟机安装不成,不知道为啥,UTM 的配置操作太繁琐了,效率的话我没太注意,一般我都是开一个 Ubuntu 加 Kali 使用,用着不卡,我的 mbp 配置 16+512 的
2021-07-05 16:20:58 +08:00
回复了 2Nfree 创建的主题 MacBook Pro 现在的 M1 有能够安装 Centos 的办法么,除了使用 Docker
@clavichord93 这两个虚拟机我都用过,PD 虚拟机安装某些版本的系统会存在无法安装虚拟机增强工具的情况,但是 VM 没有这种情况,但是使用起来还是 PD 会舒服一点,vm 不是原生支持 mac 的相关快捷键操作,例如我在 mac 中使用 command+c 复制,可以再 PD 中用 command+v 粘贴(前提是有虚拟机增强工具),但是 VM 无论如何都不行,这个增强工具就和没有一样,性能方面的话 VM 确实比 PD 好,是因为他在分配虚拟机资源的时候是一次分配完全,例如你分配了 4g 内存,你的虚拟机就使用 4g 但是 PD 的话是根据你用虚拟机的情况来,如果你不用的话会在后台休眠,不占用太多的内存,只能说各有各的好处
2021-07-02 09:22:51 +08:00
回复了 2Nfree 创建的主题 MacBook Pro 现在的 M1 有能够安装 Centos 的办法么,除了使用 Docker
@mp381 这个应该是 centos 架构的问题,不支持 M1 的 CPU 。。
2021-07-02 09:18:04 +08:00
回复了 2Nfree 创建的主题 MacBook Pro 现在的 M1 有能够安装 Centos 的办法么,除了使用 Docker
@clavichord93 您指的是 PD 虚拟机么
2021-06-30 16:27:34 +08:00
回复了 2Nfree 创建的主题 MacBook Pro 现在的 M1 有能够安装 Centos 的办法么,除了使用 Docker
@ElliotQi parallel 也不是全虚拟化,只有 VM 是全虚拟化 UTM 不知道,我这边 UTM 打不开。。
2021-06-30 10:36:21 +08:00
回复了 2Nfree 创建的主题 MacBook Pro 现在的 M1 有能够安装 Centos 的办法么,除了使用 Docker
@Damenly1 谢谢
@xuAN111 复现了,有点离谱
估计被修复了
为什么我的就不行??
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   811 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 36ms · UTC 22:32 · PVG 06:32 · LAX 15:32 · JFK 18:32
Developed with CodeLauncher
♥ Do have faith in what you're doing.