使用Paramiko执行sudo docker logs命令报错:无TTY及askpass程序
解决Paramiko执行sudo Docker命令时的tty缺失问题
你遇到的sudo: no tty present and no askpass program specified错误,是因为sudo默认要求在交互式终端(tty)中输入密码,而Paramiko默认执行命令时不会分配tty,同时你也没有提供密码输入渠道。下面是几种可行的解决办法:
方法1:分配tty并通过stdin输入密码
修改代码,在exec_command中添加get_pty=True参数分配终端,然后通过标准输入写入sudo密码:
def test_read_ssh(): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(IPAddress, username='usr', password='pwd') # 分配tty并执行sudo docker命令 ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command( 'sudo docker logs -f 16e --tail 100', get_pty=True ) # 写入sudo密码,末尾必须加换行符触发执行 ssh_stdin.write('pwd\n') ssh_stdin.flush() # 读取日志内容 container_logs = ssh_stdout.read().decode("utf-8") # 清理连接 ssh.close()
注意:
get_pty=True会让输出包含sudo的密码提示文本(如[sudo] password for usr:),如果需要纯日志内容,可以对container_logs做字符串过滤。- 确保密码字符串末尾添加
\n,否则sudo会一直等待输入。
方法2:修改sudoers配置免密执行docker命令
这是更安全、稳定的方案,避免在代码中硬编码密码。在远程主机上执行以下操作:
- 运行
sudo visudo编辑sudoers配置文件 - 添加一行配置(替换
usr为你的用户名,/usr/bin/docker为实际docker路径,可通过which docker查看):usr ALL=(ALL) NOPASSWD: /usr/bin/docker - 保存并退出编辑器
之后原代码无需修改,直接执行sudo docker ...命令即可获取日志,不需要处理tty和密码输入。
方法3:使用交互式shell会话(不推荐)
如果需要更复杂的交互式操作,可以用Paramiko的invoke_shell建立会话,但这种方式需要处理更多输入输出同步逻辑,不如前两种方法简洁高效,这里不展开细节。
内容的提问来源于stack exchange,提问作者KBNanda
相关产品推荐
相关产品推荐

