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
                    
                
                
            
        
浙公网安备 33010602011771号