SSH简介

什么是SSH

  1. 用于计算机之间的加密登录,登录信息全部加密,被劫持也不会泄露密码。
  2. 只是一种协议,有多种实现,比如OpenSSH就是一个开源实现
  3. Windows系统里,推荐一个SSH工具:PuTTY

基本使用

  1. ssh user@host
    1. 默认将从端口22登录,如果省略user,会默认和本机当前用户名相同。
    2. 可以增加-p [port]来修改登录端口,当然,得是对方主机允许登录的端口
  2. 密码登录:
    1. 主机把它的公钥发给用户,用户用它加密登录密码并发送给主机。
    2. 主机收到加密后的密码,用对应的私钥解密,验证登录。
    3. “中间人攻击”:攻击者在冒充主机发送假公钥。针对这个问题,主机会在你第一次登录的时候发来公钥指纹(其实就是一个hash值),用户通过别的渠道,比如跟主机对外的网站公布的公钥指纹来比对,然后接受或者拒绝。之后,这个记录会被记录在用户的~/.ssh/known_hosts文件里。(/etc/ssh/ssh_known_hosts里保存的是所有用户都信赖的主机公钥)
  3. 非密码登录
    1. 和上面的流程不一样,但原理一致,
    2. ssh-keygen是一个生成、管理ssh用公私钥的工具(SSH1协议对应RSA密钥,SSH2协议对应RSA或者DSA),公私钥会生成在~/.ssh/
    3. 用户生成钥匙对后,应该把公钥存在主机上。通过命令ssh-copy-id -i ~/.ssh/id_rsa.pub user@host将把本地公钥拷贝到远程主机的authorized_keys文件里(其实就是在末尾追加了字符串),还会把身份标识文件追加到远程主机的~/.ssh/authorized_keys里,并给远程主机的用户主目录适当的权限
    4. 主机的/etc/ssh/sshd_config文件里修改为RSAAuthentication yesPubkeyAuthentication yesAuthorizedKeysFile .ssh/authorized_keys要去掉注释,然后重启ssh服务:ubuntu——service ssh restart;debian——/etc/init.d/ssh restart
    5. 登录的时候主机会发来一段随机字符串,用户用自己的私钥加密发给主机
    6. 私钥还可以自己加密
    7. 主机用用户留存的公钥解密,验证登录

sshpass

  1. 生产环境不应该使用。因为出发点是不想记密码,但是用这个密码会轻易的从客户端泄露(比如用ps命令),所以从出发点来看,设置为上面的第二种“非密码登录”是比较合理的。所以,只推荐在不方便设置为非密码登录的情况下,比如在测试环境使用这个方法。
  2. 这是一个命令行工具,利用我们能够向命令提示符本身提供密码(非交互式密码验证),这样就可以通过 cron 调度器执行自动化的 Shell 脚本,比如进行自动备份。(sshpass在专门的tty中运行ssh,误导ssh相信它是从用户接收到的密码。)
  3. 在Linux和OS X系统安装是有区别的。
    1. 在Linux里就是很简单的通过yum或者apt-get安装(centos/redhat或debian/ubuntu)
    2. 在OS X里,要先安装xcode和命令行工具(command line tools),然后再安装一个非官方包brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb
  4. 使用:sshpass -p 'my_psw' ssh user@host

    1. 一般来讲,更加懒人的做法是写一个Shell脚本,然后用简洁的名字命名,这样使用起来就更加快捷,也不至于在命令行把密码暴露这么low
    2. 还可以用-e标志,将密码作为SSHPASS的环境变量输入:

      1
      2
      3
      export SSHPASS='my_psw'
      echo $SSHPASS
      sshpass -e ssh user@host
    3. 可以和scp命令配合,传输文件scp -r path/file.name --rsh="sshpass -p 'my_psw' ssh -l user" host:/path

本地config配置

  1. 首先,说明一下/etc/ssh/这个目录是系统的SSH配置目录,我们一般只需要修改~/.ssh/这个用户目录下的就可以,如果没有可以新建。
  2. 通过配置config文件,可以实现更加便捷的SSH操作,比如,可以实现登录不同主机使用不同的SSH Key

    1
    2
    3
    4
    5
    Host dib(这里就是设置别名了)
    HostName xxx.xxx.xx.xx(主机名,ip地址或者域名都可以)
    Port 22(默认ssh是22,也可以自己改掉)
    User root
    IndentityFile ~/.ssh/id_rsa
  3. 通过以上的配置,直接执行ssh dib就可以通过SSH登录主机了。