逐渐偷懒的 SSH 技巧

SSH 对于我这个半路出家的野鸡运维来说,几乎是最常用的工具。

但随着时间的积累,手上维护的机器越来越多,以往的 SSH 使用习惯逐渐吃力。

我需要一些简单的办法来帮我更好地偷懒使用 SSH。

配置 SSH config

最早用上的,肯定还是 SSH config 了。

~/.ssh 目录下建立一个新的文件 config,然后在里面写入机器的配置就可以了,比如这样:

1
2
3
4
5
6
# Server 1
Host ifrit
HostName a.b.c.d
Port 22
User root
IdentityFile ~/.ssh/id_rsa

保存后,我以后连这台机器只需要键入 ssh ifrit 就可以直接连上了,不需要去记各个机器的 IP、端口,十分方便。

另外在配置文件的最后加入这么一段:

1
2
3
# Default
Host *
User root

这样一般用 root 用户 SSH 登录没有写在配置里的机器,可以直接 ssh your_server,省去了输入 username@ 的事。

分发 SSH config

作为一个运维,手上有多台终端设备,这不难理解吧。

但是每次 SSH config 更新后,所有的设备都需要更新。

不论是手动修改各自的 config 文件,还是将文件拷到各自设备里,都相对繁琐。

一旦哪次忘记,就会出现配置之间信息脱节,给我带来麻烦。

考虑到我管理的设备都只能通过公私钥免密登录,config 文件除了我的设备 IP、用户名及端口外,再也没有其他有用的信息,决定将 config 使用 GitHub 来进行分发。

当然为了保险起见,还是建立了一个私有仓库。

这样每次有更新后,同步到 Repo 中,然后其他设备再 Pull 下载替换到相应位置即可。

顺手写了个脚本,每次运行脚本即可达成目的。

1
2
3
4
5
6
#!/bin/sh

SHELL_FOLDER=$(cd "$(dirname "$0")";pwd)
cd $SHELL_FOLDER
git pull
cp ./config ~/.ssh/config

再进一步偷懒

虽然 SSH config 文件能帮我省了很多事,但是维护的机器也有常用和不常用之分。

偶尔会出现冷门的机器忘记了 config 文件里设置的 Host 是啥,还要手动打开 config 文件看。

这就一点也不偷懒了。

于是为了以后更好偷懒,我使用搜索引擎在互联网上翻箱倒柜,写了个脚本。

脚本界面

脚本也很简单:

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
#!/bin/bash

RED="\033[31m" # Error message
GREEN="\033[32m" # Success message
YELLOW="\033[33m" # Warning message
BLUE="\033[36m" # Info message
PLAIN='\033[0m'

clear
echo "#############################################################"
echo -e "# ${BLUE}选择要连接的设备${PLAIN} #"
echo -e " ${GREEN}1. your_server1_info${PLAIN}"
echo -e " ${GREEN}2. your_server2_info${PLAIN}"
echo -e " ${GREEN}3. your_server3_info${PLAIN}"

read -p " 请选择操作[0-3]:" answer
case $answer in
0)
exit 0
;;
1)
ssh your_server1
;;
2)
ssh your_server2
;;
3)
ssh your_server3
;;
*)
colorEcho $RED " 请选择正确的操作!"
exit 1
;;
esac

有新的直接照着添加就行了。

因为有配置过 SSH config,所以这里执行的操作全部都是在 SSH config 里配置的。

再再进一步偷懒

既然都偷懒了,那干脆偷懒到底好了。

每次找位置运行脚本也很烦,干脆加个 alias 算了。

因为我终端设备都在 Zsh,所以只需要往 ~/.zshrc 加一条 alias,这样每次初始化 Zsh 时就会加上这条 alias。

修改下分发 SSH config 的脚本:

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
#!/bin/sh

SHELL_FOLDER=$(cd "$(dirname "$0")";pwd)
cd $SHELL_FOLDER
git pull
cp ./config ~/.ssh/config

cd ~
FIND_ZSH_FILE="./.zshrc"
FIND_BASH_FILE="./.bashrc"
FIND_STR1="sshconfig.sh"
FIND_STR2="sshchoice.sh"
if [ ! -f $FIND_ZSH_FILE ]; then
exit 1
elif [ `grep -c "$FIND_STR1" $FIND_ZSH_FILE` -eq '0' ];then
echo "alias sshconfig='$SHELL_FOLDER/sshconfig.sh'" >> ./.zshrc
fi
if [ ! -f $FIND_ZSH_FILE ]; then
exit 1
elif [ `grep -c "$FIND_STR2" $FIND_ZSH_FILE` -eq '0' ];then
echo "alias ssc='$SHELL_FOLDER/sshchoice.sh'" >> ./.zshrc
fi
if [ `grep -c "$FIND_STR1" $FIND_BASH_FILE` -eq '0' ];then
echo "alias sshconfig='$SHELL_FOLDER/sshconfig.sh'" >> ./.bashrc
fi
if [ `grep -c "$FIND_STR2" $FIND_BASH_FILE` -eq '0' ];then
echo "alias ssc='$SHELL_FOLDER/sshchoice.sh'" >> ./.bashrc
fi

首次运行时会检查 Zsh 及 Bash 的配置文件里是否有对应的 alias,没有则添加,有则不管。

然后重新初始化一下对应的 Shell,或者直接退出再进,即可生效了。

键入 sshconfig 即可更新 SSH config 文件,键入 ssc 即可查看、选择要连接的设备了。

结语

其实设备的管理,现在市场上有很多专门的工具,很全面,也很方便。

但是出于对命令行及终端的喜爱,我还是更喜欢这种古早的方式。