SSH客户端对于很多IT从业人员都是必备,然而很多人仅仅是用了最基本的功能。当遇到了比如RSA Key等安全措施时,不能有效利用客户端,繁琐的操作流程影响了他们的工作热情。本文就简单说明一下SSH客户端的功能,帮助大家保持高效的开发工作。

##1. 基本连接功能(端口,用户,ssh-keygen,authrorized_keys) 一个基本的ssh是这么使用的:

ssh 192.168.1.16

命令会连接192.168.1.16机器的22端口,并且使用当前机器登录的用户名称去登录。大多数情况下目标机器的用户名称都不会是你当前电脑的用户名称,所以一般需要用ssh 用户名@ip的方式去使用。

此外目前在公网的机器大多都会遇到蠕虫不断搜索ssh的端口号然后用密码字典crack的情况,因此大多机器的ssh端口号都会改到30000已上,比如36022端口。这种情况就需要指定ssh命令的端口号:

ssh -p 36022 dev@192.168.1.16

到目前为止,我们已经可以自由登录服务器了。但是我们发现每次都要输入密码,是个很麻烦的事情;能不能不输入密码登录呢?当然可以,我们可以执行ssh-keygen命令,可以一路回车,默认会在~/.ssh/下生成两个文件,id_rsa和id_rsa.pub文件,其中id_rsa是私钥,任何情况下你都不需要把这个文件给其他人;而id_rsa.pub是公钥,给谁都无所谓。然后通过正常的ssh登录到目标服务器,将id_rsa.pub的内容附加到目标机器目标用户的~/.ssh/authorized_keys文件里的单独一行,要保证~/.ssh目录的权限是700,authorized_keys的权限是600。然后再试一试,这次是不是不用密码了?

##2. ssh config(保持链接,自动跳转)

然而你会发现每次都输入用户名ip地址,真是烦。ssh也想到了,提供了ssh_config(位置~/.ssh/config)。

一个常见的配置如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Host jumper
    HostName jumper
    User dev
    Port 36022
    IdentityFile ~/.ssh/jumper
    ForwardAgent yes
    ServerAliveInterval 60
    ControlMaster auto
    ControlPath /tmp/ssh_mux_%h_%p_%r
    ControlPersist 4h

第一行表示你ssh时的配置名,像这个配置只要ssh jumper即可;HostName是实际连接时使用的ip、机器名称,这个需要是本地ping得通的机器名;User是待连接的用户名;Port是ssh连接的端口号;IdentityFile是刚才所说的私钥文件;ForwardAgent可以持有通过验证的本地的key——如果你的登录是双因子的,它可以持用通过双因子验证或者输入了passphrase 的key,简化之后的登录行为;ServerAliveInterval用于保持ssh的连接,避免长时间不动作被服务器断开;ControlMaster则是开启了一个控制器,ControlPath是控制连接的保持文件,ControlPersist表示保持文件存活时间,如果第一次ssh之后,再次ssh同一台主机,ssh可以利用之前的连接文件,避免了二次登录,当然也不需要密码。

上边这个配置文件通常是登录跳板机时使用的,然而我们每次都需要先ssh跳板机,然后在跳板机再去ssh目标服务器,实在是不方便。能不能从本地直接通过sshconfig就登录目标服务器呢?当然是可以的啦。

1
2
3
4
5
Host server-1 server-2 server-3
    HostName %h
    User dev
    ProxyCommand ssh jumper nc %h %p
    IdentityFile ~/.ssh/server

Host自然还是我们ssh时的名称,但是HostName是个变量,表示我们ssh的实际地址是上边Host中的某一个——这也就表示这三个服务器名称是跳板机所能够ping通的一个地址。但是通常用户的跳板机权限很低,无法编辑/etc/hosts文件来提供服务器名称和ip地址的解析,而HostName写服务器的ip名称显得特别不方便,有没有办法呢?其实是有的,参考项目hosts,通过跳板机的~/.bashrc文件指定本地hosts文件就可以为大多数程序提供名称和ip的解析。ProxyCommand则表示ssh的过程是先通过ssh 跳板机,再执行 nc 再次执行后边的命令。因此跳板机需要保证拥有nc命令,如果没有,可以手动编译一个或者上传一个。最后的IdentityFile表示你在server里添加过公钥对应的私钥路径。如此设置以后,当你ssh server-1的时候会自动通过jumper配置到跳板机,然后通过nc命令到相应的服务器了。当然,rsync命令也能通过上述配置传送文件了,这样向某个服务器传文件或者从某个服务器down日志就不必再通过跳板机保存一次啦。需要注意的是此时目标服务器的authorized_key内放的是本地机器的公钥,而不是跳板机的公钥。

ps:nc 也可以用-W参数,形式为ProxyCommand ssh jumper -W %h:%p不过经过实验,不能多层跳转(比如先ssh develop 再ssh jumper 再ssh server1),而nc可以做到多层跳。如果你不需要多层跳转,-W参数最容易,也不需要copy nc程序。

##3. 端口转发,数据库等工具设置

端口转发非常简单,通过ssh -D 端口号 host命令就连接到远端服务器的同时在本地端口号开一个socket代理,通过它你可以直接访问跳板机后边的资源,浏览器也可以通过它访问一些内部的http服务。

而数据库工具也大多提供了ssh的配置,通常可以在sql客户端的ssh一栏添加跳板机的地址,ssh端口号,用户名和私钥,sql的地址和端口号就是sql服务器的内部ip地址和端口号,就可以不通过vpn访问跳板机后边隐藏的数据库啦。

目前开发人员需要的ssh配置大体就这么多啦。