mirror of https://github.com/cowrie/cowrie.git
122 lines
3.6 KiB
Python
122 lines
3.6 KiB
Python
|
# Copyright (c) 2009 Upi Tamminen <desaster@gmail.com>
|
||
|
# See the COPYRIGHT file for more information
|
||
|
|
||
|
from kippo.core.honeypot import HoneyPotCommand
|
||
|
from kippo.core.fs import *
|
||
|
import stat, time
|
||
|
|
||
|
commands = {}
|
||
|
|
||
|
class command_ls(HoneyPotCommand):
|
||
|
|
||
|
def uid2name(self, uid):
|
||
|
if uid == 0:
|
||
|
return 'root'
|
||
|
return uid
|
||
|
|
||
|
def gid2name(self, gid):
|
||
|
if gid == 0:
|
||
|
return 'root'
|
||
|
return gid
|
||
|
|
||
|
def call(self):
|
||
|
path = self.honeypot.cwd
|
||
|
paths = []
|
||
|
if len(self.args):
|
||
|
for arg in self.args:
|
||
|
if not arg.startswith('-'):
|
||
|
paths.append(self.honeypot.fs.resolve_path(arg,
|
||
|
self.honeypot.cwd))
|
||
|
|
||
|
self.show_hidden = False
|
||
|
func = self.do_ls_normal
|
||
|
for x in self.args:
|
||
|
if x.startswith('-') and x.count('l'):
|
||
|
func = self.do_ls_l
|
||
|
if x.startswith('-') and x.count('a'):
|
||
|
self.show_hidden = True
|
||
|
|
||
|
if not paths:
|
||
|
func(path)
|
||
|
else:
|
||
|
for path in paths:
|
||
|
func(path)
|
||
|
|
||
|
def do_ls_normal(self, path):
|
||
|
try:
|
||
|
files = self.honeypot.fs.list_files(path)
|
||
|
except:
|
||
|
self.honeypot.writeln(
|
||
|
'ls: cannot access %s: No such file or directory' % path)
|
||
|
return
|
||
|
if not len(files):
|
||
|
return
|
||
|
l = [x[A_NAME] for x in files \
|
||
|
if self.show_hidden or not x[A_NAME].startswith('.')]
|
||
|
if not l:
|
||
|
return
|
||
|
count = 0
|
||
|
maxlen = max([len(x) for x in l])
|
||
|
perline = int(self.honeypot.user.windowSize[1] / (maxlen + 1))
|
||
|
if self.show_hidden:
|
||
|
l.insert(0, '..')
|
||
|
l.insert(0, '.')
|
||
|
for f in l:
|
||
|
if count == perline:
|
||
|
count = 0
|
||
|
self.nextLine()
|
||
|
self.write(f.ljust(maxlen + 1))
|
||
|
count += 1
|
||
|
self.nextLine()
|
||
|
|
||
|
def do_ls_l(self, path):
|
||
|
try:
|
||
|
files = self.honeypot.fs.list_files(path)[:]
|
||
|
except:
|
||
|
self.honeypot.writeln(
|
||
|
'ls: cannot access %s: No such file or directory' % path)
|
||
|
return
|
||
|
|
||
|
largest = 0
|
||
|
if len(files):
|
||
|
largest = max([x[A_SIZE] for x in files])
|
||
|
|
||
|
# FIXME: should grab these off the parents instead
|
||
|
files.insert(0,
|
||
|
['..', T_DIR, 0, 0, 4096, 16877, time.time(), [], None])
|
||
|
files.insert(0,
|
||
|
['.', T_DIR, 0, 0, 4096, 16877, time.time(), [], None])
|
||
|
for file in files:
|
||
|
perms = ['-'] * 10
|
||
|
|
||
|
if file[A_MODE] & stat.S_IRUSR: perms[1] = 'r'
|
||
|
if file[A_MODE] & stat.S_IWUSR: perms[2] = 'w'
|
||
|
if file[A_MODE] & stat.S_IXUSR: perms[3] = 'x'
|
||
|
|
||
|
if file[A_MODE] & stat.S_IRGRP: perms[4] = 'r'
|
||
|
if file[A_MODE] & stat.S_IWGRP: perms[5] = 'w'
|
||
|
if file[A_MODE] & stat.S_IXGRP: perms[6] = 'x'
|
||
|
|
||
|
if file[A_MODE] & stat.S_IROTH: perms[7] = 'r'
|
||
|
if file[A_MODE] & stat.S_IWOTH: perms[8] = 'w'
|
||
|
if file[A_MODE] & stat.S_IXOTH: perms[9] = 'x'
|
||
|
|
||
|
if file[A_TYPE] == T_DIR:
|
||
|
perms[0] = 'd'
|
||
|
|
||
|
perms = ''.join(perms)
|
||
|
ctime = time.localtime(file[A_CTIME])
|
||
|
|
||
|
l = '%s 1 %s %s %s %s %s' % \
|
||
|
(perms,
|
||
|
self.uid2name(file[A_UID]),
|
||
|
self.gid2name(file[A_GID]),
|
||
|
str(file[A_SIZE]).rjust(len(str(largest))),
|
||
|
time.strftime('%Y-%m-%d %H:%M', ctime),
|
||
|
file[A_NAME])
|
||
|
|
||
|
self.honeypot.writeln(l)
|
||
|
commands['/bin/ls'] = command_ls
|
||
|
|
||
|
# vim: set sw=4 et:
|