return r
class Multiplex:
- def __init__(self,cmd=None):
+ def __init__(self):
signal.signal(signal.SIGCHLD, signal.SIG_IGN)
- self.cmd=cmd
self.proc={}
self.lock=threading.RLock()
self.thread=threading.Thread(target=self.loop)
orig=getattr(self,name)
setattr(self,name,SynchronizedMethod(self.lock,orig))
self.thread.start()
- def create(self,w=80,h=25):
+ def create(self,cmd,w=80,h=25):
pid,fd=pty.fork()
if pid==0:
try:
os.close(i)
except OSError:
pass
- if self.cmd:
- cmd=['/bin/sh','-c',self.cmd]
- elif os.getuid()==0:
- cmd=['/bin/login']
- else:
- sys.stdout.write("Login: ")
- login=sys.stdin.readline().strip()
- if re.match('^[0-9A-Za-z-_. ]+$',login):
- cmd=['ssh']
- cmd+=['-oPreferredAuthentications=keyboard-interactive,password']
- cmd+=['-oNoHostAuthenticationForLocalhost=yes']
- cmd+=['-oLogLevel=FATAL']
- cmd+=['-F/dev/null','-l',login,'localhost']
- else:
- os._exit(0)
env={}
env["COLUMNS"]=str(w)
env["LINES"]=str(h)