文章目录
13.1某企业要对两台服务器做双机互信,编写脚本解决
- 编写脚本 vim ssh.exp
1 #!/usr/bin/expect
2
3 set user [lindex $argv 0] #目标服务器登录用户
4 set iddr [lindex $argv 1] #目标服务器IP
5 set pass [lindex $argv 2] #目标服务器登录用户的密码
6
7 spawn ssh-keygen #监控秘钥生成
8 expect "(/root/.ssh/id_rsa):"
9 send "\r"
10 expect "passphrase):"
11 send "\r"
12 expect "again:"
13 send "\r"
14
15 spawn ssh-copy-id $user@$iddr #监控传输公钥
16 expect "(yes/no)?" #捕获关键字
17 send "yes\r"
18 expect "password:"
19 send "$pass\r" #发送服务器登录用户的密码
20 #expect eof
21 interact
测试:
客户端 ssh root@192.168.253.200,无需输入密码直接登陆
13.2. ssh连接速度慢的原因有哪些?
-
UseDNS no ,指定是否将客户端主机名解析为IP,该项影响主机验证阶段,未配置DNS解析时改为no,可减少主机验证阶段的时间。
-
GSSAPIAuthentication no ,指定是否开启SSAPI身份认证机制,该项影响身份验证阶段,不需要用到改为no,减少身份验证阶段的时间。
解决方法:
修改服务端配置文件: /etc/ssh/sshd_config :将UseDNS 、GSSAPIAuthentication 设置为 no
13.3. ssh如何实现访问控制
- 通过修改/etc/ssh/sshd_config配置文件,限制用户通过ssh访问
文件规则:
allowusers *@172.16.200.222 #内容格式
denyusers *@* #表示禁止所有用户通过ssh登录
allowusers *@172.16.200.222 #表示允许所用用户并且源地址是172.16.200.222的用户登录
- 例:在sshd_config中添加(本机IP:192.168.253.200):
denyusers *@192.16.253.199 #禁止源地址是192.168.253.199的所有用户通过ssh登录
- 重启sshd服务
systemctl restart sshd
测试文件修改完成后尝试用非法地址(在192.168.253.199上ssh访问)访问设置成功的机器
13.4. 使用SecureCRT或Xeshell实现代理转发连接ssh服务器
-
配置注意事项:
- 保证跳板机和目的服务器都开启密钥登录(PubkeyAuthentication yes);
- 将本地用户的公钥分发到跳板机和目的机器上(/home/gentoo/.ssh/authorized_keys);
- 运维人员本地的Xeshell中做好密钥对相关配置;
-
本地Xeshell的配置
-
选择秘钥和登陆的用户
13.5.使用跳板机一键登录目标服务器
-
Xshell增加一个对话,填写host(要连接的主机IP)
-
配置认证的方式–密钥认证,并创建密钥
-
选择KEY相应的类型与长度
-
Xshell自动创建密钥文件
-
设置密钥文件名,这里先不为密钥设置密码
-
保存公钥文件(记住路径)
-
选择刚刚创建的私钥
-
选择秘钥和设置登陆的用户
-
接下来,把生成的公钥上传到服务器了。我们直接用Xshell自带的一个sftp功能来上传我们生成的文件
设置一下本地的工作目录(保存公钥的路径),方便我们上传文件
-
用sftp来连接远程的服务器,然后上传我们的公钥文件,这时候不要选择秘钥登陆,因为我们还没有进行配置,所以必需使用密码登陆
Xshell:\> sftp root@192.168.253.200
- 向服务器传文件(保存在/root/目录下)
put id_rsa_2048.pub
- 接下来,用SSH的普通方法(用户名和密码)登陆服务器
ssh root@192.168.253.200
- 然后修改我们服务器的 .ssh/sshd_config配置文件,启用密钥认证 – PubkeyAuthentication yes
将上传的公钥重定向到密钥认证文件 .ssh/authorized_keys
cat /root/id_rsa_2048.pub >> .ssh/authorized_keys
- 重启sshd服务,service sshd restart;
exit,这时候,你就可以重新换用密钥方式一键登陆目标服务器了,已经无需输入任何密码。
13.6. 将本地/var/log目录文件同步到远程主机的/data/log目录中
- 客户端、服务端:
yum install rsync
- 客户端推送文件 /var/log :
rsync -av /var/log root@192.168.253.200:/data/log
- 服务端查看:
13.7. 配置rsync服务推动/var/log目录文件到rsync服务器指定模块中
- 配置rsyncd服务器:
- 创建配置文件
vim /etc/rsyncd.conf
- 内容:
uid = rsync #客户端连接到服务端后服务端进程执行者
gid = rsync #执行组
use chroot = no #是否可以切换到root目录
max connections = 10
timeout 300
strict modes = yes
pid file = /var/run/rsyncd.pid #pid文件
lock file = /var/run/rsyncd.lock #锁文件,保持文件一致性
log file = /var/log/rsyncd.log #日志文件
#模块定义
[backmod] #模块名称
path = /backup #备份目录
comment = backup file #模块说明
ignore errors #忽略错误
read only = no #可写
hosts allow = * #允许
#hosts deny = 172.16.1.1 #拒绝
list = false #能否被列表
auth users = alice #用来进行同步的用户,不需要系统用户中有,虚拟的就行
secrets file = /etc/rsync.passwd #用户帐号密码文件(权限必须是600)
- 创建密码文件并修改权限为600
vim /etc/rsync.passwd:alice:123456
chmod 600 /etc/rsync.passwd
- 创建共享目录并授权
mkdir /backup
chown -R rsync.rsync /backup
- 启动脚本
由一个超级进程负责管理的守护进程
rsync --daemon --config=/etc/rsyncd.conf
- 加入开机自动启动脚本
echo "/usr/bin/rsync --daemon" >> /etc/rc.local
- rsync客户端
- 配置密码文件
vim /etc/rsync.passwd:123456
- 推送文件
rsync -av /var/log rsync://alice@192.168.253.200/backmod --password-file=/etc/rsync.passwd
13.8. 实时同步/var/log目录下的文件(参考优化后的版本,并读懂做好注释)
- 客户端创建脚本(被同步的一端为服务端,要把文件同步到另一端的源端为客户端):
vim bakup.sh
- 内容:
1 #!/bin/bash
2 src=/data/ # 客户端需要同步的源路径
3 des=backmod #服务器上 rsync --daemon 发布的模块名称
4 rsync_passwd_file=/etc/rsync.passwd # rsync验证的密码文件
5 ip1=192.168.253.200 # 目标服务器
6 user=root # rsync --daemon定义的验证用户名
7 cd ${src} # 由于rsync同步的特性,这里必须要先cd到源目录,inotify再监听
8 /usr/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file # 把监控到有发生更改的"文件路径列表"循环
9 do
10 INO_EVENT=$(echo $file | awk '{print $1}') # inotify输出格式为:事件类型 文件路径(CREATE ./aa) 把事件类型部分赋值给INO_EVENT
11 INO_FILE=$(echo $file | awk '{print $2}') # 把文件路径部分赋值给INO_FILE
12 echo "-------------------------------$(date)------------------------------------"
13 echo $file
14 if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]] # 判断事件类型是否为:增加、修改、写入完成、移动进事件
15 then
16 echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
17 rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} # 同步备份文件,INO_FILE变量代表路径,-c校验文件内容
18
19 fi
20 if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]] # 判断事件类型是否为:删除、移动出事件
21 then
22 echo 'DELETE or MOVED_FROM'
23 rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} #--delete来删除目标上有而源中没有的文件
24
25 fi
26 if [[ $INO_EVENT =~ 'ATTRIB' ]] # 判断事件类型是否为:修改属性事件
27 then
28 echo 'ATTRIB'
29 if [ ! -d "$INO_FILE" ] # 如果修改属性的是目录 则不同步,因为同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync会顺带更新此目录。
30 then
31 rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}
32
33 fi
34 fi
35 done
- 增加权限且运行:
chmod +x backup.sh
./backup.sh
-
客户端打开新的窗口,在目录/data下操作文件
例1:创建文件 : touch aa
查看状态信息:
-
查看服务端/backup目录信息:
文件aa同步成功
例2:修改文件: echo “123” > aa
查看状态信息:
查看服务端/backup目录信息:
文件时间属性发生变化