shell脚本怎么实现A主机SSH到B主机,在从B主机SSH到C主机,然后在C主机执行ps -ef命令返回C主机的进程数

shell脚本怎么实现A主机SSH到B主机,在从B主机SSH到C主机,然后在C主机执行ps -ef命令返回C主机的进程数,第1张

假设从主机A,检查主机B上的进程,

需要在主机B上建立检查用户,例如叫x,

并设置通过public key认证登录SSH,不会可以google搜一下,

然后,在A机器上执行:

ssh x@B ~/commandsh > resulttxt

commandsh就是B机器上放置在x目录下的脚本

输出结果应该是写到了resulttxt

或者另一种写法

result=`ssh x@B ~/commandsh`

结果直接保存到result变量中了。

暂时没有linux环境,所以没有实际测试,你自己试试吧

免费提供最新Linux技术教程书籍,入门自学书籍《linux就该这么学》,为开源技术爱好者努力做得更多更好

假设从主机A,检查主机B上的进程,

需要在主机B上建立检查用户,例如叫x,

并设置通过public key认证登录SSH,不会可以google搜一下,

然后,在A机器上执行:

ssh x@B ~/commandsh > resulttxt

commandsh就是B机器上放置在x目录下的脚本。

输出结果应该是写到了resulttxt

或者另一种写法

result=`ssh x@B ~/commandsh`

结果直接保存到result变量中了。

暂时没有linux环境,所以没有实际测试,你自己试试吧

关机的情况无法远程开机,关机命令shutdown,重启命令reboot,使用步骤如下:

1、连接上相应的linux主机,进入到等待输入shell指令的linux命令行状态下。

2、其次,以重启为例,在linux命令行中输入:reboot。

3、最后,按下回车键执行shell指令,此时会看到linux主机成功重启了。

关于 Linux/UNIX 的 SHELL 高级编程,由于 SHELL 其强大、复杂的功能(例如:awk 功能、sed 功能、管道 *** 作等),这个就必须要仔细查看相关的详细 SHELL 编程的资料了。另外,还有一个必须要注意的就是:由于各种不同版本的 SHELL,其在编程语句的语法书写上也不是通用的(例如:bash、ksh、C-Shell),例如:虽然都是判断语句 if else、循环语句 while 等,但是它们的标点符号位置就是不一样的,是极为苛刻的,如果写错一个位置,SHELL 程序肯定是无法运行的。所以必须在编程之前首先考虑好到底想用哪一种版本 SHELL 来进行编程?

#!/bin/bash

while :

do

#包大小

PACKETSIZE=32

#发包数

PACKETTIMES=10

#间隔时间

INTERVAL=1

#ip列表文件位置

IPFILE=/tmp/1

#多长时间测试一次(秒)

SLEEPTIME=60

#临时文件

TMP=/tmp/pingtmp

#输出的pingtxt文件路径

OUTPUT=/tmp/pingtxt

#本机IP(这都不知道自己切JJ)

HOSTIP=1111

while read line

do

> ${TMP}

ping -c ${PACKETTIMES} -i ${INTERVAL} -s ${PACKETSIZE} $line >> ${TMP}

DELAY=`grep rtt ${TMP} | awk '{print$4}' |awk -F "/" '{print$1"/"$2"/"$3}'`

LOST=`grep loss ${TMP} |awk -F "%" '{print$1"%"}'|awk '{print $NF}' `

DATE=`date +"%Y-%m-%d %H:%M:%S"`

if  [  -z "${DELAY}"  ]

then

DELAY=none

fi

echo "################################################" >> ${OUTPUT}

echo "${DATE} ${HOSTIP} > ${line}  the min/avg/max is ${DELAY} and  packets lost ${LOST}" >> ${OUTPUT}/pingtxt

rm -rf ${TMP}

done<${IPFILE}

sleep ${SLEEPTIME}

done

= =缺点是 运行时候 要加个 /脚本 &  后台执行

| 对于初学者而言,因为没有实战经验,写不出来 Shell 脚本 很正常,如果工作了几年的运维老年还是写不出来,那就是没主动找需求,缺乏练习,缺乏经验。针对以上问题,总结了30个生产环境中经典的 Shell 脚本 ,通过这些需求案例,希望能帮助大家提升Shell编写思路,掌握编写技巧。 |

先了解下编写Shell过程中注意事项:

<pre style="margin: 0px; padding: 0px; overflow: auto; white-space: pre-wrap; color: rgb(51, 51, 51); font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">开头加解释器:#!/bin/bash

语法缩进,使用四个空格;多加注释说明。

命名建议规则:变量名大写、局部变量小写,函数名小写,名字体现出实际作用。

默认变量是全局的,在函数中变量local指定为局部变量,避免污染其他作用域。

有两个 命令 能帮助我调试脚本:set -e 遇到执行非0时退出脚本,set-x 打印执行过程。

写脚本一定先测试再到生产上。

</pre>

1、获取随机字符串或数字

<pre style="margin: 0px; padding: 0px; overflow: auto; white-space: pre-wrap; color: rgb(51, 51, 51); font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">获取随机8位字符串:

方法1:

471b94f2

方法2:

vg3BEg==

方法3:

ed9e032c

获取随机8位数字:

方法1:

23648321

方法2:

38571131

方法3:

69024815

cksum:打印CRC效验和统计字节

</pre>

2、定义一个颜色输出字符串函数

<pre style="margin: 0px; padding: 0px; overflow: auto; white-space: pre-wrap; color: rgb(51, 51, 51); font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">方法1:

function echo_color() {

if [ 2\033[0m"

elif [ 2\033[0m"

fi

}

方法2:

function echo_color() {

case 2[0m"

;;

red)

echo -e "[31;40m$2[0m"

;;

)

echo "Example: echo_color red string"

esac

}

使用方法:echo_color green "test"

function关键字定义一个函数,可加或不加。

</pre>

3、批量创建用户

<pre style="margin: 0px; padding: 0px; overflow: auto; white-space: pre-wrap; color: rgb(51, 51, 51); font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">#!/bin/bash

DATE= 1 == "green" ]; then

echo -e "[32;40m 1 == "red" ]; then

echo -e "[31;40m$2[0m"

fi

}

if [ -s USER_FILE {DATE}bak

echo_color green " {USER_FILE}- USER_FILE

echo "----------------" >> USER &>/dev/null; then

PASS= RANDOM |md5sum |cut -c 1-8)

useradd PASS |passwd --stdin USER USER_FILE

echo " USER User already exists!"

fi

done

</pre>

4、检查软件包是否安装

<pre style="margin: 0px; padding: 0px; overflow: auto; white-space: pre-wrap; color: rgb(51, 51, 51); font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">#!/bin/bash

if rpm -q sysstat &>/dev/null; then

echo "sysstat is already installed"

else

echo "sysstat is not installed!"

fi

</pre>

5、检查服务状态

<pre style="margin: 0px; padding: 0px; overflow: auto; white-space: pre-wrap; color: rgb(51, 51, 51); font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">#!/bin/bash

PORT_C= (ps -ef |grep ntpd |grep -vc grep)

if [ PS_C -eq 0 ]; then

echo "内容" | mail -s "主题" dst@examplecom

fi

</pre>

6、检查主机存活状态

<pre style="margin: 0px; padding: 0px; overflow: auto; white-space: pre-wrap; color: rgb(51, 51, 51); font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">方法1:将错误IP放到数组里面判断是否ping失败三次

IP_LIST="192168181 19216811 192168182"

for IP in NUM -le 3 ]; do

if ping -c 1 IP Ping is successful"

break

else

# echo " NUM"

FAIL_COUNT[ IP

let NUM++

fi

done

if [ {FAIL_COUNT[1]} Ping is failure!"

unset FAIL_COUNT[]

fi

done

方法2:将错误次数放到FAIL_COUNT变量里面判断是否ping失败三次

IP_LIST="192168181 19216811 192168182"

for IP in IP >/dev/null; then

echo " IP Ping is failure FAIL_COUNT -eq 3 ]; then

echo "$IP Ping is failure!"

fi

done

方法3:利用for循环将ping通就跳出循环继续,如果不跳出就会走到打印ping失败

ping_success_status() {

if ping -c 1 IP Ping is successful"

continue

fi

}

IP_LIST="192168181 19216811 192168182"

for IP in IP Ping is failure!"

done

</pre>

7、监控CPU、内存和硬盘利用率

<pre style="margin: 0px; padding: 0px; overflow: auto; white-space: pre-wrap; color: rgb(51, 51, 51); font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">1)CPU

借助vmstat工具来分析CPU统计信息。

DATE= (ifconfig eth0 |awk -F [ :]+ /inet addr/{print (vmstat |awk NR==3{print (vmstat |awk NR==3{print (vmstat |awk NR==3{print (vmstat |awk NR==3{print (( SY))

if [ DATE

Host: USE

" | mail -s "CPU Monitor" $MAIL

fi

2)内存

DATE= (ifconfig eth0 |awk -F [ :]+ /inet addr/{print (free -m |awk /Mem/{print (free -m |awk /Mem/{print 6- (( USE))

if [ DATE

Host: TOTAL,Use= FREE

" | mail -s "Memory Monitor" $MAIL

fi

3)硬盘

DATE= (ifconfig eth0 |awk -F [ :]+ /inet addr/{print (fdisk -l |awk -F [: ]+ BEGIN{OFS="="}/^Disk /dev/{printf "%s=%sG,", 3} )

PART_USE= 1,int( 6} )

for i in (echo (echo (echo USE -gt 80 ]; then

echo "

Date: IP

Total: PART= MOUNT)

" | mail -s "Disk Monitor" $MAIL

fi

done

</pre>

8、批量主机磁盘利用率监控

<pre style="margin: 0px; padding: 0px; overflow: auto; white-space: pre-wrap; color: rgb(51, 51, 51); font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">前提监控端和被监控端SSH免交互登录或者密钥登录。

写一个配置文件保存被监控主机SSH连接信息,文件内容格式:IP User Port

HOST_INFO=hostinfo

for IP in 1} (awk -v ip= 1{print HOST_INFO)

PORT= IP ip== 3} PORT IP df -h > (awk BEGIN{OFS="="}/^/dev/{print 5)} USE_RATE_LIST; do

PART_NAME= {USE_RATE#=}

if [ PART_NAME Partition usage $USE_RATE%!"

fi

done

done

</pre>

9、检查网站可用性

<pre style="margin: 0px; padding: 0px; overflow: auto; white-space: pre-wrap; color: rgb(51, 51, 51); font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">1)检查URL可用性

方法1:

check_url() {

>

可以通过设置环境变量PS1

export PS1='[\u@\h \w]$ '

从而使当前shell的提示符修改为 "[用户名@主机名 当前路径]$" 的形式,其中\u就是用户名,\h就是主机名,\w是当前路径

如果希望每次登录都是这个形式,可以把这条命令添加到/etc/profile文件最后一行。

1可以直接 ssh 1921681100 ps 不过需要去输入密码

2调用tcl中expect 自动登录

#!/usr/bin/expect

set timeout 100

#指定密码

set password 123456

set ip [lindex $argv 0]

set command [lindex $argv 1]

spawn ssh $ip

expect {

"(yes/no)" {

send "yes\n"

expect "password:"

send "$password\n"

}

"password:" {

send "$password\n"

}

}

expect "#"

send "$command\r"

expect "#"

send "exit\r"

将以上代码建一文件expectexp

执行

expect expectexp 1921681100 ps

以上就是关于shell脚本怎么实现A主机SSH到B主机,在从B主机SSH到C主机,然后在C主机执行ps -ef命令返回C主机的进程数全部的内容,包括:shell脚本怎么实现A主机SSH到B主机,在从B主机SSH到C主机,然后在C主机执行ps -ef命令返回C主机的进程数、利用shell脚本执行ssh远程另一台主机执行命令并返回命令的结果集、如何远程通过Xshell实现对linux主机的开、关机及重启等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9578701.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存