Linux 如何通过某一台服务器调用执行多台远程服务器上的脚本,结果显示在本地?

现在都流行自动化运维了,可能目前技术不够,很多自动化工具还不怎么会用,所以本次只是通过ssh来实现功能。

说明:自己写的一个简单脚本,只是实现了基础功能,还有待优化。

一共三台机器:

master:192.168.4.91

slave1:192.168.4.45

slave2:192.168.4.96

在slave1上远程执行master、slave2上的脚本,结果显示或者放到本地。当然多台系统也行。

一、脚本功能主要是监控系统的一些资源,像cpu,磁盘,网速等等。System_Load.sh

[[email protected] ~]# cat System_Load.sh
#!/bin/bash
echo -e "\033[31msystem time: `date "+%Y-%m-%d %H:%M:%S"`\033[0m"
count=`ifconfig |grep Ethernet |grep ‘^e‘ |awk ‘{print $1}‘|wc -l`
for i in `ifconfig |grep Ethernet |grep ‘^e‘ |awk ‘{print $1}‘`
do
if [ $count -gt 1 ];then
em1=$i
em2=$i
else
em1=$i
fi
done
Hostname=`hostname`
em1_ip=`ifconfig $em1 |grep "inet addr" |awk ‘{print $2}‘|awk -F: ‘{print $2}‘`
echo -e "Hostname:"$Hostname "${em1}_IP:" $em1_ip

#system load and process number
echo -e "\033[31m.............cpu load average and process number..................\033[0m"
load_average=$(uptime |gawk -F‘:‘ ‘{print $NF}‘)
running_process=$(top -b -d 1 -n 1 |sed -n ‘2p‘ |awk -F‘,‘ ‘{print $2}‘ |awk ‘{print $1}‘)
total_process=$(ps -ef |wc -l)
echo "load_average: ${load_average}"
echo "running_process: ${running_process}"
echo "total_process: ${total_process}"

Host_running_time=$(uptime |sed ‘s/^.*up//‘ | awk -F "," ‘{print $1,$2}‘)
User_connection_number=$(uptime |cut -d , -f 3)
echo -e "Host_running_time:\t${Host_running_time}\t"
echo -e "User_connection_number:${User_connection_number}"

#system mem
echo -e "\033[31m.......................System Mem usage.............................\033[0m"
Total_Mem=$(free -m |sed -n ‘2p‘ |awk ‘{print $2}‘)
Usage_Mem=$(free -m |sed -n ‘2p‘ |awk ‘{print $3}‘)
Free_Mem=$(free -m |sed -n ‘2p‘ |awk ‘{print $4}‘)
Mem_Usage_Percent=`free -m |sed -n ‘2p‘|awk ‘{printf "%-1d",$3/$2*100}‘`

Swap_Total_Mem=$(free -m |sed -n ‘4p‘ |awk ‘{print $2}‘)
Swap_Usage_Mem=$(free -m |sed -n ‘4p‘ |awk ‘{print $3}‘)
Swap_Free_Mem=$(free -m |sed -n ‘4p‘ |awk ‘{print $4}‘)
Swap_Mem_Usage_Percent=`free -m |sed -n ‘4p‘|awk ‘{printf "%-1d",$3/$2*100}‘`
echo -e "Total_Mem: ${Total_Mem}M\t\t" "Usage_Mem: ${Usage_Mem}M\t"
echo -e "Free_Mem: ${Free_Mem}M\t\t" Mem_Usage_Percent: ${Mem_Usage_Percent}%
echo -e "Swap_Total_Mem: ${Swap_Total_Mem}M\t\t" "Swap_Usage_Mem: ${Swap_Usage_Mem}M\t"
echo -e "Swap_Free_Mem: ${Swap_Free_Mem}M\t\t" Swap_Mem_Usage_Percent: ${Swap_Mem_Usage_Percent}%

#Disk monitoring
echo -e "\033[31m..........................Disk usager...........................\033[0m"
sdb_usage=`df -h |grep sdb |awk ‘{print $5}‘`
echo "sdb disk usage: $sdb_usage"
sda_home_usage=`df -h |grep home |awk ‘{print $5}‘`
sda_root_usage=`df -h |grep "/$" |awk ‘{print $4}‘`
sda_var_usage=`df -h |grep "var" |awk ‘{print $5}‘`
echo "root disk usage:$sda_root_usage"
echo "home disk usage:$sda_home_usage"
echo "var disk usage:$sda_var_usage"

#网卡速率和流量监控
echo -e "\033[31m..................Network card rate and traffic.......................\033[0m"
em1_ip=`ifconfig $em1 |grep "inet addr" |awk ‘{print $2}‘|awk -F: ‘{print $2}‘`
em2_ip=`ifconfig $em2 |grep "inet addr" |awk ‘{print $2}‘|awk -F: ‘{print $2}‘`
em1_rx=`ifconfig $em1 |sed -n ‘8p‘ |awk -F ‘[()]‘ ‘{print $2}‘`
em1_tx=`ifconfig $em1 |sed -n ‘8p‘ |awk -F ‘[()]‘ ‘{print $4}‘`
em2_rx=`ifconfig $em2 |sed -n ‘8p‘ |awk -F ‘[()]‘ ‘{print $2}‘`
em2_tx=`ifconfig $em2 |sed -n ‘8p‘ |awk -F ‘[()]‘ ‘{print $4}‘`
#em1_Speed=`ethtool $em1 |grep -i speed |awk -F : ‘{print $2}‘`
#em2_Speed=`ethtool $em2 |grep -i speed |awk -F : ‘{print $2}‘`
FLOWA=/tmp/.eth1
ifconfig $em1 |grep "RX byte" |awk ‘{print $2" "$6}‘ |awk -Fbytes: ‘{print "INPUT "$2"OUTPUT "$3}‘\ > $FLOWA
INPUTA=`cat $FLOWA |awk ‘{print $2}‘`
OUTPUTA=`cat $FLOWA |awk ‘{print $4}‘`
sleep 1
ifconfig $em1 |grep "RX byte" |awk ‘{print $2" "$6}‘ |awk -Fbytes: ‘{print "INPUT "$2"OUTPUT "$3}‘\ > $FLOWA
INPUTB=`cat $FLOWA |awk ‘{print $2}‘`
OUTPUTB=`cat $FLOWA |awk ‘{print $4}‘`
INPUTC=`echo "$INPUTB-$INPUTA" | bc`
OUTPUTC=`echo "$OUTPUTB-$OUTPUTA"| bc`
INPUTMBA=`echo $INPUTC |awk ‘{printf "%0.3f\n",$1/1024}‘`
OUTPUTMBA=`echo $OUTPUTC |awk ‘{printf "%0.3f\n",$1/1024}‘`
INPUT=`echo $INPUTMBA |awk ‘{printf "%0.3f\n",$1/1024}‘`
OUTPUT=`echo $OUTPUTMBA |awk ‘{printf "%0.3f\n",$1/1024}‘`
if [ $INPUTC -le 1048576 ];then
if [ $OUTPUTC -le 1048576 ];then
echo -e "${em1}_ip: ${em1_ip}\t" "${em1}_RX: ${em1_rx}\t" "${em1}_TX: ${em1_tx} " "${em1}_Input_Second:"${INPUTMBA}K/S" "${em1}_Output_Second:"${OUTPUTMBA}K/S"
else
echo -e "${em1}_ip: ${em1_ip}\t" "${em1}_RX: ${em1_rx}\t" "${em1}_TX: ${em1_tx} " "${em1}_Input_Second:"${INPUTMBA}K/S" "${em1}_Output_Second:"${OUTPUT}M/S"
fi
elif [ $INPUTC -gt 1048576 ];then
if [ $OUTPUTC -gt 1048576 ];then
echo -e "${em1}_ip: ${em1_ip}\t" "${em1}_RX: ${em1_rx}\t" "${em1}_TX: ${em1_tx} " "${em1}_Input_Second:"${INPUT}M/S" "${em1}_Output_Second:"${OUTPUTMBA}K/S"
else
echo -e "${em1}_ip: ${em1_ip}\t" "${em1}_RX: ${em1_rx}\t" "${em1}_TX: ${em1_tx} " "${em1}_Input_Second:"${INPUT}M/S" "${em1}_Output_Second:"${OUTPUT}M/S"
fi
fi
if [ -z $em2 ];then
echo
else
FLOWA=/tmp/.eth2
ifconfig $em2 |grep "RX byte" |awk ‘{print $2" "$6}‘ |awk -Fbytes: ‘{print "INPUT "$2"OUTPUT "$3}‘\ > $FLOWA
INPUTA=`cat $FLOWA |awk ‘{print $2}‘`
OUTPUTA=`cat $FLOWA |awk ‘{print $4}‘`
sleep 1
ifconfig $em2 |grep "RX byte" |awk ‘{print $2" "$6}‘ |awk -Fbytes: ‘{print "INPUT "$2"OUTPUT "$3}‘\ > $FLOWA
INPUTB=`cat $FLOWA |awk ‘{print $2}‘`
OUTPUTB=`cat $FLOWA |awk ‘{print $4}‘`
INPUTC=`echo "$INPUTB-$INPUTA" | bc`
OUTPUTC=`echo "$OUTPUTB-$OUTPUTA"| bc`
INPUTMBA=`echo $INPUTC |awk ‘{printf "%0.3f\n",$1/1024}‘`
OUTPUTMBA=`echo $OUTPUTC |awk ‘{printf "%0.3f\n",$1/1024}‘`
INPUT=`echo $INPUTMBA |awk ‘{printf "%0.3f\n",$1/1024}‘`
OUTPUT=`echo $OUTPUTMBA |awk ‘{printf "%0.3f\n",$1/1024}‘`
if [ $INPUTC -le 1048576 ];then
if [ $OUTPUTC -le 1048576 ];then
echo -e "${em2}_ip: ${em2_ip}\t" "${em2}_RX: ${em2_rx}\t" "${em2}_TX: ${em2_tx} " "${em2}_Input_Second:"${INPUTMBA}K/S" "${em2}_Output_Second:"${OUTPUTMBA}K/S"
else
echo -e "${em2}_ip: ${em2_ip}\t" "${em2}_RX: ${em2_rx}\t" "${em2}_TX: ${em2_tx} " "${em2}_Input_Second:"${INPUTMBA}K/S" "${em2}_Output_Second:"${OUTPUT}M/S"
fi
elif [ $INPUTC -gt 1048576 ];then
if [ "$OUTPUTC" -gt 1048576 ];then
echo -e "${em2}_ip: ${em2_ip}\t" "${em2}_RX: ${em2_rx}\t" "${em2}_TX: ${em2_tx} " "${em2}_Input_Second:"${INPUT}M/S" "${em2}_Output_Second:"${OUTPUTMBA}K/S"
else
echo -e "${em2}_ip: ${em2_ip}\t" "${em2}_RX: ${em2_rx}\t" "${em2}_TX: ${em2_tx} " "${em2}_Input_Second:"${INPUT}M/S" "${em2}_Output_Second:"${OUTPUT}M/S"
fi
fi
fi
echo -e "\033[34m------------------------------END-----------------------------\033[0m"

二、拷贝脚本到其他服务器

[[email protected] monitor]# cat remote_scp.sh
#!/bin/sh
while read user ip
do
user=$user
ip=$ip
remote_cmd=/root/System_Load.sh
scp $remote_cmd [email protected]$ip:/home/hadoop
done < user_ip.txt

三、用户和IP对应列表

[[email protected] monitor]# cat user_ip.txt
root 192.168.4.91
root 192.168.4.96
root 192.168.4.45

四、远程执行

[[email protected] monitor]# cat remote_ssh.sh
#!/bin/sh
while read user ip
do
user=$user
ip=$ip
remote_cmd=/root/System_Load.sh
ssh -n [email protected]$ip $remote_cmd
done < user_ip.txt

五、结果:

上图红框里面显示空值,这是因为我测试机没有这几个磁盘分区。

原文地址:https://www.cnblogs.com/yjt1993/p/9556131.html

时间: 2024-10-29 19:51:21

Linux 如何通过某一台服务器调用执行多台远程服务器上的脚本,结果显示在本地?的相关文章

服务器常见问题,如何解决“远程服务器返回错误”?

在服务器租用中,服务器比较容易出几个问题的其中一个就是"远程服务器返回错误".下面我们看一下如何解决:一."远程服务器返回错误: (501) 未实现"的错误解决方法:Web服务扩展中的WebDAV惹得祸,将IIS的"Web服务扩展"中的"WebDAV"设置成"允许"!PS:iis6的 webdav支持 其实就是个基于http的ftp功能 ,明确iis不能直接上传文件,需要扩展支持的话应该不会饶弯路吧?二.&

shell脚本远程查看服务器运行时间(不切换到远程服务器上)

sshpass工具 sshpass可以yum安装或者下载源码包安装 -p:指定ssh的密码 -o StrictHostKeyChecking=no 避免第一次登录出现公钥检查. #!/bin/bash /usr/bin/sshpass -p linux ssh -o StrictHostKeyChecking=no [email protected] uptime|grep up |awk '{print $3}'|sed 's/,//'

连接ArcGIS服务器错误:代理服务器从远程服务器收到了错误地址

万年不在自己电脑上发服务,所以今天发服务的时候就遇到这个小问题. 第一反应,ArcGIS Server服务没开,屁颠屁颠去开了,满心欢喜,打开还是这个错误. 第二反应,ArcMap要重启,默默关闭打开,依旧这个错误. 第三反应,重启电脑,默默关闭打开,依旧这个错误. 第四反应,运行连接测试,结果显示未知错误. 第五反应,不会要重装Server吧,百度看看,中文我是没百度到什么了,那就来英文版吧(Proxy server got bad address from remote server). 结

利用SHELL脚本实现将Oracle数据库的每日EXPDP导出文件复制到远程服务器

利用SHELL脚本实现将Oracle数据库的每日EXPDP导出文件复制到远程服务器 作者:赵全文 网名:guestart 我们有一套生产环境的Oracle数据库,虽然每天都有RMAN备份,但是也招架不住开发人员隔三差五就说要恢复几张表的前几天的数据到生产环境当中,针对这样的需求,用RMAN来恢复某几张表的数据就显的特别费劲了.于是我决定用Oracle数据库的逻辑备份工具EXPDP(数据泵导出)专门导出特定用户下的所有表的数据,并在每天凌晨4点通过LINUX操作系统的CRONTAB的计划任务定时执

SQL使用链接服务器执行远程数据库上的存储过程

原文:SQL使用链接服务器执行远程数据库上的存储过程 --创建链接服务器 exec sp_addlinkedserver'server_tmp','','SQLOLEDB','远程服务器名或ip地址' exec sp_addlinkedsrvlogin'server_tmp','false',null,'用户名','密码' exec sp_serveroption'server_lnk','rpc out','true' --这个允许调用链接服务器上的存储过程 go --调用: exec ser

nodejs向远程服务器发送post请求----融云Web SDK/客户端获取token

最近要用到一个叫融云的及时通讯的SDK,在获取token这个步骤的时候有点卡顿,以防以后碰到类似的问题,再此记录一下. 客户端通过融云 SDK 每次连接服务器时,都需要向服务器提供 Token,以便验证身份,流程如下: 流程如下: 1.客户端获取用户id,并向服务器请求token(注意这里的服务器不是融云的服务器,而是客户端的服务端) 2.客户端的服务端接收到token请求后,向融云的服务器请求token 3.融云服务器接受到token请求,返回token给客户端的服务端. 4.客户端的服务端接

利用ssh-copy-id无需密码登录远程服务器

本地机器生成公钥和私钥 ssh-keygen -t rsa 一路回车,最后会在~/.ssh目录下生成id_rsa和id_rsa.pub这两个文件. 与远程服务器建立信任机制 ssh-copy-id -i /root/.ssh/id_rsa.pub -p 远程服务器ssh端口 [email protected]远程服务器IP 输入密码,成功连接后.后续再次连接就不需要密码了. 后续在本地机器通过 ssh -p 远程服务器端口 [email protected]远程服务器IP 不需要输入密码也可正常

帆软(FineReport)远程服务器管理

帆软软件支持使用客户端软件直接管理服务器 这就要求连接远程服务器,连接远程服务器之后帆软软件就像一个客户端软件一样可以直接操作服务器上的文件. (1)连接远程服务器 文件>切换工作目录>其他 填写信息: 不要填:"使用https" 这样就可以看到服务器上的内容了

邮箱连接服务器超时,不能连接远程服务器,VNC无法远程

昨天遇到一问题,用户邮箱连接服务器超时,不能连接远程服务器,VNC远程也报错,加域时错误信息里有提示未安装TCPIP协议 大致的意思就是: can't create tcp/ip socket 10106 can not open socket winsock error 10106 ping服务器什么的都是通的 解决办法就是用360修复LSP就OK了 网络上也有其它办法: 1.netsh winsock reset 然后重启,xp貌似不用 2. Winsock 10106错误解决方法事由:wi