自动化运维工具sshd,expect,pssh,rsync详解
ssh
secure shell,安全的远程登录;openssh和dropbear都是它的开源实现,ssh协议有v1和v2俩个版本,现在使用的都是v2版,v1已经不安全了;ssh基于DH算法做密钥交换,基于RSA或DSA实现身份认证;ssh有俩种方式验证:密码验证和秘钥验证。
openssl的组成包包括openssl、openssl-clients和openssl-server,基于C/S架构。
客户端:
常见的客户端工具有:Windows版的putty、securecrt、xshell;linux中有ssh、sftp、scp、slogin等
配置文件:/etc/ssh/ssh_config
Port 22 #默认登录的ssh端口 StrictHostKeyChecking ask | no #首次登录不显示检查提示 CheckHostIP no #检查主机地址是否是可信的
ssh命令:
用法:ssh username@host [CMD]
选项:
- -p port:远程服务器监听的端口
- -l username:指定用户名
- -b IP:指定连接的源IP(自己主机的IP)
- -v:调试模式
- -C:压缩方式
- -X:支持x11转发
- -Y:支持信任x11转发
- -t:强制伪tty分配,例:ssh -t remoteserver1 ssh remoteserver2
客户端第一次连接服务器端的时候,服务器会将自己的公钥发送给客户端并保存到客户端的~/.ssh/known_hosts文件中,下次连接则不会再次询问。
基于密码的验证:
1)客户端发起ssh请求,服务器会把自己的公钥发送给用户;
2)用户会根据服务器发来的公钥对密码进行加密;
3)加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功。
基于秘钥的验证:
1)首先在客户端生成一对密钥(ssh-keygen);
2)并将客户端的公钥ssh-copy-id 拷贝到服务端;
3)当客户端再次发送一个连接请求,包括ip、用户名;
4)服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串;
5)服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端;
6)得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端;
7)服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录。
示例:配置基于秘钥验证
1、在客户端生成秘钥对
# ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa #未加密 # ssh-keygen -p #为私钥加密
2、将公钥文件复制到服务器对应用户的家目录中(~/.ssh/authorized_keys)
# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
3、如果私钥加密,为了避免我们每次使用都需要输入密码,我们可以使用代理
[root@rhel6 ~]# ssh-agent bash [root@rhel6 ~]# ssh-add Enter passphrase for /root/.ssh/id_rsa: ****** Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa) [root@rhel6 ~]# ssh 192.168.0.7 Last login: Sat May 19 10:21:24 2018 from 192.168.0.6 [root@centos7 ~]#
scp
用于远程复制,基于ssh
用法:
scp [options] [user@]host:/sourcefile /destpath :将自己的文件上传到服务器
scp [options] /sourcefile [user@]host:/destpath :将服务器的文件下载到本地
选项:
- -C: 压缩数据流
- -r: 递归复制
- -p: 保持原文件的属性信息
- -q: 静默模式
- -P PORT: 指明服务器的监听的端口
sftp
基于ssh的交互式文件传输工具,用法与ftp工具相似
用法:sftp username@host
常用指令:ls cd mkdir rmdir pwd get put
expect
expect 是由Don Libes基于Tcl( Tool Command Language )语言开发的,主要应用于自动化交互式操作的场景,借助Expect处理交互的命令,可以将交互过程如:ssh登录,ftp登录等写在一个脚本上,使之自动化完成。尤其适用于需要对多台服务器执行相同操作的环境中,可以大大提高系统管理人员的工作效率。
用法:expect [ 选项 ] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ]
选项:
-c:从命令行执行expect脚本,默认expect是交互地执行的
-d:可以输出输出调试信息
命令:
spawn:启动新的进程
send:用于向进程发送字符串
expect:从进程接收字符串
interact:允许用户交互
exp_continue:匹配多个字符串在执行动作后加此命令
示例:使用expect批量推送ssh的秘钥
#!/bin/bash rpm -q expect &>/dev/null || yum -q -y install expect #在客户端生成秘钥对 [ ! -e ~/.ssh/id_rsa ] && ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa &>/dev/null read -p "Host_ip_list: " ip_list_file read -p "Username: " username read -s -p "Password: " password [ ! -e "$ip_list_file" ] && echo "$ip_list_file not exist." && exit [ -z "$ip_list_file" -o -z "$username" -o -z "$password" ] && echo "input error!" && exit localhost_ip=`hostname -I |cut -d' ' -f1` #将自己当成服务器并且把公钥传给自己 expect <<EOF set timeout spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $localhost_ip expect { "yes/no" { send "yes\n"; exp_continue} "password" { send "$password\n"} } expect eof EOF #登录一次所有的服务器,获取公钥保存到known_hosts文件中,避免其他主机登录再次询问 while read ipaddr1; do expect <<EOF set timeout spawn ssh ${username}@${ipaddr1} ':' expect { "yes/no" { send "yes\n"; exp_continue} "password" { send "$password\n"} } expect eof EOF done < "$ip_list_file" #将自己的秘钥对、known_hosts和authorized_keys文件复制到所有主机,从而达到所有主机可以互相基于秘钥验证 while read ipaddr2; do expect <<EOF set timeout spawn scp -pr .ssh/ ${username}@${ipaddr2}: expect { "yes/no" { send "yes\n"; exp_continue} "password" { send "$password\n"} } expect eof EOF done < "$ip_list_file"
pssh
pssh是一个python编写可以在多台服务器上执行命令的工具
常用选项:
- --version:查看版本
- -h:主机文件列表,内容格式”[user@]host[:port]”
- -H:主机字符串,内容格式”[user@]host[:port]”
- -l:登录使用的用户名
- -p:并发的线程数【可选】
- -o:输出的文件目录【可选】
- -e:错误输入文件【可选】
- -t:TIMEOUT 超时时间设置,0无限制【可选】
- -O:SSH的选项
- -v:详细模式
- -A:手动输入密码模式
- -x:额外的命令行参数使用空白符号,引号,反斜线处理
- -X:额外的命令行参数,单个参数模式,同-x
- -i:每个服务器内部处理信息输出
- -P:打印出服务器返回信息
# pssh -l root -h ip.txt -i "date;hostname" #批量在多台服务器上执行date和hostname命令
pscp.pssh:将本地文件批量复制到远程主机
- -v 显示复制过程
- -a 复制过程中保留常规属性
- -r 递归复制目录
# pscp.pssh -l root -h ip.txt /data/testfile /data
pslurp:将远程主机的文件批量复制到本地
- -L 指定从远程主机下载到本机的存储的目录,local是下载到本地后的名称
- -r 递归复制目录
# pslurp -l root -h ip.txt -L /data/ /etc/passwd user #批量下载服务器上的文件保存到/data目录下并且改名为user
rsync
基于ssh和rsh服务实现高效率的远程系统之间复制文件,与scp的区别是rsync只复制有更改的文件。
常用选项:
- -n 模拟复制过程
- -v 显示详细过程
- -r 递归复制目录树
- -p 保留权限
- -t 保留时间戳
- -g 保留组信息
- -o 保留所有者信息
- -l 将软链接文件本身进行复制(默认)
- -L 将软链接文件指向的文件复制
- -a 存档,不保留ACL(-A)和SELinux属性(-X)
# rsync -av /data 192.168.0.7:/data #复制/data目录和目录下的文件到另一台主机 # rsync -av /data/ 192.168.0.7:/data #只复制目录下的文件
示例:rsync+inotify实现文件同步
备份服务器:
1、准备工作
# mkdir /backup # useradd rsync -s /sbin/nologin -M # chown rsync.rsync /backup/
2、配置rsyncd
# vim /etc/rsyncd.conf uid = rsync gid = rsync use chroot = no max connections = 200 timeout = 300 pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log [backup] path = /backup/ ignore errors read only = false list = false hosts allow = 192.168.0.0/24 hosts deny = 0.0.0.0/32 auth users = rsync_backup secrets file = /etc/rsync.password # echo "rsync_backup:123456" >/etc/rsync.password # chmod 600 /etc/rsync.password
3、启动服务
# rsync --daemon # ss -tanl |grep 873 LISTEN 0 5 :::873 :::* LISTEN 0 5 *:873 *:*
数据服务器:
1、准备工作
# echo "123456" >/etc/rsync.password 创建虚拟用户密码文件 # chmod 600 /etc/rsync.password # rsync -avz test.txt [email protected]::backup --password-file=/etc/rsync.password #测试rsync daemon是否就绪 # yum -y install inotify-tools
2、编写监控脚本
# vim chkfile.sh #!/bin/bash host=192.168.0.9 #备份服务器的ip地址 src=/data/ #本地监控的目录 dst=backup #备份服务器的rsync服务的模块名 user=rsync_backup #备份服务器的rsync服务的虚拟用户 rsync_passfile=/etc/rsync.password #本地调用rsync服务的密码文件 [ -z "$src" -o -z "${rsync_passfile}" ] && echo "Check File and Folder" && exit /usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib $src | while read file; do cd $src && rsync -aruz -R --delete ./ --timeout=100 $user@$host::$dst --password-file=${rsync_passfile} >/dev/null 2>&1 done
3、监控并测试
# chmod +x chkfile.sh # ./chkfile.sh &
个人学习笔记 2018-05-19 17:51:18