在 Ubuntu 中建立 SSH 通道

0. 写在之前

偶是 Ubuntu 的超级菜鸟, 绝对入门级用户. 在 吼吼 的帮助下, 大约一个月前我格掉了自己的 windows, 逼着自己全心投入学习一个全新的系统.

实际上, Ubuntu 的用户体验做得相当好, 我想像中从 win 平台转过来的成本几乎可以忽略不计. 短短几天, 我就适应了 GNOME 的各种交互. 对于强大的 Bash 也欲罢不能. 而更重要的是, 接触全新的系统, 更多的是学习一种完全不同于 windows 世界的设计, 使用理念, 让我可以从更多角度去理解”交互”的意义.

从这篇文章开始, 我会在 blog 上记录自己学习 Ubuntu 系统的各种点滴, 以期能够连点成线, 形成体系.

1. 开始 SSH 连接

1.1 什么是 SSH 连接?

所谓 SSH, 即是指 Secure Sehll Protocal, 安全壳协议. 按我的理解, 这玩意儿的主要作用就是通过在本地主机与远程服务器之间建立一个安全的隧道, 从而实现安全的数据交换. 当这个加密的安全通道建立后, 我们就可以好好地利用他了~

1.2 通过终端建立 SSH 连接

Bash 内建了 ssh 命令来建立隧道. 首先, 打开终端, 输入命令: $ ssh -D 7070 user@hostname.com

接着会出现一些信息, 然后会提示输入你的 SSH 帐户登录密码. 敲完密码, 回车确认后, 就建立起了 SSH 通道.

SSH 已建立

注意: 上面命令中的 “-D” 表示指定端口, 这里我使用本地的 7070 端口来与远程服务器建立通信. 更多的信息, 请使用 ‘man ssh’ 或者 ‘ssh –help’ 来查看.

1.3 通过图形化软件建立 SSH 连接

我刚开始上手 Ubuntu 时, 完全不懂 bash 操作. 去找了一款名为 gstm 的 SSH 图形工具, 以备急用. 要安装他, 可以先按 Alt + F1 呼出 Applications 菜单, 选择最后的 Ubuntu Sofware Center, 然后输入 gstm:

在 Software Center 中输入 gstm

接着选中搜索结果, 点击 “Install”. 安装完成后, 在 Applications 的 Internet 项中可以找到他. 运行后界面如下所示:

gstm 界面

gstm 提供的功能十分简单. 选择”Add”可以新增一个 SSH 帐户. 输入一个自己喜欢的名称后, 来到详细配置界面:

gstm 的详细配置界面

需要填写的, 就是 Login 与 Host. 前者是 SSH 的用户名, 后者是 SSH 连接的远程服务器.

搞定后, 点击 “OK” 就可以了. 注意如果希望选择某个指定的端口来建立通信, 可以在 Port redirection 中点击 “Add”, 然后在弹出的对话框中将 Type 选择为 local, 并填入相应的 Port, 最后点击 “OK”.

最后, 将 gstm 设置为开机启动, 就大功告成了:

选择 System, 在弹出的菜单中依次选择 Preference -> Startup Applications. 在弹出的对话框中选中 Startup Programs, 选择右则的 “Add”, 然后填入相应的项, 选择 “Add” 即可.

将 gstm 做为开机项

2. 建立 SSH 时避免重复输入密码, 实现无密码登录

现在我们可以轻松建立 SSH 连接了. 但是, 不管是命令行方式, 还是使用 gstm, 每次连接都需要输入密码, 太过麻烦. 特别是在使用类似于 scp 传输多个文件时, 更是烦得要死. 有没有办法可以即保正 SSH 的安全性, 又免于重复输入密码呢?

SSH 协议有想到这个问题. 所以除了传统的密码验证, SSH 又提供了使用密钥对来验证身份的方案. 所谓密钥对验证, 按我不专业的解释, 就是在本地生成一对密钥兄弟, 大哥是公钥, 小弟是私钥. 然后将大哥上传到远程服务器, 小弟则留守本地.

使用时, 远程服务器会首先生成一串随机数, 由大哥进行加密, 再将密文发送到本地. 留在本地的小弟拿到密文后, 用之前和大哥约定好的方法将其解密, 再将明文返回到服务器. 服务器一看, 哟, 解密正确, 于是验证成功. 由于公钥与私钥之间的解密方式是唯一的, 所以这种验证方式不仅可靠, 也避免了每次登录都重复输入密码.

Ubuntu 下内置了 SSH 密钥对的生成工具 ssh-keygen. 在 bash 中输入: $ ssh-keygen -t rsa

参数 “-t” 是指密钥对的加密方式, 这里选择 RSA 算法. 除此之外还可以选择 SSH2 支持的 DSA 算法. 两种算法对于 SSH 密钥对的生成没有什么影响. 然后会出现如下提示: Enter passphrase (empty for no passphrase):

这里需要输入的不是 SSH 登录密码, 而是用于加密小兄弟私钥的密码 — 很显然, 在密钥对验证中, 私钥无疑相当于自己的密码, 需要妥善保管. 这里就是设置一个密码来保护私钥. 以免私钥落入亡我之心不死的坏人手中, 造成极其巨大的影响. 当然了, 我们也可以选择不输入, 继续回车, 这就完成密钥创建了.

创建成功后, 可以进入 ~/.ssh 里看刚生成的密钥对. 其中 id_rsa 是保管私钥的地方, id_rsa.pub 就是公钥了. 接下来需要更改一下本地 .ssh 与远程服务器的 .ssh 文件夹权限. 这步相当重要.

chmod 755 .ssh // 将本地 .ssh 的权限设为 755
chmod 600 id_rsa // 将本地 .ssh 中的 id_rsa(私钥)的权限设为 600

更改权限后, 将公钥放到服务器上并修改权限, 就大功告成啦!

在 bash 中使用 scp 复制文件到远程服务器并重命名为 authorized_keys:

scp ~/.ssh/id_rsa.pub user@hostname.com:~/.ssh/authorized_keys
chmod 755 .ssh // 和本地一样的权限
chmod 644 authorzide_keys // 将公钥权限设为 644 即可.

大功告成! 再也不用输入烦人的密码了.

3. 进阶: 使用 ssh-agent

现在不需要输入密码即可建立 SSH 连接了. 但还是有例外 — 如果我们刚才设置了私钥的密码, 那么在每次连接时, 仍然需要输入私钥密码. 不设置的话, 似乎又觉得不大稳妥. 我在网上找到一篇教程, 使用 ssh-agent 似乎可以解决这个问题.

它的原理大概是, 在首次输入私钥的密码后, ssh-agent 会将密码保存在缓存中, 而在以后就不用再次输入密码了. 但当 bash 结束后再次启动, 则还是会提示输入一次密码 — 这也算是一个折衷的方案了吧.
不过我也没有真正使用过这个工具, 如果对此有兴趣, 可以移步到这里学习.

OK, 码字完毕. 这段时间项目越来越忙, 好久没写文章, 真累. 技术文章就更累人了. 在这里强烈感谢吼吼, Anrs, 萧神科科等大牛神人们的强悍技术支持… 接下来我还会不厌其烦的来问你们各种小白问题的~

2011-03-15 19:44197