You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python通过SSH远程CentOS并以sudo权限修改网卡配置文件

解决Paramiko通过普通用户sudo修改CentOS网卡配置的问题

我帮你梳理下这个问题的解决办法,毕竟用Paramiko处理sudo切换确实容易踩坑——默认的exec_command没法直接处理交互式的sudo密码输入,而且直接编辑文件还得考虑非交互式操作的问题,下面给你两种靠谱的方案:

方案1:配置sudo免密(推荐,更稳定安全)

这种方式不需要在脚本里处理密码,而且权限更可控,步骤如下:

  • 登录目标CentOS机器的普通用户,执行sudo visudo编辑sudoers文件(一定要用visudo,避免语法错误锁死sudo)
  • 在文件末尾添加一行,替换成你的用户名:
    your_username ALL=(ALL) NOPASSWD: /usr/bin/sed -i 's/ONBOOT=yes/ONBOOT=no/' /etc/sysconfig/network-scripts/ifcfg-eth1
    
    这行的意思是允许your_username免密执行这个特定的sed命令,比给全sudo权限安全得多。
  • 保存退出后,脚本里直接执行sudo命令即可,示例代码:
    import paramiko
    
    def update_network_config(host, user, passwd):
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        try:
            ssh.connect(host, username=user, password=passwd)
            # 直接执行免密sudo的sed命令
            stdin, stdout, stderr = ssh.exec_command(
                "sudo sed -i 's/ONBOOT=yes/ONBOOT=no/' /etc/sysconfig/network-scripts/ifcfg-eth1"
            )
            # 获取输出和错误信息
            out = stdout.read().decode()
            err = stderr.read().decode()
            if err:
                print(f"Host {host} error: {err}")
            else:
                print(f"Host {host} ONBOOT updated successfully")
        except Exception as e:
            print(f"Failed to connect to {host}: {str(e)}")
        finally:
            ssh.close()
    
    # 调用示例
    update_network_config("192.168.1.100", "your_user", "your_pass")
    

方案2:脚本内处理sudo密码输入(适合临时场景)

如果没法配置免密,就得用交互式shell来处理sudo的密码提示,示例代码如下:

import paramiko
import time

def update_onboot_with_sudo(hostname, user, user_pass, sudo_pass):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        ssh.connect(hostname, username=user, password=user_pass)
        # 创建交互式shell会话
        shell = ssh.invoke_shell()
        # 发送sudo修改命令
        shell.send("sudo sed -i 's/ONBOOT=yes/ONBOOT=no/' /etc/sysconfig/network-scripts/ifcfg-eth1\n")
        time.sleep(0.5)  # 等待提示符出现,根据网络情况调整
        
        # 读取输出,判断是否需要输入密码
        output = shell.recv(1024).decode()
        if "[sudo] password for" in output:
            shell.send(f"{sudo_pass}\n")
            time.sleep(0.5)
        
        # 获取最终执行结果
        final_output = shell.recv(4096).decode()
        print(f"Host {hostname} execution result:\n{final_output}")
    except Exception as e:
        print(f"Error processing {hostname}: {str(e)}")
    finally:
        ssh.close()

# 调用示例
update_onboot_with_sudo("192.168.1.101", "test_user", "user_pass123", "sudo_pass456")

注意事项

  • 优先用sed这种非交互式命令修改配置,比用vi/vim编辑要简单得多,避免处理编辑器的交互逻辑。
  • 交互式shell的time.sleep时间可能需要根据目标机器的响应速度调整,避免因为等待时间不够导致命令发送时机不对。
  • 一定要确保普通用户有sudo权限,并且目标文件的权限允许sudo用户修改。

内容的提问来源于stack exchange,提问作者saikumarmacha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:32:39