【问题标题】:Sending a command in Paramiko as sudo在 Paramiko 中作为 sudo 发送命令
【发布时间】:2023-11-19 15:55:01
【问题描述】:

如何以 sudo 用户身份通过​​ Paramiko 在 linux 机器中运行命令并发送 sudo 密码 alomg,然后获取输出? 我尝试了以下代码,但由于它没有返回输出(我尝试测试 ls -l /root)我不确定它是否有效。

stdin, stdout, stderr =         ssh.exec_command("sudo ls -l")
stdin.write('sudo_password\n')
stdin.flush()
Output = stdout.read.splitlines()

第二个问题是,我的理解是我们不能在第一个命令中“sudo -s”,然后以 root 身份运行下一个命令,而我们首先使用非 root 命令启动会话,对吗? (想象一下盒子上没有root密码)

什么是功能代码以 sudo 发送命令,然后提供密码并获取输出?

对多个命令执行相同操作的功能代码是什么?我们可以发送一次密码,然后将其用于其余命令吗?

【问题讨论】:

  • 您是否尝试读取错误输出?这对shell有效吗? ssh user@host sudo ls -l? (作为单行行)
  • 马丁!您提到的命令将返回以下内容: ssh ubuntu@host sudo ls -l 密码: sudo:需要终端才能读取密码;使用 -S 选项从标准输入读取或配置 askpass 帮助程序
  • 那么您是否尝试过它的建议?

标签: command sudo paramiko


【解决方案1】:

感谢大家花时间发布他们的答案。 这个问题有一个直截了当的答案,这里是:

command = 'echo "sudo-password" | sudo <the-command-to-run-as-sudo>'
stdin, stdout, stderr = SESSION.exec_command(command)
stdout = stdout.read().decode()

示例命令:

command = 'echo "123456" | sudo ls-l /root'
stdin, stdout, stderr = SESSION.exec_command(command)
stdout = stdout.read().decode()

【讨论】:

  • 如果你得到“需要一个终端来读取密码”,那么我无法想象它是如何独立工作的,除非你改变了sudo 配置. stdin.write('sudo_password\n')echo "sudo-password" | sudo ... 之间没有技术上的区别
【解决方案2】:

目标系统上的sudo 配置为需要terminal emulation 来提示密码。

它建议您使用-S 开关来允许从标准输入输入密码(您的代码尝试执行的操作)。那就这样做吧。

【讨论】: