如何使用openssh进行远程连接

SSH连接的建立方式

ssh可以通过密码和密钥(更加安全)这两种方式建立起客户端与 服务端的连接。

SSH连接的实现过程(假设通过密钥的方式连接)

  1. 当客户端发起一个ssh连接请求时,它首先会告诉服务端需要使用的公钥;
  2. 然后服务端会检查它的~/authorized_keys文件,这个文件中包含了所有已经保存的客户端公钥,一个公钥占据一行,这些公钥所对应的客户端可以实现免验证登录。
  3. 服务端如果在文件中找到了请求客户端所对应的公钥,就会生成一个随机字符串,并使用找到的公钥进行加密。这个加密后的信息只能被请求客户端的私钥所解密,然后服务端将这个加密后的字符串发送给请求客户端,以此来验证该客户端是否拥有私钥。
  4. 客户端收到来自服务端的加密字符串之后,会立即使用自己的私钥进行解密,并将解密后的随机字符串与之前协商好的会话id结合,生成一个md5加密的hash值,并回传给服务端。
  5. 由于服务端已经知道加密之前的随机字符串和会话id,因此,服务端会在本地将这个随机字符串和会话id进行hash,然后和客户端传过来的值进行比较,如果一致,则表示请求客户端确实拥有私钥,并允许建立连接。

    生成SSH密码对

    有几种加密算法可以用来生成SSH密钥,例如RSA、DSA、ECDSA,默认情况下使用RSA加密算法。
    使用如下命令可以生成一个默认的密钥:
1
$ ssh-keygen
1
2
Generating public/private rsa key pair.
Enter file in which to save the key (/home/demo/.ssh/id_rsa):

这里可以指定密钥文件的保存位置。默认是~/.ssh/id_rsa
点击enter进入下一步:

1
2
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

这里可以指定密钥的密码短语,即在密码之上再加一层密码验证,增强密钥的安全性。
点击enter进入下一步:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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参数来指定我们需要的位长度。
    比如:
    1
    $ ssh-keygen -b 4096
    如果你之前已经生成过一个密钥对,那么这里会提示你是否需要覆盖你之前的键:
    1
    Overrite(Y/n)?
    如果你选择是,那你之前的文件会被覆写,导致你再也无法使用之前的密钥登录到之前的服务器,因此,一定要小心之前的密钥是否需要保留。

    移除或者修改私钥的密码短语(passphase)

    如果你已经为你的私钥指定了一个密码短语,该怎么修改或者直接删除这个密码短语呢?

    为了修改或移除密码短语,你必须知道原来的密码短语。如果你忘记了原来的密码短语,你将无法再次使用该密钥,必须重新生成新的密钥。

    通过下面的命令:
    1
    $ ssh-keygen -p
    1
    Enter file in which the key is (/root/.ssh/id_rsa):
    你可以指定密钥的位置,或者直接按Enter接受默认的位置。
    1
    Enter old passphrase:
    输入你希望修改的旧密码,然后你会被提示输入一个新的密码短语:
    1
    2
    Enter new passphrase (empty for no passphrase):
    Enter same passphrase again:
    至此,输入你的新密码短语或者按Enter来移除密码短语。

    展示SSH密钥的手印(Fingerprint)

    每个SSH密钥对共享一个密码形式的“手印”,它可以被用来唯一标识密钥对。这在有些情况下会很有用。
    为了查看现有的密钥对,你可以执行:
    1
    $ ssh-keygen -l
    1
    Enter file in which the key is (/root/.ssh/id_rsa):
    你可以直接按Enter选择默认的密钥的位置,或者输入你期望的位置。之后你会得到包含了密钥的位长、手印和帐号以及所选主机和使用的算法的字符串:
    1
    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发行版中。
    通过下面的命令可以实现这一点:
    1
    $ ssh-copy-id username@remote_host
    随后会提示你输入当前用户在远程服务器上的密码,正确输入之后,你本地的公钥就会被添加到服务器用户的~/.ssh/authorized_keys文件中,之后,你就可以不用输入密码也能登录到远程服务器了。

    不通过ssh-copy-id命令将公钥添加到远程服务器

    如果你没有安装ssh-copy-id命令行工具,那你应该怎么样将你的公钥上传到远程服务器呢?通过linux中的管道命令,我们可以实现这一点。
1
$ cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && ~/.ssh/authorized_keys"

随后根据提示输入远程主机的用户名密码:

1
2
3
4
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:

如果添加成功,你之后的登录将无需再次输入密码,而是简单的通过如下命令:

1
$ ssh username@remote_ip_host

手动将你的密钥复制到服务器

如果你没有可用的基于密码访问的SSH连接,你将必须手动将你的公钥复制到远程服务器。
打开你的本地终端,输入下面的命令:

1
$ cat ~/.ssh/id_rsa.pub

将输出到屏幕上的公钥复制到剪贴板,然后通过工具(一般是服务器供应商提供的web面板)连接到远程服务器,并在远程服务器的~/.ssh/(如果不存在就新建)目录下面创建authorized_keys文件。最后将你复制的公钥粘贴到该文件中,并保存。

基本的连接指令

接下来是针对SSH中一些比较常用的命令做个说明。

连接到指定的远程服务器

1
$ ssh remote_host

这个命令会假设你当前机器的本地用户名和远程服务器上的用户名是一致的。如果不一致,请使用下面的命令。

1
$ ssh username@remote_host

这个命令会假设你要连接的远程服务器的端口号是22(ssh默认的端口号)。如果不是,请使用-p your_port指定你的自定义端口号。
如果服务器正常开启了ssh服务以及对应的监听端口,那么你会看到如下信息:

1
2
3
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”即可接受来自远程服务器的验证。
如果你使用了密码验证,那么你会被要求输入密码,如果你使用了公钥免登录,且设置了密码短语,那么你将同样被要求输入密码短语,否则,你将自动登录成功。

在远程服务器上执行单次命令

如果你只是想在远程服务器上执行单个命令,并不想开启一次远程会话。那么你可以通过下面的命令来完成:

1
$ ssh username@remote_host commander_to_run

这个命令会在连接上远程服务器之后立即执行后面的命令,随后便会关闭连接。

使用配置文件简化连接输入

~/.ssh目录下新建config文件(如果不存在的话),并输入如下内容:

1
2
3
4
5
Host remote_aliss # 远程主机别名
HostName remote_host #远程主机
Port port_num # 端口号
User your_user # 登录用户
IdentityFile ~/.ssh/id_rsa # 要使用的密钥

配置完成之后,之后的连接只需要通过输入如下命令即可:

1
$ ssh remote_alias

使用SSH Agent保存密码短语,避免重复输入

如果你对密钥使用了密码短语进行加密,那么你在每次建立SSH连接会话之前都会要求输入密码短语,为了简化连接过程,避免每次都要重复输入,你可以使用SSH Agent来保存你的密码短语。

如何使用openssh进行远程连接

http://kylepeng93.github.io/2020/12/27/ssh-manual/

作者

彭凯

发布于

2020-12-27

更新于

2020-12-31

许可协议

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

评论

You forgot to set the shortname for Disqus. Please set it in _config.yml.