Linux之SSH服务

1.  SSH有两个软件包

    rpm -qa openssh openssl

openssh-7.4p1-16.el7.x86_64
openssl-1.0.2k-12.el7.x86_64

2.  SSH配置文件

    /etc/ssh/ssh_config  ssh客户端配置文件

    /etc/ssh/sshd_config  ssh服务端配置文件

3.  SSH连接的整个过程

    1.  ssh服务启动的时候会产生一个768bit的临时公钥

    2.  当client端SSH联机请求传送过来时,server就把这个768bit的公钥传给client端。

    3.  client随机产生一个256bit的私钥,与768bit的公钥,组成一个密钥对,传给server。

    4.  在client的用户的家目录有个隐藏目录.ssh,里面有一个known_hosts文件,保存着与server的对应关系。

4.  SSH服务认证类型

    1.  基于口令的安全验证

    2.  基于密钥的安全验证

        把公钥放到服务器上,私钥放到客户端上。

5.  更改SSH服务器端远程登录的配置

    1.  修改几个参数值/etc/ssh/sshd_config配置文件

        Port  32543

        PermitRootLogin no  不允许root远程登录

        PermitEmptyPasswords no  不允许空密码登录

        UseDNS no  不允许反向解析

        GSSAPIAuthentication no  解决Linux之间使用SSH远程连接慢的问题

        AllowTcpForwarding no  不允许TCP转发

    2.  systemctl reload sshd.service

6.  SSH客户端

    1.  语法

        ssh -p22 root@192.168.0.201  需要连接到服务器上,再执行命令

        ssh -p22 root@192.168.0.201 /usr/sbin/ifconfig  这个是直接执行命令,而不需要登录到服务器上。

7.  scp命令

    1.   语法

        scp -P22  -rp  源文件  目标文件

        scp -P22 -rp mysql-5.6.40.tar.gz root@192.168.0.201:/home/tools/

        -P:  指定端口

        -r:  目录

        -p:  保持属性

    2.  特点:

        全量拷贝

        加密的远程拷贝

        可以推送也可以拉回

8.  sftp命令

    1.  语法

        sftp  user@192.168.0.201

        sftp root@192.168.0.201

9.  SSH批量管理分发项目

    1.  创建用户及密码,在所有的服务器上都创建账户

        useradd yangjianbo

        passwd yangjianbo

    2.  在管理的服务器上,切换用户

        su - yangjianbo

    3.  在管理的服务器上,创建密钥对

        ssh-keygen -t dsa

        一路回车

        会在/home/yangjianbo/.ssh目录创建公钥和私钥。

        非交互式创建密钥

          ssh-keygen -t dsa -f ~/.ssh/id_dsa -P ""

    4.  将公钥放到被管理的服务器上。

           ssh-copy-id -i id_dsa.pub yangjianbo@192.168.0.201

          ssh-copy-id -i id_rsa.pub "-p 11984 java@192.168.2.51"

           这样会在被管理的服务器的/home/yangjianbo/.ssh目录下创建一个名为authorized_keys的文件,权限为600。

           如果不使用ssh-copy-id命令,也可以自己拷贝过去,但是一定要注意权限为600。

    5.  管理所有的服务器

          ssh yangjianbo@192.168.0.201 /usr/bin/uname -r  在192.168.0.201服务器上执行命令uname -r

    6.  把所有服务器的/etc/hosts文件都更新为管理服务器的/etc/hosts,也就是以管理服务器的/etc/hosts文件为模版,覆盖所有服务器的/etc/hosts文件。

[yangjianbo@nfs-server etc]$ scp hosts yangjianbo@192.168.0.201:/etc/hosts
scp: /etc/hosts: Permission denied  提示没有权限

          1.  直接使用root账户,不会涉及到权限的问题。

          2.  使用sudo提权

             scp hosts yangjianbo@192.168.0.201:~  先拷贝到远程服务器的用户目录下

             ssh yangjianbo@192.168.0.201  连接到远程服务器

             sudo rsync ~/hosts /etc/  利用sudo rsync复制到指定目录下

             要提前在所有的被管理的服务器上添加:echo "yangjianbo ALL=(ALL)  NOPASSWD: /usr/bin/rsync" >> /etc/sudoers   visudo -c        

             也可以直接使用命令,而不需要登录到远程服务器上。

             [yangjianbo@nfs-server ssh]$ ssh -t  yangjianbo@192.168.0.201 sudo rsync ~/hosts /etc/hosts

          3.  批量分发的脚本

[yangjianbo@nfs-server ~]$ cat /server/scripts/fenfa.sh 
#!/bin/bash
scp /etc/hosts yangjianbo@192.168.0.201:~
ssh -t  yangjianbo@192.168.0.201 sudo rsync ~/hosts /etc/hosts

          4.  把scp替换为rsync命令,因为scp是全部覆盖,而rsync是增量备份。    

[yangjianbo@nfs-server ~]$ cat /server/scripts/fenfa.sh 
#!/bin/bash
. /etc/init.d/functions
for i in 201
do
  rsync -avz -e "ssh -p 22" /etc/hosts yangjianbo@192.168.0.$i:~
  ssh -t  yangjianbo@192.168.0.$i sudo rsync ~/hosts /etc/hosts
done

          5.  修改脚本,利用系统函数

[yangjianbo@nfs-server ~]$ /server/scripts/fenfa.sh 
fenfa hosts [  确定  ]
fenfa hosts [失败]
[yangjianbo@nfs-server ~]$ cat /server/scripts/fenfa.sh 
#!/bin/bash
. /etc/init.d/functions
for i in 201 208
do
  rsync -avz -e "ssh -p 22" /etc/hosts yangjianbo@192.168.0.$i:~ >/dev/null 2>&1  &&\
  ssh -t  yangjianbo@192.168.0.$i sudo rsync ~/hosts /etc/hosts >/dev/null 2>&1
  if [ $? -eq 0 ];then
     action "fenfa hosts" /bin/true
  else
     action "fenfa hosts" /bin/false
  fi
done

          6.  利用脚本参数进行分发

[yangjianbo@nfs-server opt]$ cat /server/scripts/fenfa.sh 
#!/bin/bash
if [ $# -ne 2 ];then
   echo "USAGE:$0 ARG1 ARG2"
   exit 1
fi
. /etc/init.d/functions
for i in 201 208
do
  rsync -avz -e "ssh -p 22" ~/$1 yangjianbo@192.168.0.$i:~ >/dev/null 2>&1  &&\
  ssh -t  yangjianbo@192.168.0.$i sudo rsync ~/$1 $2 >/dev/null 2>&1
  if [ $? -eq 0 ];then
     action "fenfa hosts" /bin/true
  else
     action "fenfa hosts" /bin/false
  fi
done
执行脚本: su - yangjianbo
      /server/script/fenfa.sh hosts /opt

          7.  批量查看服务器的信息

[root@nfs-server ~]# cat /server/scripts/view_piliang.sh 
#!/bin/bash
if [ $# -ne 1 ];then
   echo "USAGE:$0 ARG1 "
   exit 1
fi
. /etc/init.d/functions
for i in 201 208
do
  ssh yangjianbo@192.168.0.$i $1
  if [ $? -eq 0 ];then
     action "piliang" /bin/true
  else
     action "piliang" /bin/false
  fi
done
执行脚本: su - yangjianbo
/server/scripts/view_piliang.sh "cat /etc/redhat-release"  注意命令要写全路径,并且要加引号

10.  非交互式expect

      1.   安装expect

          rpm -qa expect

          yum install expect -y

      2.  非交互式生成密钥及批量管理

11.  ssh连接报错

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
a6:f3:12:f0:a7:ac:36:ca:d3:22:34:b1:b5:d4:85:2c.
Please contact your system administrator.
Add correct host key in /home/java/.ssh/known_hosts to get rid of this message.
Offending key in /home/java/.ssh/known_hosts:21
RSA host key for [192.168.1.231]:11984 has changed and you have requested strict checking.
Host key verification failed.

 

      解决方法:

        使用root删除指定用户下的.ssh/knows_hosts文件的远程服务器的信息。

12.  ssh端口转发

    1.  本地转发  实现安全通信

        1.  语法

            ssh -L 本机主机IP地址:本地主机端口:目标主机IP地址:目标主机端口 sshserver

        2.  选项

            -f  后台使用

            -N  不执行远程命令,用于端口转发

            -L  port:host:hostport  

                将本地机(客户机)的某个端口转发到远端指定机器的指定端口. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去,同时远程主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有 root 才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport

        3.  例子

            

            执行命令:  ssh -L 172.168.1.207:7788:192.168.1.200:3306 -Nf -p 21984 zhangshaohua1510@119.254.109.186

            1.  会在172.168.1.207上打开一个端口7788,用来接收客户端的请求。

            2.  再在本机开一个随机端口,充当ssh客户端,再把数据流量发送到21984端口的ssh服务端,中转服务器收到数据以后,解密数据,临时开一个随机端口充当客户端,再把流量发送到远程服务器上

            

                         

    2.  远程转发  实现访问内网的资源

        1.  语法

            ssl -R 远程主机IP地址:远程主机端口:本地IP地址:本地端口 sshserver            

        2.  选项

            -R  port:host:hostport

                将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口. 工作原理是这样的, 远程主机上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转向出去,同时本地主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有用 root 登录远程主机 才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport

        3.  例子

           

                  注意:要有远程服务器的ssh账号和密码

                     在外部的客户端访问192.168.1.150:7788,就会访问到内网的80端口。

    3.  动态转发  实现外网的对应所有资源

        1.  语法

            ssl -D 本地IP地址:本地端口 sshserver 

        2.  选项

            -D  

            指定一个本地机器 “动态的” 应用程序端口转发. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去,
根据应用程序的协议可以判断出远程主机将和哪里连接. 目前支持 SOCKS4 协议, ssh 将充当 SOCKS4 服务器. 只有 root 才能转发特权端口. 可以在配置文件中指定动态端口的转发.

        3.  例子

            

            注意:需要在客户端配置代理端口为7788。如浏览器的代理端口。

13.  ssh报错

    1.  ssh已经设置密钥,但是还是提示密码。

chown buser:buser -R ~/.ssh
chmod 700 ~/.ssh
chmod 600 .ssh/authorized_keys

            

  

     

 

    

            

      

  

                

        

        

          

 

 

        

        

 

posted @ 2018-07-11 21:56  奋斗史  阅读(250)  评论(0)    收藏  举报