跳到主要内容

0、批量执行linux命令

批量执行linux命令

范例-shell版-linux批量执行命令(基于免密环境的)-2024.5.22

image-20240522093222865

说明

这个脚本执行的前提是:

脚本放置机器已经做好了对目标机器的免密配置;

另外,这个脚本是经过实际工作验证成功的;

脚本内容

ip

192.168.1.1
192.168.1.2

ntp.sh

#!/bin/bash

# 打开文件
file="ip"

# 使用while循环逐行读取文件内容
while IFS= read -r line
do
echo "$line"

done < "$file"

命令内容:

for i in `bash ntp.sh`; do echo $i ;date; echo -e "\n"; done

for i in `bash ntp.sh`; do echo $i ;date -s "2024-05-21 01:45:00"; echo -e "\n"; done

for i in `bash ntp.sh`; do echo $i ;hwclock -w; echo -e "\n"; done

for i in `bash ntp.sh`; do echo $i ;hwclock; echo -e "\n"; done

for i in `bash ntp.sh`; do echo $i ;service cas_mon restart; echo -e "\n"; done

for i in `bash ntp.sh`; do echo $i ;ntpq -p; echo -e "\n"; done

执行方法

将ip、ntp.sh放到做了免密的那台服务器上

执行如下命令:

for i in `bash ntp.sh`; do echo $i ;date; echo -e "\n"; done

for i in `bash ntp.sh`; do echo $i ;date -s "2024-05-21 01:45:00"; echo -e "\n"; done

for i in `bash ntp.sh`; do echo $i ;hwclock -w; echo -e "\n"; done

for i in `bash ntp.sh`; do echo $i ;hwclock; echo -e "\n"; done

for i in `bash ntp.sh`; do echo $i ;service cas_mon restart; echo -e "\n"; done

for i in `bash ntp.sh`; do echo $i ;ntpq -p; echo -e "\n"; done

脚本位置

链接:https://pan.baidu.com/s/198_50XPWkLOMDwopEcCyUw?pwd=t9sk 提取码:t9sk 范例-shell版-linux批量执行命令(基于免密环境的)-2024.5.22

image-20240522092931095

总结

这个方法虽然可行,但是一般环境是不可能存在免密的,如果有免密,那么ansible会是优先选择的;

相比而言,python脚本更适合实际工作使用的!

v4-2023.9.22-最新脚本-测试成功-荐

范例:批量远程linux机器基于不同ip配置不同信息 & 批量执行linux命令(测试成功)

img

python脚本(测试成功)

1.需求背景

有个需求:可以批量修改一些linux机器的信息,而这些信息是变化的,是基于不同ip有不同属性的。该如何通过shell/python脚本来实现?

脚本说明:

  • 批量修改主机名;
  • 批量执行linux命令;

2.编写思路

打算利用python编写这个模块。

远程ssh linux机器-->ssh模块;

基于ip信息配置不同的属性内容-->感觉需要有2个ip.txt文件,然后需要有2个for循环;

最后加上异常判断这个步骤;

这个需求实现应该不难,在原来基础上修改下即可,但是最终写出来就优点吃力了,对自己而言。

3.使用方法

  • 前提环境

目标机器是linux,且可ssh;

本地要具备python环境;

  • 测试时间

2022年12月23日(测试成功)

  • 测试环境

winodws笔记本电脑,目标linux机器;

测试脚本版本:v1-2022.12.23

  • 测试方法

(1)先查看2台测试机器的原主机名:

image-20230924213223954

(2)开始执行脚本:

image-20230924213252182

(3)验证:符合预期

image-20230924213313201

  • 2022年12月27日14:40:17 更新使用方法😘

可以同时执行2条命令就好:

image-20230924213353740

4.脚本位置

链接:https://pan.baidu.com/s/1zgWNqxnN077hZMmiCMAMhw?pwd=jrcj 提取码:jrcj

1、批量执行linux命令

image-20240522091933184

脚本详细内容:

ip.txt

/192.168.1.1/
/192.168.1.2/

linuxshell.py

import paramiko
import sys

def ssh_exec_cmd(hostname, port, username, password, command):
# 创建SSH客户端
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname=hostname, port=port, username=username, password=password)
# 执行命令
stdin, stdout, stderr = ssh.exec_command(command)
# 获取命令结果
cmd_result = stdout.read()
# 关闭连接
ssh.close()
# 返回结果
return cmd_result.decode()

#注意:
# 命令列表(截取掉第一个元素)
cmd_args = sys.argv[1:]
# 把列表里的元素用空格连接,组成命令
cmd = ' '.join(cmd_args)


# for循环遍历列表
for server in open(r'ip.txt'):
ip=server.split("/")[1]
# value=server.split("/")[2]
# print(ip)
# print(value)


# 执行命令
result = ssh_exec_cmd(hostname=ip, port=22, username='root', password='123456',command="hostname")
# result = ssh_exec_cmd(hostname=ip, port=22, username='root', password='password',command='sh test.sh') #执行脚本也是没问题的
# 输出结果
print(ip,"is ok !!!")
# print(result)

v3-myssh_v2脚本-20210104(更新后)

1、首先,请确认python环境是否已安装相关模块

(如无安装,请利用pip install 模块名安装,前提是要能联网;或者利用离线方式安装相应模块)

2、如何使用此脚本?

(1)填写目标ip、账户名、密码、ssh端口:

(2)填写需要在linux机器上需要被执行的命令

特别注意:目前此版本需要保证节点ip都是可通的才行。(否则程序会卡主不往下执行的)

观察输出

范例1:测试执行单个命令:可以执行成功。

单个命令可以用;隔开;

范例2:测试linux上的某个脚本:可以执行成功。

3、次脚本需要进行优化的地方

==(1)最大问题:如果某个服务器ip不通的话,程序运行就会卡住。==

如何做到,遇到ip不通的或者执行失败的机器输出到对应的文件,执行成功的报success提示:(这种才是相对的智能化)

测试3台机器如下:

3个ip都通时,测试效果如下:

使其中一个ip不通时,再次进行测试:

测试现象,当其中一个节点不通时,后续节点没有出现在控制台上,这个就是个bug了。理论是要经过一段时间跳过去的才对。。。

(2)cmd输出的命令速度很慢。

(3)缺点:命令中不能使用变量

v2-linuxCmd脚本(别人分享-有bug)

无备注

v1-myssh-Python脚本(网上脚本)

1、首先,请确认python环境是否已安装相关模块

(如无安装,请利用pip install 模块名安装,前提是要能联网;或者利用离线方式安装相应模块)

img

2、如何使用此脚本?

1 填写目标ip、账户名、密码、ssh端口:

image-20231123143525186

2 填写需要在linux机器上需要被执行的命令

img

3 观察输出

需要修改的2处地方修改完后,直接运行程序,验证结果。

4 案例:测试执行单个命令:可以执行成功。

#单个命令可以用;隔开;

image-20231123143553377

5 案例:测试linux上的某个脚本:可以执行成功。

#Linux上的脚本:

img

#

img

3、次脚本的缺点

6 最大问题:如果某个服务器ip不通的话,程序运行就会卡主。

image-20231123144332013

img

7 cmd输出的命令速度很慢:。。。。。。

img

8 缺点:命令中不能使用变量;

image-20231123144421591

9 cmd在输出时没有关于所属主机的提示:

image-20231123144434518

1