mirror of https://github.com/cowrie/cowrie.git
Add tab completion for shell
git-svn-id: https://kippo.googlecode.com/svn/trunk@195 951d7100-d841-11de-b865-b3884708a8e2
This commit is contained in:
parent
73661f1146
commit
7b607acacb
|
@ -50,6 +50,9 @@ class HoneyPotCommand(object):
|
||||||
def resume(self):
|
def resume(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def handle_TAB(self):
|
||||||
|
pass
|
||||||
|
|
||||||
class HoneyPotShell(object):
|
class HoneyPotShell(object):
|
||||||
def __init__(self, honeypot):
|
def __init__(self, honeypot):
|
||||||
self.honeypot = honeypot
|
self.honeypot = honeypot
|
||||||
|
@ -143,6 +146,79 @@ class HoneyPotShell(object):
|
||||||
self.honeypot.terminal.nextLine()
|
self.honeypot.terminal.nextLine()
|
||||||
self.showPrompt()
|
self.showPrompt()
|
||||||
|
|
||||||
|
# Tab completion
|
||||||
|
def handle_TAB(self):
|
||||||
|
if not len(self.honeypot.lineBuffer):
|
||||||
|
return
|
||||||
|
l = ''.join(self.honeypot.lineBuffer)
|
||||||
|
if l[-1] == ' ':
|
||||||
|
clue = ''
|
||||||
|
else:
|
||||||
|
clue = ''.join(self.honeypot.lineBuffer).split()[-1]
|
||||||
|
try:
|
||||||
|
basedir = os.path.dirname(clue)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
if len(basedir) and basedir[-1] != '/':
|
||||||
|
basedir += '/'
|
||||||
|
|
||||||
|
files = []
|
||||||
|
tmppath = basedir
|
||||||
|
if not len(basedir):
|
||||||
|
tmppath = self.honeypot.cwd
|
||||||
|
try:
|
||||||
|
r = self.honeypot.fs.resolve_path(tmppath, self.honeypot.cwd)
|
||||||
|
except:
|
||||||
|
return
|
||||||
|
for x in self.honeypot.fs.get_path(r):
|
||||||
|
if clue == '':
|
||||||
|
files.append(x)
|
||||||
|
continue
|
||||||
|
if not x[fs.A_NAME].startswith(os.path.basename(clue)):
|
||||||
|
continue
|
||||||
|
files.append(x)
|
||||||
|
|
||||||
|
if len(files) == 0:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Clear early so we can call showPrompt if needed
|
||||||
|
for i in range(self.honeypot.lineBufferIndex):
|
||||||
|
self.honeypot.terminal.cursorBackward()
|
||||||
|
self.honeypot.terminal.deleteCharacter()
|
||||||
|
|
||||||
|
newbuf = ''
|
||||||
|
if len(files) == 1:
|
||||||
|
newbuf = ' '.join(l.split()[:-1] + \
|
||||||
|
['%s%s' % (basedir, files[0][fs.A_NAME])])
|
||||||
|
if files[0][fs.A_TYPE] == fs.T_DIR:
|
||||||
|
newbuf += '/'
|
||||||
|
else:
|
||||||
|
newbuf += ' '
|
||||||
|
else:
|
||||||
|
if len(os.path.basename(clue)):
|
||||||
|
prefix = os.path.commonprefix([x[fs.A_NAME] for x in files])
|
||||||
|
else:
|
||||||
|
prefix = ''
|
||||||
|
first = l.split(' ')[:-1]
|
||||||
|
newbuf = ' '.join(first + ['%s%s' % (basedir, prefix)])
|
||||||
|
if newbuf == ''.join(self.honeypot.lineBuffer):
|
||||||
|
self.honeypot.terminal.nextLine()
|
||||||
|
maxlen = max([len(x[fs.A_NAME]) for x in files]) + 1
|
||||||
|
perline = int(self.honeypot.user.windowSize[1] / (maxlen + 1))
|
||||||
|
count = 0
|
||||||
|
for file in files:
|
||||||
|
if count == perline:
|
||||||
|
count = 0
|
||||||
|
self.honeypot.terminal.nextLine()
|
||||||
|
self.honeypot.terminal.write(file[fs.A_NAME].ljust(maxlen))
|
||||||
|
count += 1
|
||||||
|
self.honeypot.terminal.nextLine()
|
||||||
|
self.showPrompt()
|
||||||
|
|
||||||
|
self.honeypot.lineBuffer = list(newbuf)
|
||||||
|
self.honeypot.lineBufferIndex = len(self.honeypot.lineBuffer)
|
||||||
|
self.honeypot.terminal.write(newbuf)
|
||||||
|
|
||||||
class HoneyPotProtocol(recvline.HistoricRecvLine):
|
class HoneyPotProtocol(recvline.HistoricRecvLine):
|
||||||
def __init__(self, user, env):
|
def __init__(self, user, env):
|
||||||
self.user = user
|
self.user = user
|
||||||
|
@ -182,6 +258,7 @@ class HoneyPotProtocol(recvline.HistoricRecvLine):
|
||||||
'\x04': self.handle_CTRL_D,
|
'\x04': self.handle_CTRL_D,
|
||||||
'\x15': self.handle_CTRL_U,
|
'\x15': self.handle_CTRL_U,
|
||||||
'\x03': self.handle_CTRL_C,
|
'\x03': self.handle_CTRL_C,
|
||||||
|
'\x09': self.handle_TAB,
|
||||||
})
|
})
|
||||||
|
|
||||||
def displayMOTD(self):
|
def displayMOTD(self):
|
||||||
|
@ -294,6 +371,9 @@ class HoneyPotProtocol(recvline.HistoricRecvLine):
|
||||||
def handle_CTRL_D(self):
|
def handle_CTRL_D(self):
|
||||||
self.call_command(self.commands['exit'])
|
self.call_command(self.commands['exit'])
|
||||||
|
|
||||||
|
def handle_TAB(self):
|
||||||
|
self.cmdstack[-1].handle_TAB()
|
||||||
|
|
||||||
class LoggingServerProtocol(insults.ServerProtocol):
|
class LoggingServerProtocol(insults.ServerProtocol):
|
||||||
def connectionMade(self):
|
def connectionMade(self):
|
||||||
self.ttylog_file = '%s/tty/%s-%s.log' % \
|
self.ttylog_file = '%s/tty/%s-%s.log' % \
|
||||||
|
|
Loading…
Reference in New Issue