由于特殊身份验证需要,为使用 Python Paramiko Transport class 执行的命令 (su) 提供输入
Providing input to command (su) executed using Python Paramiko Transport class due to special authentication needs
我使用 Paramiko 连接我的 unix 主机,目标是执行以下命令:
whoami
--> 这将打印 PAM 功能帐户
hostname
--> unix 服务器的主机名
sudo su
– (对于 sudo 不需要密码,它会自动转到 root 用户) --> 这将把它转到 root 用户
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,你必须调用Channel
的makefile*
方法。
这是 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)
我使用 Paramiko 连接我的 unix 主机,目标是执行以下命令:
whoami
--> 这将打印 PAM 功能帐户hostname
--> unix 服务器的主机名sudo su
– (对于 sudo 不需要密码,它会自动转到 root 用户) --> 这将把它转到 root 用户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,你必须调用Channel
的makefile*
方法。
这是 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)