Paramiko 和 sudo

5 投票
2 回答
5013 浏览
提问于 2025-04-16 16:24

我在网上搜索了很久,想找到解决我问题的方法,但一直没有找到。

我的问题是,我似乎无法用paramiko运行sudo命令。

一开始,我尝试直接使用SSHClient().exec_command(command)这个函数来执行sudo命令,但出现了错误:

sudo: sorry, you must have a tty to run sudo

然后,按照这篇文章的建议:如何使用Paramiko执行sudo命令,我尝试了这个:

#self._ssh is the SSHClient object    
self._ssh.invoke_shell().exec_command(command)

然而,大多数时候,这个方法只给我返回:

File "pipelines/load_instance/ssh_tools.py", line 71, in executeCommand
    stdin, stdout, stderr = self._ssh.invoke_shell().exec_command(command)
  File "<absolute_path>/paramiko/channel.py", line 213, in exec_command
    self._wait_for_event()
  File "<absolute_path>/paramiko/channel.py", line 1084, in _wait_for_event
    raise e
paramiko.SSHException: Channel closed.

另外,大约40%的时间,我会收到这个错误:

File "<absolute_path>/paramiko/client.py", line 291, in connect
    sock.connect(addr)
File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 111] Connection refused

顺便提一下,我是在亚马逊云服务的EC2实例上运行这些sudo命令,所以我很困惑为什么会出现连接被拒绝的错误,因为每次运行这段代码时都是在一个全新的实例上……

另外,我使用的是paramiko 1.7.6版本。

2 个回答

0

这段代码的作用是为了处理一些特定的任务。它可能涉及到数据的输入、处理和输出。具体来说,代码块中的每一行都有它自己的功能,可能是定义变量、执行计算或者控制程序的流程。

如果你是编程小白,可以把这段代码想象成一个食谱。每一步都是为了完成一道菜,最后的结果就是你想要的东西。理解每一步的意义,就能更好地掌握整个过程。

记住,编程就像是给计算机下指令,确保它按照你的想法去做事情。即使一开始看起来有点复杂,但只要慢慢来,逐步理解,就能掌握它。

stdin, stdout, stderr = client.exec_command(cmd,  get_pty=True)
3

这是一个在最近的系统版本中常见的问题,不仅仅影响paramiko。(我前几天在把一台机器从fedora2升级到最新版本时遇到了这个问题。几个ssh/sudo管理脚本都坏掉了)

只要你能访问远程主机,就可以编辑 /etc/sudoers 文件,并把这一行注释掉:Defaults requiretty

详细信息可以查看 sudoers手册

requiretty

如果这个选项被设置,sudo命令只有在用户登录到真实的tty(终端)时才能运行。这会阻止像“rsh somehost sudo ls”这样的命令,因为rsh(1)不会分配一个tty。由于在没有tty的情况下无法关闭回显,一些地方可能会希望设置这个选项,以防止用户输入的密码被看到。这个选项默认是关闭的。

撰写回答