SSH(Secure Shell)基本介绍以及远程机器的连接方式

1.SSH介绍

SSH是一种网络通信协议,可以让两台计算机之间实现加密通信。SSH采用的是服务器-客户端模式,顾名思义,也就是向服务器发出请求的部分(客户端 client)以及接收客户端请求的部分(服务端 service)。现阶段,我们使用的最流行的ssh主要指openssh。对于linux/unix系统而言,一般都会自带ssh,如果没有就需要自行安装。

我们可以通过下面的命令查看ssh的版本。

$ ssh -V

以下是我的mac电脑的ssh版本信息  

SSH(Secure Shell)基本介绍以及远程机器的连接方式

2.SSH远程连接(密码登录)

作为一种通信方式,那么ssh最主要的用途自然就是通过一台电脑连接另一台,比如通过本地客户端连接远程服务器。那么具体该如何操作呢?下面我以我自己的电脑为例,将其作为客户端,然后将我的ubuntu虚拟机作为远程服务器来示范如何连接远程机器。

1.通信建立

当然,在实现ssh连接之前需要先保证你的两台机器能够实现互相通信,可以使用ping命令。如果你和我一样使用虚拟机(VirtualBox)进行测试,需要先配置虚拟机的网卡,这里就不展开了,大家可以参考这篇文章

下面我来测试一下我的两台电脑之间的通信。

我的主机和虚拟机的ip地址分别为:192.168.56.1&192.168.56.5

因此在主机上,我使用下面命令

SSH(Secure Shell)基本介绍以及远程机器的连接方式

如果出现上面类似的结果,表示可以建立连接,如果出现timeout等情况,就表示连接不成功,你需要检查你的虚拟机网卡是否配置完成或者是否输入了错误的ip地址,可以使用下面命令检查电脑的ip地址

$ ifconfig | grep inet

同样的在虚拟机上也使用类似的命令ping主机(请忽略我奇怪的主机名,因为之前做spark时尝试构建集群...)

SSH(Secure Shell)基本介绍以及远程机器的连接方式

2.请求发送

OK,现在两台机器能够实现通信。接下来,我要通过主机向虚拟机发送连接请求

$ ssh -p 22 username@hostname
or 
$ ssh -p 22 username@ip

这里的-p,指的是port端口号,ssh默认端口为22,username为对方电脑用户名,hostname为对方电脑主机名,ip自然就是对方电脑的ip地址。以下是我通过主机连接虚拟机的实例。

SSH(Secure Shell)基本介绍以及远程机器的连接方式

如上图所见,当在命令行输入连接请求命令后,系统会显示无法连接的提示,并返回一串字符串,并提示你是否要继续连接。那么这里是什么意思呢?

 因为当你的电脑第连接远程电脑时,首先会有一个验证过程,验证远程电脑(一般为服务器)地址是否为陌生地址,如果为第一次连接(正如上述我的例子),自然就会显示不认识这台服务器,然后提醒用户是否要继续连接。而输出的这一长串则是服务器的指纹,也就是ssh服务器公钥的hash值,用于识别某台特定服务器。

如果确定这台服务器是安全的,直接输入yes即可。然后系统会提示如下信息

SSH(Secure Shell)基本介绍以及远程机器的连接方式

意味着当前远程电脑的指纹被存储在主机中了,我们可以在~/.ssh/known_hosts文件中找到它。同时之后再连接这台机器就不会再产生上面的warning了。然后就剩下最后一步了,ssh会要求客户端输入远程电脑的登陆密码,输入完成就能登录远程机器的shell了。如下

3.成功连接

SSH(Secure Shell)基本介绍以及远程机器的连接方式

登录成功后,你就可以通过你的主机对远程机器进行操作了。

3.SSH远程连接(密钥登录)

虽然SSH默认可以通过密码的方式登陆,但是事实上密码的安全性还是不够高,同时每次手动输入还是蛮麻烦的,事实上SSH还提供了另一种登录方式:密钥登录。

SSH采用的是非对称加密,即同时存在公钥(public key)私钥(private key),公钥和私钥都是一一对应的,每个私钥都有且仅有一个对应的公钥。每个用户可以公开自己的公钥,但是私钥需要私密保存。如果数据使用公钥进行加密,那么只能使用对应的私钥才能解密,反之,如果数据使用私钥加密,也只能使用对应的公钥进行解密。

那么要通过ssh实现客户端(local machine)到远程机器(remote machine)的密钥登录具体该怎么操作呢?

1.客户端生成公私钥对

要使用密钥登录,首先就是必须在客户端生成公私钥对。需要通过ssh-keygen命令,同时必须指定具体的加密方式,一般为rsa或者dsa,也可以是ed25529等等

$ ssh-keygen -t rsa
or 
$ ssh-keygen -t dsa
or
$ ssh-keygen -t ed25519

当然你也可以指定其他参数,比如保存私钥的文件路径(-f),默认在~/.ssh/xxx 下,在生成私钥文件的同时,也会自动生成一个公钥文件,默认为~/.ssh/xxx.pub。

下面我使用ed255191加密方式在我的主机上来生成公私钥对。

SSH(Secure Shell)基本介绍以及远程机器的连接方式

输入命令后,系统会产生一系列提示信息要求你输入,包括文件存储路径,以及是否需要对私钥文件做密码保护(passphrase),如果你不需要,就直接回车。最终就会生成公私钥文件,同时显示器还会显示公钥的指纹。

OK,我们可以稍微进入到指定路径看一下生成的文件,私钥以及公钥。

SSH(Secure Shell)基本介绍以及远程机器的连接方式

SSH(Secure Shell)基本介绍以及远程机器的连接方式

2.上传公钥到远程机器

接下来我们需要将我们生成的公钥内容上传到指定的远程机器的~/.ssh/authorized_keys文件中。当然我们可以直接将复制粘贴,这是最直接的方法,除了这种方法之外,再介绍两种命令行操作的方式。

 方式一

$ cat ~/.ssh/id_ed25519.pub | ssh username@hostname "cat>>~/.ssh/authorized_keys"

上面的username 和 hostname分别代表远程机器的用户名和主机名。然后大概解释一下这个命令,首先通过cat命令将主机上的公钥文件进行显示,并将其作为输入,利用|(管道函数)传递给后半部分命令。而后半部分命令就是通过ssh登录远程主机并执行"cat>>~/.ssh/authorized_keys"。也就是将管道函数前的输入(公钥)通过cat>>添加到远程机器的.ssh目录下的authorized_keys文件中。

顺便一提,管道函数的后半部分(如下)也是通过ssh对远程机器进行操作的基本语法。

$ ssh username@hostname "command"

方式二

出来这种方法之外,还有一种更简单的方法。openssh自带一个ssh-copy-id的命令,可以自动将公钥拷贝到远程机器的~/.ssh/authorized_keys文件中。即使该文件夹不存在,也会自动创建该文件。命令如下

$ ssh-copy-id -i key_file username@hostname

其中key_file表示本地指定的公钥文件。

下面我使用我的主机来使用第一种方式操作一下,对于第二种方式,有兴趣的读者可以自行尝试。

SSH(Secure Shell)基本介绍以及远程机器的连接方式

当然在这次远程访问虚拟机时需要输入password。

然后我们就可以尝试直接连接远程机器,不再需要密码了。

SSH(Secure Shell)基本介绍以及远程机器的连接方式

我们也可以在虚拟机的环境下,查看一下.ssh文件夹。

SSH(Secure Shell)基本介绍以及远程机器的连接方式

发现确实authorized_keys文件已经存在,同时里面包含了我们主机的公钥。

SSH(Secure Shell)基本介绍以及远程机器的连接方式

OK,到这里我来做个小总结,在这篇文章中,我们了解了SSH的基本概念以及如何通过ssh访问远程机器,接下来,我还会继续深入SSH的其他内容,敬请期待。最后谢谢大家的阅读。

参考:

1.<<SSH入门教程>>

2.MIT-Missing Semester_Command Line Environment

上一篇:Foudation -kubernetes secure Architecture-基础 kuberntes安全架构


下一篇:mysql06-解释计划