本来标题准备直接写SSH的,不过后来又想到这个词好像在不同领域里面还有不同的意思,所以为了避免歧义,就直接改成了OpenSSH,就是我们用来远程连接Linux服务器的那个ssh。其实这个工具非常的好用,有一些命令和用法最近才知道,所以我就赶快写了这篇文章,给大家分享一下。

安装OpenSSH
在Linux上,这个包可以说是必备的,就不多说了。而在Windows上,有很多模拟Linux的工具附带了OpenSSH。但是我感觉最简单好用的还是Git For Windows,它自带了一个Git Bash,可以模拟很多Linux命令。而且Git算是一个比较小巧的软件,没有那么多复杂的依赖,安装和卸载都很方便。
安装好了,打开Git Bash就可以使用SSH了,和Linux下一样方便。

创建SSH密钥
这个倒是不算一个小技巧,而是用SSH必须设置的步骤,不过因为我经常忘记,所以干脆就顺便写到这里吧。创建密钥很简单,输入下面的命令即可,别忘了将电邮地址改成自己实际使用的。
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
接下来还需要输入密钥保存位置、密码等信息。如果你是第一次创建密钥的话,默认即可,否则需要添加一个新的名字。密码是保护密钥的一个方法,如果你比较懒的话,可以留空,否则以后使用密钥的时候都需要输入密码认证才行。

设置完成之后应该会在~/.ssh目录下看到名为id_rsa和id_rsa.pub一对密钥,前者是私钥,后者是公钥,私钥要自己好好保护好。而公钥会在下面排上很大的用场。
SSH配置文件
这个用法是我在Visual Studio Code官网关于远程开发插件的教程上看到的,之后我就感觉原来我一直不会用SSH。一般来说用SSH远程连接Linux主机的话,需要用下面的命令:
ssh 用户名@主机地址 -p 端口号
看着虽然简单,但是实际输入的时候,由于主机地址和端口号都是一长串,输入很不方便,也很难记忆。而如果将它们加到SSH的配置文件,就可以简单的输入了。默认SSH配置文件位于~/.ssh/config,如果没有则创建该文件,然后加入类似下面的配置。Host是配置名称,Hostname是主机地址,User是用户名,为了安全性这里没有密码的配置。如果有其他主机的话,可以按照这个格式继续添加。
Host manjaro Hostname 192.168.229.128 User yitian
配置完成之后,就不用在输入冗长的命令了,直接输入主机名就可以自动连接了。当然,为了保证安全性,密码还得你手动输入。
ssh manjaro
设置SSH密钥登录方式
上面虽然简化了一点操作,但是还是比较麻烦,因为要手动输入密码,要么为了安全性每次都需要输入很长一串密码,要么为了省事而使用简单密码,但是这样有不够安全。所以还有一种推荐的登录方式,那就是利用密钥登录。而密钥登录就需要使用上面创建的公钥了。设置方式其实也不难:
- 首先,打开自己本地的公钥文件,会看到一长串字符,把它复制下来。
- 然后登录进入远程主机,在~/.ssh文件中看看有没有authorized_keys文件,没有则创建,有则直接下一步。
- 将公钥文件的内容复制到authorized_keys中,保存。
之后再次使用SSH登录(不管是直接命令连接还是简化命令连接)就会发现不需要密码就可以直接登录到远程主机中了,而且这种方式相对于密码输入的方式更安全可靠。当然这其实需要远程主机的SSH服务端开启这个功能,不过一般情况下都是开启的,所以我们不用特意管他。
不过如果你照着这个说明来做的话,其实会发现这个还是有点麻烦的。所以SSH非常人性的话提供了一个命令来帮助我们简化操作,使用的时候同样会提示输入密码,不过只需要输入这一次,接下来就可以告别密码了!
ssh-copy-id 用户名@主机地址 -p 端口号
命令运行完毕之后,我们可以再次尝试,不出意外的话,就可以直接登录,不用再输入密码了!

使用SFTP协议传输文件
FTP协议大家应该都听说过吧,作为一个很老的协议已经被广泛使用了很多年。之前看过个新闻火狐将移除浏览器的FTP功能,这个新闻也引发了大家大量的讨论。不过其实结论很早之前就已经公认了:FTP协议即在安全性上没有任何优势,也在速度上没有任何优势,能一直用到现在纯粹是因为出来得早而已。FTP早就该过时了。
那么问题来了,如果我们不使用FTP协议,在需要在Linux主机之间传送文件该怎么办呢?推荐的做法就是使用SFTP协议,虽然名字很像,但是和FTP确实没有一点点关系。SFTP协议是基于SSH的,没错,就是我们本文介绍的这个用于连接远程服务器的SSH。正如上面介绍的一样,我们可以用密钥登录的方式来提高SSH的安全性,那么自然SFTP也是非常安全的,而且速度也更快。
那说了半天,SFTP该如何使用呢?其实很简单,首先需要依据上面介绍的配置好SSH密钥登录方式,因为每次复制文件都需要密码实在是太麻烦了。然后就可以使用scp命令来在本地和远程主机之间传送文件了,甚至你想的话,在两个远程主机之间传送文件也是可以的。
# 从远程主机将文件复制到本地$ scp username@from_host:file.txt /local/directory/# 从本地将文件上传到远程$ scp file.txt username@to_host:/remote/directory/# 从远程主机将文件夹复制到本地$ scp -r username@from_host:/remote/directory/ /local/directory/# 从本地将文件夹上传到远程主机$ scp -r /local/directory/ username@to_host:/remote/directory/# 在两个远程主机之间复制文件,第一个是起始主机,第二个是目标主机$ scp username@from_host:/remote/directory/file.txt username@to_host:/remote/directory/
介绍了这么几条命令,我估计大家也没记住,因为我自己也没记住。不过记不住也没关系,因为而我们还有功能强大的图形客户端嘛,这里推荐FileZilla,一款老牌的功能强大的开源免费FTP软件,它也支持SFTP。
FileZilla用起来也很简单,按照下图进行配置即可,要输入的信息也很简单,远程主机地址、端口号、用户名,然后选择前面创建的SSH私钥文件。然后点击连接即可,用起来就和FTP一样,但是更简单、更安全、更快速!

如果觉得本文有用的话,请一定收藏加转发,谢谢了!