使用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-eth1your_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
相关产品推荐
相关产品推荐

