Skip to content

批量执行linux命令

1、批量执行linux命令

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

image-20240522093222865

说明

这个脚本执行的前提是:

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

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

脚本内容

ip

sh
192.168.1.1192.168.1.2

ntp.sh

bash
#!/bin/bash# 打开文件file="ip"# 使用while循环逐行读取文件内容whileIFS=read-rlinedoecho"$line"done<"$file"

命令内容:

bash
fori in`bash ntp.sh`;doecho$i ;date;echo-e"\n";donefori in`bash ntp.sh`;doecho$i ;date-s"2024-05-21 01:45:00";echo-e"\n";donefori in`bash ntp.sh`;doecho$i ;hwclock-w;echo-e"\n";donefori in`bash ntp.sh`;doecho$i ;hwclock;echo-e"\n";donefori in`bash ntp.sh`;doecho$i ;servicecas_monrestart;echo-e"\n";donefori in`bash ntp.sh`;doecho$i ;ntpq-p;echo-e"\n";done

执行方法

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

执行如下命令:

bash
fori in`bash ntp.sh`;doecho$i ;date;echo-e"\n";donefori in`bash ntp.sh`;doecho$i ;date-s"2024-05-21 01:45:00";echo-e"\n";donefori in`bash ntp.sh`;doecho$i ;hwclock-w;echo-e"\n";donefori in`bash ntp.sh`;doecho$i ;hwclock;echo-e"\n";donefori in`bash ntp.sh`;doecho$i ;servicecas_monrestart;echo-e"\n";donefori in`bash ntp.sh`;doecho$i ;ntpq-p;echo-e"\n";done

脚本位置

链接:https:/192.168.1.2/

linuxshell.py

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

2、批量修改主机名

https:/192.168.1.2/newName2/

https:importsysdefssh_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()# 返回结果returncmd_result.decode()#注意:# 命令列表(截取掉第一个元素)cmd_args =sys.argv[1:]# 把列表里的元素用空格连接,组成命令cmd =''.join(cmd_args)# for循环遍历列表forserver inopen(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="hostnamectl --static set-hostname {}".format(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,"has be modified success !!!")print(result)

1

3、批量修改ip

过程

bash
sed-is"/^PASS_MIN_LEN/#PASS_MIN_LEN/g"login.defssed-i'/#PASS_MIN_LEN/a\PASS_MIN_LEN 88'login.defs
bash

1、先改主机名称

2、改ip

bash
[root@gjjz126158 network-scripts]# cat ifcfg-bond0DEVICE=bond0TYPE=EthernetONBOOT=yesBOOTPROTO=staticIPADDR=10.128.xx.xxNETMASK=255.255.255.0GATEWAY=10.128.xx.1IPV6INIT=noBONDING_MASTER=yesBONDING_OPTS="mode=1 miimon=100"/etc/sysconfig/network-scripts/ifcfg-bond0sed-is"/^IPADDR/#IPADDR/g"/etc/sysconfig/network-scripts/ifcfg-bond0sed-is"/^NETMASK/#NETMASK/g"/etc/sysconfig/network-scripts/ifcfg-bond0sed-is"/^GATEWAY/#GATEWAY/g"/etc/sysconfig/network-scripts/ifcfg-bond0#echo "IPADDR=10.130.x.x">>/etc/sysconfig/network-scripts/ifcfg-bond0echo"IPADDR={}.format(newIP)">>/etc/sysconfig/network-scripts/ifcfg-bond0echo"NETMASK=255.255.255.0">>/etc/sysconfig/network-scripts/ifcfg-bond0echo"GATEWAY=10.130.x.1">>/etc/sysconfig/network-scripts/ifcfg-bond0

image-20231123150545184

image-20231123154206633

脚本得优化下。。

第2个机器没生效。。。

image-20231123154226980

image-20231123154255385

改进:删除干净ip配置(测试失败)

bash
sed命令如何删除以某个单词开头的行?使用sed命令删除以某个单词开头的行,可以使用正则表达式来匹配。下面是一个示例命令:sed'/^word/d'file.txt在上述命令中,"word"是你要删除的行开头的单词,"file.txt"是你要操作的文件名。该命令将删除文件中以"word"开头的所有行。请注意,这里的匹配是区分大小写的。如果你想不区分大小写地进行匹配,可以使用sed命令的-i选项来进行不区分大小写的替换:sed-i'/^word/d'file.txt上述命令将直接在文件中进行替换操作。如果你想要备份原始文件,可以在-i选项之后添加一个文件扩展名,例如:sed-i.bak'/^word/d'file.txt上述命令将在进行替换操作的同时备份原始文件,并添加".bak"作为文件扩展名。汇总:sed'/^word/d'file.txt
bash
[root@xxxxx network-scripts]# cat ifcfg-bond0DEVICE=bond0TYPE=EthernetONBOOT=yesBOOTPROTO=staticIPADDR=10.128.xxx.xxxNETMASK=255.255.255.0GATEWAY=10.128.xxxx.1IPV6INIT=noBONDING_MASTER=yesBONDING_OPTS="mode=1 miimon=100"/etc/sysconfig/network-scripts/ifcfg-bond0sed'/^IPADDR/d'/etc/sysconfig/network-scripts/ifcfg-bond0sed'/^NETMASK/d'/etc/sysconfig/network-scripts/ifcfg-bond0sed'/^GATEWAY/d'/etc/sysconfig/network-scripts/ifcfg-bond0#echo "IPADDR=10.130.x.x">>/etc/sysconfig/network-scripts/ifcfg-bond0echo"IPADDR={}.format(newIP)">>/etc/sysconfig/network-scripts/ifcfg-bond0echo"NETMASK=255.255.255.0">>/etc/sysconfig/network-scripts/ifcfg-bond0echo"GATEWAY=10.130.x.1">>/etc/sysconfig/network-scripts/ifcfg-bond0

image-20231123154451119

失败:

image-20231123154500753

改进:重启网络(测试失败)

如何让一条linux命令放在后台执行?

要将一条Linux命令放在后台执行,你可以在命令的末尾加上&符号。这将使命令在后台运行,而不会阻塞终端,让你可以继续在终端输入其他命令。

例如,假设你要运行一个长时间执行的脚本文件script.sh,你可以这样执行它:

./script.sh &

在这个例子中,script.sh将会在后台运行,不会阻塞当前的终端会话。你可以继续在终端输入其他命令,而script.sh会持续在后台执行。

请注意,一旦你将命令放在后台执行,它将不再在终端上显示输出。如果你希望将输出保存到文件中,可以使用重定向操作符>将输出写入到文件中,例如:

./script.sh >output.txt &

上述命令将脚本的输出保存到output.txt文件中,同时将脚本放在后台执行。

image-20231123154527823

最终脚本

https:importsysdefssh_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()# 返回结果returncmd_result.decode()#注意:# 命令列表(截取掉第一个元素)cmd_args =sys.argv[1:]# 把列表里的元素用空格连接,组成命令cmd =''.join(cmd_args)# for循环遍历列表forserver inopen(r'ip.txt'):ip=server.split("/")[1]value=server.split("/")[2]newIP=server.split("/")[3]# print(ip)# print(value)#更改ipresult =ssh_exec_cmd(hostname=ip,port=5151,username='root',password='你的密码',command='sed -i s"/^IPADDR/#IPADDR/g"/etc/sysconfig/network-scripts/ifcfg-bond0')result =ssh_exec_cmd(hostname=ip,port=5151,username='root',password='你的密码',command='sed -i s"/^NETMASK/#NETMASK/g"/etc/sysconfig/network-scripts/ifcfg-bond0') result =ssh_exec_cmd(hostname=ip,port=5151,username='root',password='你的密码',command='sed -i s"/^GATEWAY/#GATEWAY/g"/etc/sysconfig/network-scripts/ifcfg-bond0')result =ssh_exec_cmd(hostname=ip,port=5151,username='root',password='你的密码',command='echo "IPADDR={}">>/etc/sysconfig/network-scripts/ifcfg-bond0'.format(newIP)) result =ssh_exec_cmd(hostname=ip,port=5151,username='root',password='你的密码',command='echo "NETMASK=255.255.255.0">>/etc/sysconfig/network-scripts/ifcfg-bond0')result =ssh_exec_cmd(hostname=ip,port=5151,username='root',password='你的密码',command='echo "GATEWAY=xxxxx.1">>/etc/sysconfig/network-scripts/ifcfg-bond0') result =ssh_exec_cmd(hostname=ip,port=5151,username='root',password='你的密码',command='systemctl restart network') print(ip,"ok")

image-20231012112935071

当时重启网络命令测试失败,最后直接重启服务器了。

1