Content Table

Mac 终端打造

Mac 的终端打造主要综合使用 iTerm + Shuttle + Expect 这三个软件:

  • iTerm: 替代系统自带的 Terminal
  • Shuttle: 为快捷命令菜单,点击后在 iTerm 中执行相应的命令,可用于管理常用命令和管理 SSH 主机
  • Expect: masOS 自带了 Expect,可实现 SSH 自动登录

iTerm

iTerm 可匹配内容进行高亮显示、按下快捷键后窗口从屏幕上方滚动下来,请参考 iTerm 设置

如下图设置配置 iTerm 的主题,请参考 Mac Terminal Powerlevel

Shuttle

iTerm 的 Profile 可以管理 SSH 主机,但是不够方便,可以使用 Shuttle 来分目录管理,并且 Shuttle 还可以用来管理一些常用命令,点击后就在 iTerm 里打开新标签页进行执行。

请参考 Shuttle 使用

带多级目录的配置参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
{
"_comments": [
"Valid terminals include: 'Terminal.app' or 'iTerm'",
"In the editor value change 'default' to 'nano', 'vi', or another terminal based editor.",
"Hosts will also be read from your ~/.ssh/config or /etc/ssh_config file, if available",
"For more information on how to configure, please see http://fitztrev.github.io/shuttle/"
],
"editor": "default",
"launch_at_login": false,
"terminal": "iTerm",
"iTerm_version": "nightly",
"default_theme": "Default",
"open_in": "tab",
"show_ssh_config_hosts": false,
"ssh_config_ignore_hosts": [],
"ssh_config_ignore_keywords": [],
"hosts": [
{
"Newdt SSH": [
{
"name": "K8S-1.73",
"cmd": "ssh root@192.168.1.73"
},
{
"name": "CloudQuery",
"cmd": "ssh root@192.168.12.130"
}
],
"Private": [
{
"name": "VPN Server",
"cmd": "ssh root@101.43.189.11"
},
{
"name": "JianZhong",
"cmd": "ssh root@118.195.181.11"
}
],
"快捷命令": [
{
"name": "项目管理",
"cmd": "open /Users/biao/Documents/公司文档/项目管理"
}
]
}
]
}

Expect

当我们使用 Shuttle 把 SSH 主机管理起来后,点击进行 ssh 登录时,还需要手动输入密码才行。借助 Expect 可以实现 SSH 自动登录,可参考 SSH 自动登录

把下面的脚本保存为 /usr/local/bin/ssh.exp 并为其加上可执行权限 chmod +x /usr/local/bin/ssh.exp,这个脚本接收 3 个参数: 用户名、远程主机 IP、密码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/expect

# 第三个参数为端口,缺省为 22
# ssh.exp root@192.168.10.173 password
# ssh.exp root@192.168.10.173 password 22

set port 22
set user_host [lindex $argv 0]
set password [lindex $argv 1]

if { $argc == 3 } {
set port [lindex $argv 2]
}

set timeout 30
spawn ssh -p $port $user_host
expect {
"(yes/no)?" { send "yes\n"; exp_continue }
"password:" { send "$password\n" }
}

interact

然后修改 Shuttle 中 SSH 主机登录的命令为:

1
2
3
4
5
6
7
8
{
"name": "VPN Server-1",
"cmd": "ssh.exp root@101.43.189.11 Passw0rd"
},
{
"name": "VPN Server-2",
"cmd": "ssh.exp root@101.43.189.12 'P@ssw0rd'"
},

点击执行 ssh 命令时不再需要我们手动输入密码了,Expect 会帮助我们自动输入密码。

提示: 如果密码中有特殊字符,需要把密码用引号引起来。