Skip to content

Commit dd6cbeb

Browse files
authored
Merge pull request #17 from mritd/develop
v1.4.0
2 parents a1f4310 + 8555ebc commit dd6cbeb

24 files changed

+391
-489
lines changed

Makefile

+2
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,5 @@ install:
2828
.EXPORT_ALL_VARIABLES:
2929

3030
GO111MODULE = on
31+
GOPROXY = https://goproxy.io
32+
GOSUMDB = sum.golang.google.cn

README.md

+43-42
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
55
### 安装
66

7-
可直接从 [release](https://github.com/mritd/mmh/releases) 页下载预编译的二进制文件,然后执行 `mmh install` (需要root 权限,自动请求 `sudo`)即可;卸载直接执行 `mmh uninstall`,卸载命令不会删除 `~/.mmh` 配置目录。
7+
可直接从 [release](https://github.com/mritd/mmh/releases) 页下载预编译的二进制文件,然后执行 `mmh install` (需要root 权限,自动请求 `sudo`)即可;
8+
卸载直接执行 `mmh uninstall`,卸载命令不会删除 `~/.mmh` 配置目录。
89

910
**默认安装到 `/usr/bin` 目录下,如果受权限限制无法安装,请使用 `--dir` 选项指定其他安装目录**
1011

@@ -26,7 +27,9 @@ Available Commands:
2627
go Login single server
2728
help Help about any command
2829
install Install mmh
30+
ping Ping server
2931
server Server command
32+
tun SSH tunnel
3033
uninstall Uninstall mmh
3134
version Print version
3235

@@ -43,6 +46,8 @@ Use "mmh [command] --help" for more information about a command.
4346
- `mmh cp` ==> `mcp`
4447
- `mmh server` ==> `mcs`
4548
- `mmh ctx` ==> `mcx`
49+
- `mmh ping` ==> `mping`
50+
- `mmh tun` ==> `mtun`
4651

4752
### 配置文件
4853

@@ -61,62 +66,56 @@ Use "mmh [command] --help" for more information about a command.
6166

6267
``` yaml
6368
basic: default
69+
current: test
6470
contexts:
6571
- name: default
66-
config_path: ./default.yaml
67-
- name: dohko
68-
config_path: ./dohko.yaml
69-
current: dohko
72+
config_path: /Users/mritd/MEGA/mmh/default.yaml
73+
- name: test
74+
config_path: test.yaml
7075
```
7176
72-
主配置文件中可以配置多个 `context`,由 `current` 字段指明当前使用哪个 `context`, `basic` 设置的 `context` 会作为额外补充服务器加入 `current` 指明的 `context` 中;**`basic` 适用于存放一些常规服务器,比如个人的 vps 等,以保证在任何 `context` 都可以访问这些服务器。**
77+
主配置文件中可以配置多个 `context`,由 `current` 字段指明当前使用哪个 `context`, `basic` 设置的 `context` 会作为
78+
额外补充服务器加入 `current` 指明的 `context` 中;**`basic` 适用于存放一些常规服务器,比如个人的 vps 等,以保证在任
79+
何 `context` 都可以访问这些服务器。**`config_path` 字段可以是绝对路径,也可以为相对路径,**相对路径默认位置为 `~/.mmh` 目录**
7380

7481
#### default.yaml
7582

7683
这个是真正的 SSH 配置,一般情况下其与对应的 `context` 名称相同;该配置文件样例如下
7784

7885
``` yaml
7986
basic:
80-
user: root
81-
password: ""
82-
privatekey: /Users/mritd/.ssh/id_rsa
83-
privatekey_password: ""
84-
port: 22
85-
server_alive_interval: 0s
86-
servers:
87-
- name: prod11
88-
tags:
89-
- prod
90-
user: root
91-
password: password
92-
privatekey: ""
93-
privatekey_password: ""
94-
address: 10.10.4.11
95-
port: 22
96-
proxy: prod12
97-
server_alive_interval: 20s
98-
- name: prod12
99-
tags:
100-
- prod
101-
user: root
10287
password: ""
103-
privatekey: /Users/mritd/.ssh/id_rsa
104-
privatekey_password: password
105-
address: 10.10.4.12
10688
port: 22
89+
private_key: /Users/mritd/.ssh/id_rsa
90+
private_key_password: ""
10791
proxy: ""
108-
server_alive_interval: 10s
92+
user: root
93+
max_proxy: 5
94+
servers:
95+
- name: nginx
96+
address: 172.16.1.10
97+
tags: ["docker"]
98+
- name: gitlab
99+
address: 172.16.1.101
100+
tags: ["docker"]
101+
port: 2222
102+
- name: wiki
103+
address: 172.16.1.104
104+
tags: ["docker"]
109105
tags:
110-
- prod
106+
- k8s
107+
- docker
111108
```
112109

113-
`basic` 段为默认配置,用于在 `servers` 段中某项配置不存在时进行填充;`servers` 段中可以配置 N 多个服务器(`server`);每个 `server` 除了常规的 SSH 相关配置外还增加了 `proxy` 字段用于支持无限跳板(具体见下文);`tag` 字段必须存在于在下面的 `tags` 段中,该配置主要是为了给服务器打 `tag` 方便批量复制与执行;`maxproxy` 是一个数字,用于处理当出现配置错误导致 "真·无限跳板" 情况时自动断开链接;`server_alive_interval` 用于实现保持链接。
110+
`basic` 段为默认配置,用于在 `servers` 段中某项配置不存在时进行填充;`servers` 段中可以配置 N 多个服务器(`server`);
111+
每个 `server` 除了常规的 SSH 相关配置外还增加了 `proxy` 字段用于支持无限跳板(具体见下文);`tag` 字段必须存在于在下面的
112+
`tags` 段中,该配置主要是为了给服务器打 `tag` 方便批量复制与执行;`max_proxy` 是一个数字,用于处理当出现配置错误导致
113+
"真·无限跳板" 情况时自动断开链接;`server_alive_interval` 用于实现保持链接。
114114

115115

116116
### 自动登录
117117

118-
可以使用 `mgo SERVER_NAME` 直接登录,如需交互式登录可执行 `mmh` 即可;其他相关命令如 `mms ls/add/del`
119-
都与添加修改服务器配置相关,请自行尝试:
118+
可以使用 `mgo SERVER_NAME` 直接登录,如需交互式登录可执行 `mmh` 即可
120119

121120
![mmh](img/mmh.gif)
122121

@@ -127,7 +126,7 @@ tags:
127126
如果 C 的 `proxy` 设置为 B,同时 B 的 `proxy` 设置为 A,那么实际在登录 C 时,工具实际连接顺序为: `local->A->B->C`
128127

129128
**不要去尝试循环登录,比如 `A->B->C->A` 这种配置,工具内部已经做了检测防止产生这种 "真·无限跳板" 的情况,
130-
默认最大跳板机数量被限制为 5 台,可通过在配置文件中增加 `maxProxy` 字段进行调整**
129+
默认最大跳板机数量被限制为 5 台,可通过在配置文件中增加 `max_proxy` 字段进行调整**
131130

132131
### 管道式批量执行
133132

@@ -160,7 +159,7 @@ Flags:
160159
### 批量复制
161160

162161
为了尽量方便使用,模仿了一下 `scp` 命令,增加了批量复制功能 `mcp`;批量复制支持 **本地到远端多机器的文件/目录批量复制** 和
163-
**单一远端机器到本地的文件/目录复制**;
162+
**单一远端机器到本地的文件/目录复制**;当指定 `-g` 选项时,则会类似 `mec` 命令一样向目标 `tag` 的一组服务器发起复制
164163

165164
```sh
166165
➜ ~ mcp --help
@@ -174,9 +173,9 @@ Aliases:
174173
cp, mcp
175174
176175
Flags:
177-
-r, --dir useless flag
178-
-h, --help help for cp
179-
-s, --single single server
176+
-r, --dir useless flag
177+
-g, --group multi-server copy
178+
-h, --help help for cp
180179
```
181180

182181
**注意: 批量复制并不可靠,请谨慎使用;并非说代码不可靠,只是相对来说对于登录等功能,即使工具出问题,也很难造成灾难性后果;
@@ -186,7 +185,9 @@ Flags:
186185

187186
### 多环境切换
188187

189-
考虑到同时将多个环境的配置放在同一个配置文件中会有混乱,同时也可能出现误操作的情况,`v1.3.0` 版本增加了 `context` 的概念;每个 `context` 被认为是一种环境,比如 `prod`、`test`、`uat` 等,每个环境的机器配置被分成了独立的文件以方便单独修改与加载;控制使用哪个 `context` 可以使用 `mcx set CONTEXT_NAME` 命令
188+
考虑到同时将多个环境的配置放在同一个配置文件中会有混乱,同时也可能出现误操作的情况,`v1.3.0` 版本增加了 `context` 的概念;
189+
每个 `context` 被认为是一种环境,比如 `prod`、`test`、`uat` 等,每个环境的机器配置被分成了独立的文件以方便单独修改与加载;
190+
控制使用哪个 `context` 可以使用 `mcx set CONTEXT_NAME` 命令
190191

191192
``` sh
192193
➜ ~ mcx --help

cmd/cp.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"github.com/spf13/cobra"
66
)
77

8-
var singleCPServer bool
8+
var groupServer bool
99
var copyDir bool
1010
var cpCmd = &cobra.Command{
1111
Use: "cp [-r] FILE/DIR|SERVER_TAG:PATH SERVER_NAME:PATH|FILE/DIR",
@@ -17,13 +17,13 @@ Copies files between hosts on a network.`,
1717
if len(args) < 2 {
1818
_ = cmd.Help()
1919
} else {
20-
mmh.Copy(args, singleCPServer)
20+
mmh.Copy(args, groupServer)
2121
}
2222
},
2323
}
2424

2525
func init() {
2626
RootCmd.AddCommand(cpCmd)
27-
cpCmd.PersistentFlags().BoolVarP(&singleCPServer, "single", "s", false, "single server")
27+
cpCmd.PersistentFlags().BoolVarP(&groupServer, "group", "g", false, "multi-server copy")
2828
cpCmd.PersistentFlags().BoolVarP(&copyDir, "dir", "r", false, "useless flag")
2929
}

cmd/exec.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
"github.com/spf13/cobra"
88
)
99

10-
var singleExecServer bool
10+
var singleServer bool
1111
var execCmd = &cobra.Command{
1212
Use: "exec SERVER_TAG CMD",
1313
Aliases: []string{"mec"},
@@ -19,12 +19,12 @@ Batch exec command.`,
1919
_ = cmd.Help()
2020
} else {
2121
cmd := strings.Join(args[1:], " ")
22-
mmh.Exec(args[0], cmd, singleExecServer)
22+
mmh.Exec(args[0], cmd, singleServer, false)
2323
}
2424
},
2525
}
2626

2727
func init() {
2828
RootCmd.AddCommand(execCmd)
29-
execCmd.PersistentFlags().BoolVarP(&singleExecServer, "single", "s", false, "single server")
29+
execCmd.PersistentFlags().BoolVarP(&singleServer, "single", "s", false, "single server")
3030
}

cmd/install.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@ Install mmh.`,
1717
}
1818

1919
func init() {
20-
installCmd.PersistentFlags().StringVar(&installDir, "dir", "/usr/bin", "install dir")
20+
installCmd.PersistentFlags().StringVar(&installDir, "dir", "/usr/local/bin", "install dir")
2121
RootCmd.AddCommand(installCmd)
2222
}

cmd/ping.go

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package cmd
2+
3+
import (
4+
"github.com/mritd/mmh/mmh"
5+
"github.com/spf13/cobra"
6+
)
7+
8+
var pingCmd = &cobra.Command{
9+
Use: "ping SERVER_NAME",
10+
Aliases: []string{"mping"},
11+
Short: "Ping server",
12+
Long: `
13+
Ping server.`,
14+
Run: func(cmd *cobra.Command, args []string) {
15+
if len(args) == 1 {
16+
mmh.Ping(args[0])
17+
} else {
18+
_ = cmd.Help()
19+
}
20+
},
21+
}
22+
23+
func init() {
24+
RootCmd.AddCommand(pingCmd)
25+
}

cmd/server.go

+1-25
Original file line numberDiff line numberDiff line change
@@ -16,30 +16,6 @@ Server command.`,
1616
},
1717
}
1818

19-
var serverAddCmd = &cobra.Command{
20-
Use: "add",
21-
Short: "Add ssh server",
22-
Long: `
23-
Add ssh server.`,
24-
Run: func(cmd *cobra.Command, args []string) {
25-
mmh.AddServer()
26-
},
27-
}
28-
29-
var serverDelCmd = &cobra.Command{
30-
Use: "del SERVER1 SERVER2...",
31-
Short: "Delete ssh server",
32-
Long: `
33-
Delete ssh server.`,
34-
Run: func(cmd *cobra.Command, args []string) {
35-
if len(args) > 0 {
36-
mmh.DeleteServer(args)
37-
} else {
38-
_ = cmd.Help()
39-
}
40-
},
41-
}
42-
4319
var serverListCmd = &cobra.Command{
4420
Use: "ls [SERVER_NAME]",
4521
Short: "List ssh server",
@@ -55,6 +31,6 @@ List ssh server.`,
5531
}
5632

5733
func init() {
58-
serverCmd.AddCommand(serverAddCmd, serverDelCmd, serverListCmd)
34+
serverCmd.AddCommand(serverListCmd)
5935
RootCmd.AddCommand(serverCmd)
6036
}

cmd/tun.go

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package cmd
2+
3+
import (
4+
"github.com/mritd/mmh/mmh"
5+
"github.com/spf13/cobra"
6+
)
7+
8+
var tunLocalAddr, tunRemoteAddr string
9+
10+
var tunCmd = &cobra.Command{
11+
Use: "tun SERVER_NAME",
12+
Aliases: []string{"mtun"},
13+
Short: "SSH tunnel",
14+
Long: `
15+
SSH tunnel.`,
16+
Run: func(cmd *cobra.Command, args []string) {
17+
if len(args) == 1 {
18+
mmh.Tunnel(args[0], tunLocalAddr, tunRemoteAddr)
19+
} else {
20+
_ = cmd.Help()
21+
}
22+
},
23+
}
24+
25+
func init() {
26+
tunCmd.Flags().StringVarP(&tunLocalAddr, "local", "l", "", "local address")
27+
tunCmd.Flags().StringVarP(&tunRemoteAddr, "remote", "r", "", "local address")
28+
_ = tunCmd.MarkFlagRequired("local")
29+
_ = tunCmd.MarkFlagRequired("remote")
30+
RootCmd.AddCommand(tunCmd)
31+
}

cmd/uninstall.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@ Uninstall mmh.`,
1717
}
1818

1919
func init() {
20-
uninstallCmd.PersistentFlags().StringVar(&uninstallDir, "dir", "/usr/bin", "uninstall dir")
20+
uninstallCmd.PersistentFlags().StringVar(&uninstallDir, "dir", "/usr/local/bin", "uninstall dir")
2121
RootCmd.AddCommand(uninstallCmd)
2222
}

go.mod

+8-11
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
11
module github.com/mritd/mmh
22

3+
go 1.13
4+
35
require (
46
github.com/fatih/color v1.7.0
5-
github.com/inconshreveable/mousetrap v1.0.0 // indirect
6-
github.com/kr/pretty v0.1.0 // indirect
7-
github.com/mattn/go-colorable v0.0.9 // indirect
8-
github.com/mattn/go-isatty v0.0.4 // indirect
9-
github.com/mitchellh/go-homedir v1.0.0
10-
github.com/mritd/promptx v0.0.0-20181104120837-d3bd32bd6d64
7+
github.com/mattn/go-colorable v0.1.2 // indirect
8+
github.com/mattn/go-isatty v0.0.9 // indirect
9+
github.com/mitchellh/go-homedir v1.1.0
10+
github.com/mritd/promptx v0.0.0-20190919142911-51b6aa75496f
1111
github.com/mritd/sshutils v0.0.0-20190114085520-a41b046f5b5c
12-
github.com/spf13/cobra v0.0.3
13-
github.com/spf13/pflag v1.0.3 // indirect
14-
golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85
15-
golang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35 // indirect
16-
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
12+
github.com/spf13/cobra v0.0.5
13+
golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7
1714
gopkg.in/yaml.v2 v2.2.2
1815
)

0 commit comments

Comments
 (0)