使用Paramiko执行大文件wget命令时出现异常求助
Paramiko代码执行无输出&命令未执行问题排查
核心问题分析
- SSH会话独立导致sudo权限不继承:两次
exec_command调用会创建独立的SSH会话,第一次sudo -i输入密码后会话直接结束,第二次带sudo的命令无法继承权限,会卡在密码输入环节,导致后续操作完全停滞。 - 标准输出读取逻辑错误:先用
_stdout.readlines()遍历输出,后续再调用_stdout.read()时,缓冲区已被清空,自然拿不到任何内容,终端无输出。 - 高危命令的执行阻塞:
dd of=/dev/sda是直接写入系统磁盘的操作,需要完整sudo权限;开启get_pty=True后,若未处理密码输入,命令会一直阻塞等待,不会执行。
修正后的代码
import paramiko import time host = "123.456.789" username = "myusername" password = "mypassword" client = paramiko.client.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(host, username=username, password=password) # 在单个会话中执行带sudo的命令,通过stdin传入密码 command = "sudo wget -O- 'https://abc.com.gz' | gunzip | dd of=/dev/sda" _stdin, _stdout, _stderr = client.exec_command(command, get_pty=True) # 传入sudo密码,完成权限验证 _stdin.write(password + '\n') _stdin.flush() # 一次性读取所有输出和错误信息 output = _stdout.read().decode() error = _stderr.read().decode() # 打印输出内容 if output: print("命令输出:\n", output) if error: print("错误信息:\n", error) # 等待命令执行完成(可根据实际操作耗时调整等待时间) time.sleep(10) client.close()
关键修正说明
- 合并SSH会话:将需要sudo的命令放在同一个
exec_command调用中,确保权限上下文连续,避免独立会话导致的权限丢失。 - 修复输出读取:一次性读取
stdout和stderr的全部内容,避免缓冲区读取冲突,同时能捕获命令执行的错误信息,方便排查问题。 - 明确权限传递:在同一个会话中通过
stdin传入sudo密码,确保命令能获得足够权限执行。
内容的提问来源于stack exchange,提问作者Philip
相关产品推荐
相关产品推荐

