paramiko创建可交互的ssh会话
paramiko创建可交互的ssh会话
python使用paramiko的SSHClient创建的ssh会话可以轻松的执行shell命令并获取结果,但是也存在一些不足,我想要执行history
命令,却发现得不到预期的history的输出,然后我了解到可以使用SSHClient的invoke_shell()函数获取一个可交互的会话,通过简单的包装,可以实现一个使用可交互式会话执行shell命令并获取执行结果的函数
import time import paramiko def invoke_shell_exec(cmd) : hostname = '192.168.1.1' username = 'root' ssh = paramiko.SSHClient() ssh.load_system_host_keys() ssh.connect(hostname=hostname, username=username) channel = ssh.invoke_shell() #获取可交互式会话 channel.settimeout(10) #设置超时抛出异常 buff = '' msg = '' #会话连接后先获取一下远程服务器返回的登录信息 while not (buff.endswith('# ') or buff.endswith('$ ')) : resp = channel.recv(1024) buff += resp.decode() msg += buff #获取完登录信息后再发送shell命令 while True : if channel.send_ready() : channel.send(cmd.encode()) break time.sleep(0.1) #再获取一下shell命令的执行结果 buff = '' while not (buff.endswith('# ') or buff.endswith('$ ')) : resp = channel.recv(1024) buff += resp.decode() msg += buff channel.close() result = msg.split('\n') return result