gossh 是一个使用 go 语言开发的极度简洁的 ssh 工具,只有一个二进制程序,无任何依赖,真正开箱即用。用于远程管理 linux(类 unix)机器:包括远程执行命令和推拉文件,支持单机和批量模式。
gossh 提供 3 种核心功能:
gossh 支持单机模式和批量并行模式,也就是可以一次向一台机器发送命令执行,也可以一次向成千上万台台机器批量发送命令。批量并行模式也是gossh 最大的一个特点,充分利用go在并发执行方面的优势。
可以通过 -i 参数指定 ip 文件,通过 -c 指定并发度。 批量并行模式同样支持上文说的三种功能:远程执行命令,推送文件或者目录,拉取文件。
并行模式下没有提供出错退出的原因是,并行执行下,很难立即停止整个任务的执行,串行模式比较容易控制,在日常使用中,可以先使用串行模式验证功能,然后开启并行模式提升效率。
1.源码编译。
- # 需要有go编译环境
- cd $GOPATH/src && git clone https://github.com/andesli/gossh.git
- cd gossh
-
- //gossh工具
- go build gossh.go
-
- //密码加解密工具
- go build passtool.go
-
- //编译脚本编译amd64 386体系结构下windows和linux版本,放到./bin目录下,如果有其他体系结构需要使用也可以修改脚本执行编译。
- ./build.sh
-
-
2.如果不想从源码编译,编译好的二进制程序放bin/目录下。
得益于go语言优秀的跨平台特性,在./bin下已经为大家生成了amd64和386体系结构下windows和linux共计4个版本程序。
- bin
- |-- 386
- | |-- linux
- | | |-- gossh
- | | `-- passtool
- | `-- windows
- | |-- gossh.exe
- | `-- passtool.exe
- `-- amd64
- |-- linux
- | |-- gossh
- | `-- passtool
- `-- windows
- |-- gossh.exe
- `-- passtool.exe
-
gossh
- #gossh -h
- flag needs an argument: -h
- Usage of gossh:
-
- -t string
- running mode: cmd|push|pull (default "cmd")
- 运行模式:cmd 远程执行命令,默认值;push 推送文件到远程; pull拉取远程文件到本地。
-
- -h string
- ssh ip
-
- -P string
- ssh port (default "22")
- ssh端口
-
- -u string
- ssh user (default "root")
- ssh用户名
-
- -p string
- ssh password
- 密码
-
- -i string
- ip file when batch running mode (default "ip.txt")
- 批量执行是指定ip文件,有关文件格式见下文。
-
- -c int
- the number of concurrency when b (default 30)
- 批量并发执行的并发度,默认值是30,如果指定为1,gossh是串行执行。
-
- -s if -s is setting, gossh will exit when error occurs
- -s是个bool型,只有到-c被指定为1时才有效,用来控制串行执行报错后是否立即退出。
-
- -e password is Encrypted
- 如果密码传递的是密文,使用-e标记。-e适用于通过-p传递的密码和-i 指定的文件中存放的密码字段。
-
- -key string
- aes key for password decrypt and encryption
- 密码加解密使用的key,gossh有一个默认的加密key,可以通过-key=xxx指定一个加解密的key. passtool密码加解密工具同样支持该-key选项.
-
- -f force to run even if it is not safe
- 如果遇到危险命令gossh默认是不执行,危险命令目前收录的有("rm", "mkfs", "mkfs.ext3", "make.ext2", "make.ext4", "make2fs", "shutdown", "reboot", "init", "dd"),可以通过-f强制执行,-f 是bool型参数,不指定默认为false。
-
- -s if -s is setting, gossh will exit when error occurs
- 如果-c=1,即并发度为1串行执行时,默认出错后会退出,使用-s标记不要退出,继续执行,在-c>1时,无论是否指定-s都不会出错退出。
-
- -l string
- log level (debug|info|warn|error (default "info")
- 日志级别
-
- -logpath string
- logfile path (default "./log/")
- 日志存放目录,默认是./log/
-
-
passtool 密码工具
- ./passtool -h
- Usage of ./passtool:
- -d 指定密码密文生成明文
- -e 指定密码明文生成密文
- -key string
- AES加密密钥
-
-i ipfile 指定批量操作的 ip文件,ipfile 文件每行有 4 个字段 ip|port|user|password,字段之间使用|分隔,四个字段分别是:机器 IP,ssh 端口,ssh 用户名,ssh 密码。其中 ip 字段是必须的,其他三个字段是选填的。 下面的配置都是合法的。
- ip|port|user|password
- ip|port|user|
- ip|port|user
- ip|port|
- ip|port
- ip|
- ip
-
如果没有提供可选字段,gossh 默认通过 -u -p -P 参数从命令行参数获取,如果没有指定命令行参数,默认取命令行参数的默认值。 gossh 当前参数的默认值:
- -u 默认值是root
- -P 默认值是22
- -p 默认值是空
- -t 默认值是cmd
-
-
说明
gossh 不是重复制造一个像 ansible 的轮子,gossh 的核心目标是提供给运维人员一个极度简洁的ssh工具,方便运维人员远程批量并行的初始化和管理机器。
有很多同学说 ansible 已经够好的了,为什么还要搞 gossh?这是一个误区,请问 ansible 怎么批量安装到机器上?python 环境怎么批量安装?这里有一个 先有鸡还是先有蛋 的问题,gossh 就是第一个会下蛋的鸡。gossh 使用 go 语言开发,静态编译为二进制程序,只要你的机器有 ssh 环境,并且能密码可以登录,理论上都能使用 gossh 进行管理。
gossh 核心目标就是解决机器交付后 最初一公里-机器初始化的工作。此时机器除了 ssh,可能没有任何其他运行环境,此时通过 gossh 能够方便的快速的初始化机器。比如安装 python,mysql 等。
即便大公司在每个服务器上部署自研的 agent,统一平台管理所有的服务器,但是也不能保证管理平台整个链路容灾高可用,gossh 至少提供了一条备用的链路,能够在运维平台出问题的情况下,以闪电般的速度解决问题,从这个角度说,保留 gossh 这个最简单的通道,也算为运维人员提供一条消防通道。
当然 gossh 也提供了扩展,可以方便进行二次开发,将其改造为远程执行引擎,集成到公司的自动化系统中。
gossh 目标
1.第一阶段目标是提供一个极简、好用、无任何依赖、可并发执行的ssh命令行工具。
2.第二阶段目标是是实现一个高度可集成的远程执行引擎,对外提供API服务,完善点对点的文件传递功能,很大概率不会在现有的gossh程序上改造,避免 gossh 变的臃肿,而是提供一个 gossh2 或者 gosshweb 的工具,专门做这件事情,遵照go的哲学,少即是多,一次只做一件事情。
现阶段之关注第一阶段目标,第二阶段目标还在酝酿中。
github 地址:https://github.com/andesli/gossh