跟远程机器打交道之认识ssh

作为一个开发者, 跟远程服务器打交道是在所难免的. ssh
是我们经常用到的, 但是 ssh 其实有很多方便的配置和使用方法, 可以帮助我们更轻松的跟远程服务器交互, 下面一一介绍.

简化登录

给远程服务器起个名字吧

ssh 一般是使用 ssh @
, 然后输入密码的方式来登录服务器, 其实可以有更简单的方式.

我们 ssh 的时候, 本地的机器是ssh的客户端, 服务器则是ssh的服务器端. ssh 客户端可以有自己的配置文件, 它的位置是在 /etc/ssh/ssh_config
( global config ) 以及 $HOME/.ssh/config
( 如果没有则可以创建 ), 我们利用配置文件, 可以配置ssh时的一些参数. 典型的应用就是, 我们可以在这个文件里事先填好远程服务器的信息, 然后给它起一个别名, 比如这样:

Host dev_server # dev_server就是我们给远程服务器起的名字
Hostname 192.168.2.1 # 这个字段指定了服务器的IP
Port 22 # 指定端口, 默认是22的话可以不指定
User eleven # 使用哪个用户登录

将上面的配置写入 $HOME/.ssh/config
文件之后, 我们之前的 ssh eleven@192.168.2.1
命令, 就可以简单的写为 ssh dev_server
了.

每次需要输入密码? 试试免密登录吧

每次 ssh, 我们都需要输入密码, 这无疑有点繁琐, ssh 协议可以使用
公钥认证

来避免每次输入密码的繁琐, 简化 ssh 的登录过程, 最重要的是, 它更安全.

公钥认证首先需要我们创建自己的 key pair
, 一个公钥, 一个私钥. 然后将公钥copy到服务器,我们就可以实现免密登录了.
最简单的配置命令是:

ssh-keygen -C ""
#生成自己的key pair, 如果提示有了则不需要继续执行, 其中需要输入passphrase, 可以选择回车跳过
# 提供email信息是好的,这样服务器就可以方便的管理公钥
ssh-copy-id 
# 输入服务器密码, 就可以将自己的公钥拷贝到服务器啦

完成上面的配置之后, 我们就可以直接 ssh
, 不需要键入密码直接登录服务器了.

定制你的key pair

有的时候, 你会有很多服务器, 比如你需要使用 ssh 协议来从 GitHub 上 clone 代码, 你有自己的云服务器, 在公司你还会登录公司的服务器, 这些服务器, 使用一个 key pair, 当然也没有问题, 但是分别使用自己单独的 key pair总是好的.

ssh-keygen
默认会在 ~/.ssh/
下面创建 ~/.ssh/id_rsa
( 私钥 ) 和 ~/.ssh/id_rsa.pub
( 公钥 ) 两个文件. 在 ssh 登录的时候, 也会默认使用这个默认创建的文件来尝试登录服务器, 如果我们需要不同的服务器使用不同的 key pair 来登录, 我们就需要定制创建:

ssh-keygen -t rsa -f ~/.ssh/_rsa -C ""
# 默认就使用的是 rsa 方式加密, -t 可以指定加密方式, -f 可以指定生成的 key pair 的名字
ssh-copy-id -i ~/.ssh/_rsa 
# 拷贝公钥到服务器的时候, 如果不使用 -i 来指定拷贝的目标 key pair 文件,
# ssh-copy-id 则会拷贝~/.ssh/ 下的所有 key pair 文件, 这并不是我们想要的.

将 key pair 文件定制创建并拷贝到服务器上之后, 接下来 ssh 登录的时候, 问题就来了, 你现在有了多个 key pair, ssh 怎么知道你需要使用哪个 key pair 来登录服务器呢? 我们可以在 ssh 的时候使用 -i
来指定 identity file, 也就是哪个 key pair, 但是未免有点繁琐, 我们可以在 ~/.ssh/config
里, 给服务器指定 identity file:

Host dev_server
Hostname 192.168.2.1
Port 22
User eleven
IdentityFile ~/.ssh/ # 设置使用哪个 key pair来登录该服务器
IdentitiesOnly yes # 甚至可以设置只允许使用key pair的形式来登录

到此位置, 我们就可以 简单, 安全
愉快的登录服务器啦.

远程运行命令

有的时候我们登录服务器仅仅是为了运行几条简单的命令, 并不需要做很多事情; 或者是, 我们需要编写脚本, 自动化的登录服务器做一些事情, 这个时候, 我们就需要远程运行命令的能力了.

如果只是简单的几条命令, 可以直接使用 ssh "command1 && command2"
来直接运行命令并返回结果即可. 但如果我们需要在服务器上运行很多条命令, 或者是我们需要重复性的运行这些命令, 最好的还是, 在本地写一个脚本, 然后让远程服务器运行我们本地的一个脚本. 我们可以这样做:

ssh  bash -s -- < " args1 arg2..."
# 甚至可以给脚本传参数!

还有更多…

ssh 还可以做到很多事情, 比如我们可以让 TCP 连接的数据, 转发给 ssh 来提高数据传输的安全性; 倘若你还有更高级的需求, 比如, 有时候我们要登录的目标服务器B, 需要一个跳板机A才能登录上去, 但是我们又不想把自己登录目标服务器B所需的私钥放到跳板机A上, 每次登录都要跳转难免又有点繁琐, 这个时候则可以借助 ssh 的代理功能以及 ssh-agent
来帮我们做到一步登录. 更多精彩, man ssh
一下.