(转)SSH 登录配置与文件传输

https://www.jianshu.com/p/7793369eb593

SSH 是常用的远程登录协议/工具。无论是管理远程主机,混 GitHub,上BBS,还是折腾自家的路由器,都离不开 SSH。相比于 Telnet,SSH 可以更安全,也可以更方便。之所以说“可以”,是因为,想要安全而方便地使用 SSH,还是需要一些知识的。

约定

先做一个约定。

本文讨论的 SSH,是指 SSH 客户端而不是服务端。SSH 客户端软件,是 Linux/Mac 的命令行界面下的 ssh 命令,PuTTY 之类的图形界面客户端,原理相同,会在文末作简略介绍。

我们还约定,除了当前运行 SSH 客户端的本地主机(以下简称“本地主机”)外,还有两台远程主机,分别是:

  • 远程主机 remote, IP 地址12.34.56.78,SSH 端口52193,用户名admin,密码admin
  • 家庭路由器 router,地址 router.asus.com,SSH 端口22,用户名admin,密码admin

基本连接

如果想从本地主机远程登录 remote,最基本的办法是使用如下命令:

ssh admin@12.34.56.78 -p 52193

然后根据提示,输入密码,完成登录。

登录 router 稍简单。因为 router 的 SSH 服务使用了默认端口,所以无需手动指定。

ssh admin@router.asus.com

可惜许多 VPS 的 SSH 服务往往监听的都是个挺难记的端口,记忆负担较重。登录时还要输入密码,一次两次还好,需要频繁登录的时候也挺烦人。

歧途

到这里,有人就会想些简化登录的办法了。比如:

  1. 写个自动登录脚本,把地址端口用户名密码全都明文预先写在脚本里。这种方法需要一定的编程基础,费时费力,还有密码泄露风险,可谓事倍功半。
  2. 换个支持自动登录的图形界面客户端,比如 SecureCRT 或者“修改版”的 PuTTY。只是 SecureCRT 是要收费的,Linux/Mac 平台上没有,“修改版”的 PuTTY 天晓得他还修改了些什么,而且无论怎样,密码都要明文存储,并不安全。

更有甚者,我还见过某硬件论坛里有人(还是版主)教别人放着 SSH 不用,给路由器开 Telnet 服务,然后写了个 vbs 脚本玩自动登录的。结果安全性、便利性一样不沾,自找麻烦,真是以其昏昏使人昭昭。

Key

其实,SSH 协议本身就支持无密码登录,甚至无密码登录比密码登录的安全性还高,这就是基于秘钥的安全验证。

ssh-keygen -t rsa -b 4096 -C "your comment"

以上命令可以在本地主机的 ~/.ssh/ 目录下生成一对 RSA 钥匙,id_rsa 是私钥,id_rsa.pub 是公钥。私钥必须保密而公钥可以公开。把公钥添加到远程主机的 ~admin/.ssh/authorized_keys 中,就可以实现无密码登录。

生成钥匙对的过程中,会提示设置 passphrase。passphrase 可以留空,但是一旦私钥泄露,黑客就可以利用你的私钥任意登录,存在安全隐患;不留空的话,每次登录还是要像输入密码一样输入 passphrase。将私钥纳入 ssh-agent 管理可以解决上述问题。ssh-agent 的用法,详见《使用SSH Agent Forwarding》。如果你使用 Mac,苹果的钥匙串会自动帮你管理 passphrase。

需要注意的是,秘钥文件乃至整个 .ssh 目录(无论是本地主机还是远程主机),都有严格的权限限制,如果权限不正确,连接会被拒绝。什么样的权限限制呢?除了文件所有者外,其他用户不得修改(增加、删除、重命名).ssh 目录下的文件,不得阅读私钥的内容。这也很好理解,如果其他用户有了 .ssh 目录的写权限,就可以把远程主机上的 authorized_keys 随意替换成自己生成的公钥;如果其他用户可以阅读私钥,那私钥的保密性就荡然无存。所以,使用 SSH 连接之前,应该在远程和本地主机上执行以下命令:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa

config 文件

以上,我们解决了输入密码的问题。但是,登录时仍然要输入一长串用户名、地址、端口,不光是输入负担,也是记忆负担。现在,我们使用 config 文件进一步简化登录。

在本地主机的 ~/.ssh 目录下新建 config 文件,内容如下:

Host remote
    HostName 12.34.56.78
    User admin
    Port 52193

各项配置顾名思义,很好理解。现在,登录 remote 的命令简化为:

ssh remote

没有冗长的地址,没有难记的端口,也无需输入密码。

router 也可以如法炮制。可是如果 router 的连接使用了和 remote 不同的秘钥对呢?那就需要手动指定私钥文件了。

Host router
    HostName router.asus.com
    User admin
    IdentifyFile ~/.ssh/router.pem

/etc 目录下有一份 ssh_config 文件,功能与用户家目录下的 config 目录相同,但 /etc 下那个是全局的配置文件,如果二者不一致,家目录下的配置会覆盖全局配置。由于每个用户有不同的需求,因此不建议直接修改 ssh_config。不过,倒是可以学习一下其中的配置选项。

scp 和 sftp

sshscpsftp 都是 OpenSSH 软件包的组成部分。其中,scp 即 secure copy,是用来在本地和远程主机间复制文件的工具,可以看做是增强加密版的 cp,只不过 cp 是在本地文件系统中相互复制,scp 可以操作远程主机的文件系统,cp 只需要本地路径来定位文件,scp 还需要加上远程主机名;sftp 是 SSH 封装加密过的 ftp 工具。

换作以前,从远程主机 remote 向本地复制一份文件,需要这样:

scp -P 52193 admin@12.34.56.78:~/filename.txt ~/

然后输入密码,开始传输。

由于 scpssh 使用同一套配置,经过上面一番配置后,命令直接简化为:

scp remote:~/filename.txt ~/

是不是简单了很多?

PuTTY 和 WinSCP

图形化的 SSH 客户端有很多,免费的 PuTTY 是常用的一个。顺便提一句,下载 PuTTY 请去官网,最好不要去什么“软件中心”、“下载中心”下载来历不明的版本,非要下载,也请验证签名后再使用;也不要去下载什么汉化版、修改版,PuTTY 的汉化版曾经爆出过后门。

PuTTY 是不支持自动输入密码的。想要实现自动登录,唯一的正途就是秘钥登录:用 PuTTYgen 生成一对秘钥,Public Key(公钥)复制添加到远程主机的 authorized_keys 文件中,Private Key(私钥)导出妥善保管在本地。所谓妥善保管,是指保存在用户主目录 %HOMEPATH% 下的某个位置——如果随意放在 C 盘、D 盘的某个位置,其他用户很容易就看到私钥内容了,安全性何在?

然后,在 PuTTY 配置界面的 Connection -> SSH -> Auth 找到 Privaet key file for authentication,填入私钥位置,保存即可。

WinSCP 是图形化的 scp 工具,配置原理与 PuTTY 类似,就不加赘述了。


SSH 提供了安全的远程登录方式,稍加学习配置,可以让登录过程更加便捷。不要试图用歪门邪道的方式来获得便利性,也不要为了便利性而忽视安全性。重视安全可能并不会带来直接的利益,但忽视它,往往会造成巨大的损失。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值