TFTP
TFTP(Trivial File Transfer Protocol,简单文件传输协议)也是用于在远端服务器和本地主机之间传输文件的,相对于FTP,TFTP没有复杂的交互存取接口和认证控制,适用于客户端和服务器之间不需要复杂交互的环境。TFTP协议的运行基于UDP协议,UDP 69 端口,使用UDP端口建立连接、收/发数据报文。
TFTP协议传输是由客户端发起的:
· 当TFTP客户端需要从服务器下载文件时,由客户端向TFTP服务器发送读请求包,然后从服务器接收数据,并向服务器发送确认;
· 当TFTP客户端需要向服务器上传文件时,由客户端向TFTP服务器发送写请求包,然后向服务器发送数据,并接收服务器的确认。
TFTP传输文件有两种模式:
· 二进制模式,用于传输程序文件(比如后缀名为.bin和.btm的文件)。
· ASCII码模式,用于传输文本格式的文件(比如后缀名为.txt、.bat和.cfg的文件)。
安装TFTP Server
代码语言:javascript复制yum -y install tftp-server xinetd
TFTP Server 配置文件
代码语言:javascript复制cat /etc/xinetd.d/tftp
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s -c /mnt/backup
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
创建 TFTP 存储目录赋予权限
代码语言:javascript复制mkdir -p /mnt/backup
chmod 777 -R /mnt/backup/
重启 xinetd 服务 (tftp服务是依赖于xinetd服务)
代码语言:javascript复制systemctl restart xinetd
查看TFTP 服务端口
代码语言:javascript复制netstat -auntlp |grep 69
udp 0 0 0.0.0.0:69 0.0.0.0:* 20046/xinetd
udp6 0 0 :::69 :::* 1/systemd
Firewall 配置
代码语言:javascript复制firewall-cmd --add-port=69/udp --permanent
firewall-cmd --reload
登录网络设备测试推送配置文件到TFTP 服务器(H3C 设备为例)
TFTP 服务器查看设备备份文件
bash 脚本一
案例中使用 telnet 协议,生产环境多为ssh协议,根据实际环境修改脚本。
代码语言:javascript复制cat expect06.sh
#!/usr/bin/bash
date=`date %F`
cat /mnt/shell/ip.txt | while read ip username password
do
ping -c1 -W1 $ip &>/dev/null
if [ $? -eq 0 ];then
/usr/bin/expect <<-EOF
set timeout 10
spawn telnet $ip
expect "Username:" { send "$usernamen" }
expect "Password:" { send "$passwordn" }
expect ">" { send "tftp 172.18.30.27 put startup.cfg startup.cfg_${date}_$ipn" }
expect ">" { send "quitn" }
expect eof
EOF
else
echo -e "e[1;33m$ip ICMP Ping Unavailable...e[0m"
fi
done
赋予可执行权限
代码语言:javascript复制chmod a x expect06.sh
文本文件内容
代码语言:javascript复制cat ip.txt
172.18.1.30 username password
172.18.1.14 username password
网络设备备份配置文件
bash 脚本二
将网络设备备份状态重定向到文本文件
代码语言:javascript复制cat expect07.sh
#!/usr/bin/bash
date=`date %F`
cat /mnt/shell/ip.txt | while read ip username password
do
ping -c1 -W1 $ip &>/dev/null
if [ $? -eq 0 ];then
/usr/bin/expect <<-EOF
set timeout 5
spawn telnet $ip
expect "Username:" { send "$usernamen" }
expect "Password:" { send "$passwordn" }
expect ">" { send "tftp 172.18.30.27 put startup.cfg startup.cfg_${date}_$ipn" }
expect ">" { send "quitn" }
expect eof
EOF
else
echo -e "e[1;33m$ip ICMP Ping Unavailable...e[0m"
fi
if [ -e /mnt/backup/startup.cfg_${date}_$ip ];then
echo "$date $ip success" >>/mnt/shell/device.txt
else
echo "$date $ip failed" >>/mnt/shell/device.txt
fi
done
赋予可执行权限
代码语言:javascript复制chmod a x expect07.sh
文本文件内容
代码语言:javascript复制cat ip.txt
172.18.1.30 username password
172.18.1.14 username password
172.18.1.114 username password
设备备份状态
代码语言:javascript复制cat device.txt
2020-12-15 172.18.1.13 success
2020-12-15 172.18.1.14 success
2020-12-15 172.18.1.114 failed
Zabbix 实现对网络设备备份状态监控
zabbix_sender 参数介绍
-c --config 配置文件绝对路径
-z --zabbix-server zabbix server的IP地址
-p --port zabbix server端口.默认10051
-s --host 主机名,zabbix里面配置的主机名(不是服务器的hostname),不能使用ip地址
-I --source-address 源IP
-k --key 监控项的key
-o --value key值
-i --input-file 从文件里面读取hostname、key、value 一行为一条数据,使用空格作为分隔符,如果主机名带空格,那么请使用双引号包起来
-T --with-timestamps 一行一条数据,空格作为分隔符: ,配合 --input-file option,timestamp为unix时间戳
-r --real-time 将数据实时提交给服务器
-v --verbose 详细模式, -vv 更详细
监控项
注意:后续需要根据设备IP地址新增监控项,保证监控项键值和主机的IP地址对应!!!
zabbix_sender 发送数据测试
代码语言:javascript复制zabbix_sender -z 172.18.30.27 -s Zabbix-server -k "172.18.1.30" -o sucess -vv
zabbix_sender [25857]: DEBUG: answer [{"response":"success","info":"processed: 1; failed: 0; total: 1; seconds spent: 0.000083"}]
Response from "172.18.30.27:10051": "processed: 1; failed: 0; total: 1; seconds spent: 0.000083"
sent: 1; skipped: 0; total: 1
最新数据
zabbix_sender 读取文件
代码语言:javascript复制zabbix_sender -z 172.18.30.27 -i device.txt
Response from "172.18.30.27:10051": "processed: 2; failed: 0; total: 2; seconds spent: 0.000095"
sent: 2; skipped: 0; total: 2
文本文件内容
代码语言:javascript复制cat device.txt
Zabbix-server 172.18.1.30 success
Zabbix-server 172.18.1.114 failed
最新数据
bash 脚本三
代码语言:javascript复制cat expect08.sh
#!/usr/bin/bash
>/mnt/shell/device.txt
date=`date %F`
host="Zabbix-server"
cat /mnt/shell/ip.txt | while read ip username password
do
ping -c1 -W1 $ip &>/dev/null
if [ $? -eq 0 ];then
/usr/bin/expect <<-EOF
set timeout 5
spawn telnet $ip
expect "Username:" { send "$usernamen" }
expect "Password:" { send "$passwordn" }
expect ">" { send "tftp 172.18.30.27 put startup.cfg startup.cfg_${date}_$ipn" }
expect ">" { send "quitn" }
expect eof
EOF
else
echo -e "e[1;33m$ip ICMP Ping Unavailable...e[0m"
fi
if [ -e /mnt/backup/startup.cfg_${date}_$ip ];then
echo "$host $ip success" >>/mnt/shell/device.txt
else
echo "$host $ip failed" >>/mnt/shell/device.txt
fi
done
/usr/bin/zabbix_sender -z 172.18.30.27 -i device.txt
赋予可执行权限
代码语言:javascript复制chmod a x expect08.sh
文本文件内容
代码语言:javascript复制cat ip.txt
172.18.1.30 username password
172.18.1.114 username password
设备备份状态
代码语言:javascript复制cat device.txt
Zabbix-server 172.18.1.30 success
Zabbix-server 172.18.1.114 failed
Zabbix 最新数据