golang实现跨平台scp批量群发文件
来源:互联网 发布:cmd命令查看端口号 编辑:程序博客网 时间:2024/05/29 14:06
package mainimport ("bufio""flag""fmt""io""os""path/filepath""strings""github.com/czxichen/AutoWork/tools/split""golang.org/x/crypto/ssh")var (passwd = flag.String("p", "", "-p passwd 指定密码.")user = flag.String("u", "root", "-u root 指定登录用户.")cfg = flag.String("c", "serverlist", "-c serverlist 指定serverlist")ip_port = flag.String("i", "", "-i ip:port 指定目标机器的IP端口,必须和-p结合使用否则不生效.")dpath = flag.String("d", "", "-d /tmp/20160531.zip 指定发送到的路径,不能为空.")spath = flag.String("s", "", "-s 20160531.zip 指定要发送文件的路径,不能为空."))func main() {flag.Parse()if *dpath == "" || *spath == "" {flag.PrintDefaults()os.Exit(1)}File, err := os.Open(*spath)if err != nil {fmt.Println("打开文件失败:", err)os.Exit(1)}info, _ := File.Stat()defer File.Close()if *ip_port != "" && *passwd != "" {Client, err := dail(*user, *passwd, *ip_port)if err != nil {fmt.Printf("连接%s失败.\n", err)os.Exit(1)}scp(Client, File, info.Size(), *dpath)return}var list [][]stringok := (*passwd != "" && *ip_port == "")list = config(*cfg, ok)if len(list) <= 0 {fmt.Println("serverlist 不能为空.")os.Exit(1)}for _, v := range list {if ok {*ip_port = v[0]} else {*user = v[0]*passwd = v[1]*ip_port = v[2]}Client, err := dail(*user, *passwd, *ip_port)if err != nil {fmt.Printf("连接%s失败.\n", err)continue}scp(Client, File, info.Size(), *dpath)}}func dail(user, password, ip_port string) (*ssh.Client, error) {PassWd := []ssh.AuthMethod{ssh.Password(password)}Conf := ssh.ClientConfig{User: user, Auth: PassWd}return ssh.Dial("tcp", ip_port, &Conf)}func scp(Client *ssh.Client, File io.Reader, size int64, path string) {filename := filepath.Base(path)dirname := strings.Replace(filepath.Dir(path), "\\", "/", -1)defer Client.Close()session, err := Client.NewSession()if err != nil {fmt.Println("创建Session失败:", err)return}go func() {w, _ := session.StdinPipe()fmt.Fprintln(w, "C0644", size, filename)io.CopyN(w, File, size)fmt.Fprint(w, "\x00")w.Close()}()if err := session.Run(fmt.Sprintf("/usr/bin/scp -qrt %s", dirname)); err != nil {fmt.Println("执行scp命令失败:", err)session.Close()return} else {fmt.Printf("%s 发送成功.\n", Client.RemoteAddr())session.Close()}if session, err = Client.NewSession(); err == nil {defer session.Close()buf, err := session.Output(fmt.Sprintf("/usr/bin/md5sum %s", path))if err != nil {fmt.Println("检查md5失败:", err)return}fmt.Printf("%s 的MD5:\n%s\n", Client.RemoteAddr(), string(buf))}}func config(path string, ok bool) (list [][]string) {File, err := os.Open(path)if err != nil {fmt.Printf("打开配置文件失败:%s\n", err)os.Exit(1)}defer File.Close()buf := bufio.NewReader(File)for {line, _, err := buf.ReadLine()if err != nil {break}str := strings.TrimSpace(string(line))strs := split.Split(str)if ok {if len(strs) != 1 {continue}} else {if len(strs) != 3 {continue}}list = append(list, strs)}return}
1 0
- golang实现跨平台scp批量群发文件
- 批量scp文件脚本
- 批量SCP文件的脚本
- python scp 批量同步文件
- golang跨平台编译成arm平台文件
- Windows平台下golang使用LiteIDE实现跨平台编译
- CentOS sshpass+scp 批量传输文件
- golang跨平台编译
- Golang 跨平台编译
- 如何在domino平台上实现sftp批量上传文件
- golang 模拟登陆微信公众平台,突破微信群发每日一条限制
- yii2 批量群发邮件
- 微信公众平台开发之Java实现群发消息
- Golang跨平台交叉编译
- scp批量上传文件到多台机器上(升级版)
- ubuntu下scp批量拷贝文件不需输入密码
- ubuntu下scp批量拷贝文件不需要输入密码
- 通过scp批量推送文件到远程目录
- 51NOD 1262 扔球(欧拉函数)
- 外观模式实例之文件加密
- AngularJS input number 保留两位小数
- 文章标题
- 地理坐标系、大地坐标系与地图投影与重投影详解
- golang实现跨平台scp批量群发文件
- OC语言2-基础知识
- 函数调用缺少参数列表;请使用“&****Dlg::getThread”创建指向成员的指针”--多线程函数调用
- Android Service onStartCommand()介绍
- Trie树
- 练习3-L
- OC 中类的声明和定义
- Dockerfile 示例一:创建一个MongoDB的镜像
- 企业设备管理的十大症结