如何使⽤openssh进⾏远程连接
SSH连接的建⽴⽅式
ssh可以通过密码和密钥(更加安全)这两种⽅式建⽴起客户端与服务端的连接。
SSH连接的实现过程(假设通过密钥的⽅式连接)
1. 当客户端发起⼀个ssh连接请求时,它⾸先会告诉服务端需要使⽤的公钥;
2. 然后服务端会检查它的~/authorized_keys⽂件,这个⽂件中包含了所有已经保存的客户端公钥,⼀个公钥占据⼀⾏,这些公钥所对应
的客户端可以实现免验证登录。
3. 服务端如果在⽂件中到了请求客户端所对应的公钥,就会⽣成⼀个随机字符串,并使⽤到的公钥进⾏加密。这个加密后的信息只
能被请求客户端的私钥所解密,然后服务端将这个加密后的字符串发送给请求客户端,以此来验证该客户端是否拥有私钥。
4. 客户端收到来⾃服务端的加密字符串之后,会⽴即使⽤⾃⼰的私钥进⾏解密,并将解密后的随机字符串与之前协商好的会话id结合,
⽣成⼀个md5加密的hash值,并回传给服务端。
5. 由于服务端已经知道加密之前的随机字符串和会话id,因此,服务端会在本地将这个随机字符串和会话id进⾏hash,然后和客户端传
过来的值进⾏⽐较,如果⼀致,则表⽰请求客户端确实拥有私钥,并允许建⽴连接。
⽣成SSH密码对
有⼏种加密算法可以⽤来⽣成SSH密钥,例如RSA、DSA、ECDSA,默认情况下使⽤RSA加密算法。
使⽤如下命令可以⽣成⼀个默认的密钥:
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/demo/.ssh/id_rsa):
这⾥可以指定密钥⽂件的保存位置。默认是~/.ssh/id_rsa。
点击enter进⼊下⼀步:
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
这⾥可以指定密钥的密码短语,即在密码之上再加⼀层密码验证,增强密钥的安全性。
点击enter进⼊下⼀步:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
8c:e9:7c:fa:bf:c4:e5:9c:c9:b8:60:1f:fe:1c:d3:8a root@here
The key's randomart image is:
+--[ RSA 2048]----+
|                |
|                |
|                |
|      +        |
|      o S  .    |
|    o  . * +  |
|      o + = O .  |
|      + = = +  |
|      ....Eo+    |
+-----------------+
这时,你的密钥对就算⽣成成功了。⽣成的⽂件如下:
~/.ssh/id_rsa:存放你的私钥。只能你⾃⼰知道。
~/.ssh/id_rsa.pub:存放你的公钥,可以让其他⼈知道。
使⽤更长的位数⽣成你的密钥对
默认情况下,ssh-keyken使⽤2048的位长度⽣成密钥对。这⼀默认值⼤多数场合已经⾜够安全,但是,我们在某些特殊场景下仍然可以使⽤更⼤的位长度来增强我们服务器的安全性。
为了做到这⼀点,我们可以使⽤-b参数来指定我们需要的位长度。
⽐如:
$ ssh-keygen -b 4096
如果你之前已经⽣成过⼀个密钥对,那么这⾥会提⽰你是否需要覆盖你之前的键:
Overrite(Y/n)?
如果你选择是,那你之前的⽂件会被覆写,导致你再也⽆法使⽤之前的密钥登录到之前的服务器,因此,⼀定要⼩⼼之前的密钥是否需要保留。
移除或者修改私钥的密码短语(passphase)
如果你已经为你的私钥指定了⼀个密码短语,该怎么修改或者直接删除这个密码短语呢?
为了修改或移除密码短语,你必须知道原来的密码短语。如果你忘记了原来的密码短语,你将⽆法再次使⽤该密钥,必须重新⽣成新的密钥。
通过下⾯的命令:
$ ssh-keygen -p
Enter file in which the key is (/root/.ssh/id_rsa):
你可以指定密钥的位置,或者直接按Enter接受默认的位置。
Enter old passphrase:
输⼊你希望修改的旧密码,然后你会被提⽰输⼊⼀个新的密码短语:
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
⾄此,输⼊你的新密码短语或者按Enter来移除密码短语。
展⽰SSH密钥的⼿印(Fingerprint)
每个SSH密钥对共享⼀个密码形式的“⼿印”,它可以被⽤来唯⼀标识密钥对。这在有些情况下会很有⽤。
为了查看现有的密钥对,你可以执⾏:
$ ssh-keygen -l
Enter file in which the key is (/root/.ssh/id_rsa):
你可以直接按Enter选择默认的密钥的位置,或者输⼊你期望的位置。之后你会得到包含了密钥的位长、⼿印和帐号以及所选主机和使⽤的算法的字符串:
4096 8e:c4:82:47:87:c2:26:4b:68:ff:96:1a:39:62:9e:4e  demo@test (RSA)
使⽤SSH-Copy-ID复制公钥到服务器
通过将你的公钥复制到服务器,可以让你不⽤输⼊密码就可以通过认证,有很多⽅法可以实现这⼀点。
如果你当前有⼀个基于密码的SSH远程服务器访问⽅式,并且你已经安装了ssh-copy-id⼯具,那么你就可以很容易的实现这⼀点。⽽且ssh-copy-id已经预装到了⼤多数的linux发⾏版中。
通过下⾯的命令可以实现这⼀点:
$ ssh-copy-id username@remote_host
随后会提⽰你输⼊当前⽤户在远程服务器上的密码,正确输⼊之后,你本地的公钥就会被添加到服务器⽤户的~/.ssh/authorized_keys⽂件中,之后,你就可以不⽤输⼊密码也能登录到远程服务器了。
不通过ssh-copy-id命令将公钥添加到远程服务器
如果你没有安装ssh-copy-id命令⾏⼯具,那你应该怎么样将你的公钥上传到远程服务器呢?通过linux中的管道命令,我们可以实现这⼀点。$ cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && ~/.ssh/authorized_keys"
随后根据提⽰输⼊远程主机的⽤户名密码:
The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
demo@111.111.11.111's password:
如果添加成功,你之后的登录将⽆需再次输⼊密码,⽽是简单的通过如下命令:
$ ssh username@remote_ip_host
⼿动将你的密钥复制到服务器ssh命令指定端口
如果你没有可⽤的基于密码访问的SSH连接,你将必须⼿动将你的公钥复制到远程服务器。
打开你的本地终端,输⼊下⾯的命令:
$ cat ~/.ssh/id_rsa.pub
将输出到屏幕上的公钥复制到剪贴板,然后通过⼯具(⼀般是服务器供应商提供的web⾯板)连接到远程服务器,并在远程服务器
的~/.ssh/(如果不存在就新建)⽬录下⾯创建authorized_keys⽂件。最后将你复制的公钥粘贴到该⽂件中,并保存。
基本的连接指令
接下来是针对SSH中⼀些⽐较常⽤的命令做个说明。
连接到指定的远程服务器
$ ssh remote_host
这个命令会假设你当前机器的本地⽤户名和远程服务器上的⽤户名是⼀致的。如果不⼀致,请使⽤下⾯的命令。
$ ssh username@remote_host
这个命令会假设你要连接的远程服务器的端⼝号是22(ssh默认的端⼝号)。如果不是,请使⽤-p your_port指定你的⾃定义端⼝号。
如果服务器正常开启了ssh服务以及对应的监听端⼝,那么你会看到如下信息:
The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
输⼊"yes"即可接受来⾃远程服务器的验证。
如果你使⽤了密码验证,那么你会被要求输⼊密码,如果你使⽤了公钥免登录,且设置了密码短语,那么你将同样被要求输⼊密码短语,否则,你将⾃动登录成功。
在远程服务器上执⾏单次命令
如果你只是想在远程服务器上执⾏单个命令,并不想开启⼀次远程会话。那么你可以通过下⾯的命令来完成:
$ ssh username@remote_host commander_to_run
这个命令会在连接上远程服务器之后⽴即执⾏后⾯的命令,随后便会关闭连接。
使⽤配置⽂件简化连接输⼊
在~/.ssh⽬录下新建config⽂件(如果不存在的话),并输⼊如下内容:
Host remote_aliss # 远程主机别名
HostName remote_host #远程主机
Port port_num # 端⼝号
User your_user # 登录⽤户
IdentityFile ~/.ssh/id_rsa # 要使⽤的密钥
配置完成之后,之后的连接只需要通过输⼊如下命令即可:
$ ssh remote_alias
使⽤SSH Agent保存密码短语,避免重复输⼊
如果你对密钥使⽤了密码短语进⾏加密,那么你在每次建⽴SSH连接会话之前都会要求输⼊密码短语,为了简化连接过程,避免每次都要重复输⼊,你可以使⽤SSH Agent来保存你的密码短语。