2017-06-05 60 views
1

我正在使用pexpect将ssh-ing自动化成提示输入密码的远程服务器。这个过程是非常简单的,伟大工程:Pexpect和终端调整大小

child = pexpect.spawn("ssh -Y remote.server") 
child.expect(re.compile(b".*password.*")) 
child.sendline(password) 
child.interact() 

这个伟大的工程,但是,我注意到一个很烦人的怪癖,我一直无法弄清楚。当我在这个终端中使用vim时,它似乎不能正确调整大小。当直接ssh和使用vim等程序时,我可以调整我的终端窗口(本地),远程程序自动/交互式地修复列和行。我的实例不是。还有其他一些小问题,我可以解决,但这个很烦人。

我希望找到一种方法,让我的pexpect ssh会话像本地ssh会话一样行事,或者至少了解两者行为不同的原因。

回答

0

pexpect's docinteract()函数下,实际上有一个例子。就像编写C代码一样,它需要一个SIGWINCH处理程序。

import pexpect, struct, fcntl, termios, signal, sys 

def sigwinch_passthrough (sig, data): 
    s = struct.pack("HHHH", 0, 0, 0, 0) 
    a = struct.unpack('hhhh', fcntl.ioctl(sys.stdout.fileno(), 
              termios.TIOCGWINSZ , s)) 
    global p 
    p.setwinsize(a[0], a[1]) 

# Note this 'p' global and used in sigwinch_passthrough. 
p = pexpect.spawn('/bin/bash') 
signal.signal(signal.SIGWINCH, sigwinch_passthrough) 

p.interact() 
+0

哇,我应该RTFM,就在我面前。我真的对系统运行方式了解甚少,我没有看到文档的正确部分。 谢谢! – FrenchyRaoul