由于特殊身份验证需要,为使用 Python Paramiko Transport class 执行的命令 (su) 提供输入

Providing input to command (su) executed using Python Paramiko Transport class due to special authentication needs

我使用 Paramiko 连接我的 unix 主机,目标是执行以下命令:

  1. whoami --> 这将打印 PAM 功能帐户
  2. hostname --> unix 服务器的主机名
  3. sudo su(对于 sudo 不需要密码,它会自动转到 root 用户) --> 这将把它转到 root 用户
  4. whoami --> 这应该打印 root

#1 和#2 命令工作正常,在 stdout 响应中可以看到预期的结果。

trans.auth_interactive(username='username', handler=handler)
session = trans.open_session()
stdout_data = None
stderr_data = None

(stdin, stdout, stderr) = session.exec_command("sudo su -")

command = 'whoami'
stdin.write(command + '\n')
stdin.flush()

result = stdout.readlines()
print(result)
output = str(result)
print(output)
print_hi('done')

控制台日志

INFO:paramiko.transport:Authentication (keyboard-interactive) successful!
DEBUG:paramiko.transport:[chan 0] Max packet in: 32768 bytes
DEBUG:paramiko.transport:[chan 0] Max packet out: 32768 bytes
DEBUG:paramiko.transport:Secsh channel 0 opened.
DEBUG:paramiko.transport:[chan 0] Sesch channel 0 request ok
Traceback (most recent call last):
  File "C:/Users/tpukrisi/PycharmProjects/Paramiko/paramikoppam.py", line 77, in <module>
    connect_pam_host()
  File "C:/Users/tpukrisi/PycharmProjects/Paramiko/paramikoppam.py", line 21, in connect_pam_host
    (stdin, stdout, stderr) = session.exec_command("sudo su -")
TypeError: cannot unpack non-iterable NoneType object
DEBUG:paramiko.transport:EOF in transport thread

进程已完成,退出代码为 1

谢谢 奎师那

低级 Channel.exec_command 没有 return 任何东西(与高级 SSHClient.exec_command 不同)。

如果你想获得I/O,你必须调用Channelmakefile*方法。

这是 SSHClient.exec_command 内部所做的简化代码:

chan = transport.open_session()
chan.exec_command(command)
stdin = chan.makefile_stdin("wb", bufsize)
stdout = chan.makefile("r", bufsize)
stderr = chan.makefile_stderr("r", bufsize)