跳到主要内容

2、批量修改ip

过程

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

1、先改主机名称

2、改ip

[root@gjjz126158 network-scripts]# cat ifcfg-bond0
DEVICE=bond0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=10.128.xx.xx
NETMASK=255.255.255.0
GATEWAY=10.128.xx.1
IPV6INIT=no
BONDING_MASTER=yes
BONDING_OPTS="mode=1 miimon=100"

/etc/sysconfig/network-scripts/ifcfg-bond0




sed -i s"/^IPADDR/#IPADDR/g" /etc/sysconfig/network-scripts/ifcfg-bond0
sed -i s"/^NETMASK/#NETMASK/g" /etc/sysconfig/network-scripts/ifcfg-bond0
sed -i s"/^GATEWAY/#GATEWAY/g" /etc/sysconfig/network-scripts/ifcfg-bond0


#echo "IPADDR=10.130.x.x" >> /etc/sysconfig/network-scripts/ifcfg-bond0
echo "IPADDR={}.format(newIP)" >> /etc/sysconfig/network-scripts/ifcfg-bond0
echo "NETMASK=255.255.255.0" >> /etc/sysconfig/network-scripts/ifcfg-bond0
echo "GATEWAY=10.130.x.1" >> /etc/sysconfig/network-scripts/ifcfg-bond0

image-20231123150545184

image-20231123154206633

脚本得优化下。。

第2个机器没生效。。。

image-20231123154226980

image-20231123154255385

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

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


[root@xxxxx network-scripts]# cat ifcfg-bond0
DEVICE=bond0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=10.128.xxx.xxx
NETMASK=255.255.255.0
GATEWAY=10.128.xxxx.1
IPV6INIT=no
BONDING_MASTER=yes
BONDING_OPTS="mode=1 miimon=100"

/etc/sysconfig/network-scripts/ifcfg-bond0




sed '/^IPADDR/d' /etc/sysconfig/network-scripts/ifcfg-bond0
sed '/^NETMASK/d' /etc/sysconfig/network-scripts/ifcfg-bond0
sed '/^GATEWAY/d' /etc/sysconfig/network-scripts/ifcfg-bond0


#echo "IPADDR=10.130.x.x" >> /etc/sysconfig/network-scripts/ifcfg-bond0
echo "IPADDR={}.format(newIP)" >> /etc/sysconfig/network-scripts/ifcfg-bond0
echo "NETMASK=255.255.255.0" >> /etc/sysconfig/network-scripts/ifcfg-bond0
echo "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://onedayxyy.cn/scripts/Batch_execution_linux_command/Batch_execution_linux_command_modify_ip/ChangeIp.py

https://onedayxyy.cn/scripts/Batch_execution_linux_command/Batch_execution_linux_command_modify_ip/ip.txt

ChangeIp.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]
newIP=server.split("/")[3]
# print(ip)
# print(value)

#更改ip
result = 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

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