ssh和基于ssh的命令(如scp)等是运维人员和服务器打交道的通道,当服务器数量较多,要记住那么多的服务器ip和密码也是非常困难的事情。其实有很多技巧和配置可以让ssh跟ls一样简单。

概念介绍

开始之前让我们先了解一下SSH配置和SSH秘钥对。

SSH配置位置

  1. 命令行选项

  2. 用户配置文件 (~/.ssh/config)

  3. 系统配置文件 (/etc/ssh/ssh_config)

SSH秘钥对

  1. ssh-kengen命令

    • -t 指定加密算法(RSA、DSA、ECDSA等)

    • -b 自定生成密钥长度

    • -C 添加密钥对的说明comment

    • -f 指定生成的私钥存储的文件全路径名称

  2. 密码短语(Passphras)

    默认不设置密码的话,只要私钥被他人获取(比如电脑遗失,root用户),就可以随意访问授权的服务器,所以为了提高安全性,建议都设置自己的密码短语。 如果没设置,可以给已经生成的秘钥文件增加或修改密码短语: ssh-keygen -f ~/.ssh/id_ecdsa_liming -p

  3. SSH agent

    SSH agent 提供了存储私钥的安全方法,同时也能够将已经解密的私钥缓存起来,这样只需要在加入的时候输入一下密码即可。

    • 启用agent ssh-agent bash

    • 添加 ssh-add

    • 查看 ssh-add -l

    • 删除 ssh-add -d

配置示例

命令行选型这种原始用法就不多说,我们重点是将一些配置落地,尽可能减少命令行的输入,如下是一个配置示例:

  1. 客户端生产秘钥对

    ssh-keygen -t ecdsa -b 521 -C "$(whoami)@$(hostname)" -f ~/.ssh/id_ecdsa_liming
    #Enter passphrase (empty for no passphrase):
    #输入密码
    ssh-add ~/.ssh/id_ecdsa_liming
  2. 客户端增加配置

    ~/.ssh/config
    Host liming.pub // (1)
        HostName ssh.liming.pub // (2)
        User user // (3)
        Port 2222 // (4)
        PreferredAuthentications publickey // (5)
        IdentityFile ~/.ssh/id_ecdsa_liming // (6)
    1. Host: 别名,多个别名以空格分割,可以使用通配符:* ? !,如:1.*

    2. HostName:: 主机名,如果主机名中包含 ‘%h’ ,则实际使用时会被命令行中的主机名替换,如:192.168.%h

    3. 用户

    4. 端口,默认22

    5. 强制使用Public Key验证

    6. 密钥文件的路径,文件名称可以使用如下变量

      '%d' 本地用户目录
      '%u' 本地用户名称
      '%l' 本地主机名
      '%h' 远程主机名
      '%r' 远程用户名
  3. 服务端配置公钥

    mkdir -p ~/.ssh && chmod 700 ~/.ssh
    echo '~/.ssh/id_ecdsa_liming的内容' >> ~/.ssh/authorized_keys&& chmod 600 ~/.ssh/authorized_keys
  4. 使用

    ssh liming.pub
    scp liming.pub:~/index.html ./