Created
June 27, 2018 14:55
-
-
Save MisakaMikoto-35c5/a64b19b4369eb45c07b7891512786051 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
import time | |
class FakeFileType: | |
def __init__(self, permission, user, group, size, create_time): | |
self.PERMISSION = permission | |
self.USER = user | |
self.GROUP = group | |
self.SIZE = size | |
self.CREATE_TIME = create_time | |
class FakeDirType: | |
def __init__(self, permission, user, group, create_time, files = {}): | |
self.PERMISSION = 'd' + permission | |
self.USER = user | |
self.GROUP = group | |
self.SIZE = 4096 | |
self.CREATE_TIME = create_time | |
self.FILES = files | |
class FakeBash: | |
WELCOME_MESSAGE = 'Linux vultr.guest 4.9.0-6-amd64 #1 SMP Debian 4.9.88-1 (2018-04-29) x86_64\n\ | |
\n\ | |
The programs included with the Debian GNU/Linux system are free software;\n\ | |
the exact distribution terms for each program are described in the\n\ | |
individual files in /usr/share/doc/*/copyright.\n\ | |
\n\ | |
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent\n\ | |
permitted by applicable law.' | |
HOME_DIR = '/root' | |
BASH_PREFIX = 'root@vultr:{}# ' | |
__WORK_DIR = '/root' | |
FILES_LIST = { | |
'bin': FakeDirType('rwxr-xr-x', 'root', 'root', 'Mar\t12\t02:31', { | |
'bash': FakeFileType('-rwxr-xr-x', 'root', 'root', 1099016, 'Mar\t14\t2016'), | |
'ls': FakeFileType('-rwxr-xr-x', 'root', 'root', 4444, 'Mar\t14\t2016') | |
}), | |
'root': FakeDirType('rwx------', 'root', 'root', 'Mar\t12\t02:31'), | |
'tmp': FakeDirType('rwxrwxrwt', 'root', 'root', 'Mar\t12\t02:31') | |
} | |
def show_welcome_message(self): | |
print(self.WELCOME_MESSAGE) | |
time.sleep(1) | |
def get_command(self): | |
if self.__WORK_DIR == self.HOME_DIR: | |
workdir = '~' | |
else: | |
workdir = self.__WORK_DIR | |
while True: | |
command = input(self.BASH_PREFIX.format(workdir)) | |
if command == '': | |
continue | |
return command | |
def show_command_not_found(self, command): | |
print('-bash: {}: command not found'.format(command)) | |
def bash_cd(self, command): | |
file_not_found_message = '-bash: cd: {}: No such file or directory' | |
not_dir_message = '-bash: cd: {}: Not a directory' | |
command_length = len(command) | |
if command_length == 1: | |
self.__WORK_DIR = self.HOME_DIR | |
elif command_length == 2: | |
user_input = command[1] | |
full_path = self.get_full_path(command[1]) | |
full_path_split = full_path[1:].split('/') | |
now_dictionary = None | |
if full_path == '/': | |
self.__WORK_DIR = '/' | |
return | |
for i in full_path_split: | |
if now_dictionary == None: | |
now_dictionary = self.FILES_LIST | |
check_result = self.check_dir(now_dictionary, i) | |
if check_result == None: | |
print(file_not_found_message.format(user_input)) | |
return | |
elif check_result == False: | |
print(not_dir_message.format(user_input)) | |
return | |
else: | |
now_dictionary = check_result | |
self.__WORK_DIR = full_path | |
else: | |
print('-bash: cd: too many arguments') | |
def check_dir(self, now_dictionary, target): | |
try: | |
tmp_dir = now_dictionary[target] | |
if type(tmp_dir) != FakeDirType: | |
return False | |
return tmp_dir.FILES | |
except KeyError: | |
return None | |
def get_dir(self, target): | |
full_path = self.get_full_path(target) | |
full_path_split = full_path[1:].split('/') | |
now_dictionary = None | |
if full_path == '/': | |
self.__WORK_DIR = '/' | |
return self.FILES_LIST | |
for i in full_path_split: | |
if now_dictionary == None: | |
now_dictionary = self.FILES_LIST | |
check_result = self.check_dir(now_dictionary, i) | |
if check_result == None: | |
return None | |
elif check_result == False: | |
return False | |
else: | |
now_dictionary = check_result | |
return now_dictionary | |
def get_full_path(self, path): | |
if path[0:1] == '/': | |
return path | |
elif path[0:2] == './': | |
return self.__WORK_DIR + path[1:] | |
elif path == '.': | |
return self.__WORK_DIR | |
elif path[0:2] == '..': | |
if self.__WORK_DIR == '/': | |
return '/' | |
if path == '..' or path == '../': | |
realpath = '/' | |
for i in self.__WORK_DIR[1:].split('/')[:-1]: | |
if realpath == '/': | |
realpath = '/' + i | |
else: | |
realpath += '/' + i | |
return realpath | |
user_input_split = path[3:].split('/') | |
base_path = self.__WORK_DIR[1:].split('/')[:-1] | |
real_work_dir = '/' | |
for i in base_path: | |
if real_work_dir == '/': | |
real_work_dir = '/' + i | |
else: | |
real_work_dir += '/' + i | |
for i in user_input_split: | |
if real_work_dir == '/': | |
real_work_dir = '/' + i | |
else: | |
real_work_dir += '/' + i | |
return real_work_dir | |
else: | |
if self.__WORK_DIR == '/': | |
return '/' + path | |
return self.__WORK_DIR + '/' + path | |
def bash_echo(self, command): | |
if len(command) == 1: | |
print('') | |
return | |
echo_content = '' | |
del command[0] | |
for i in command: | |
echo_content += i + ' ' | |
print(echo_content) | |
def bash_ls(self, command): | |
no_file = 'ls: cannot access \'{}\': No such file or directory' | |
command_length = len(command) | |
if command_length == 1: | |
files_list = self.get_dir(self.__WORK_DIR) | |
files = '' | |
for k, v in files_list.items(): | |
files += k + '\t' | |
print(files) | |
return | |
elif command_length == 2: | |
userinput = command[1] | |
files_list = self.get_dir(userinput) | |
if files_list == None: | |
print('ls: cannot access \'{}\': No such file or directory'.format(userinput)) | |
return | |
elif files_list == False: | |
print(userinput) | |
return | |
files = '' | |
for k, v in files_list.items(): | |
files += k + '\t' | |
print(files) | |
else: | |
print('-bash: ls: too many arguments') | |
def run(self): | |
#self.show_welcome_message() | |
while True: | |
try: | |
command = self.get_command().split(' ') | |
except KeyboardInterrupt: | |
print('') | |
continue | |
if command[0] == 'exit': | |
return | |
elif command[0] == 'cd': | |
self.bash_cd(command) | |
continue | |
elif command[0] == 'echo': | |
self.bash_echo(command) | |
continue | |
elif command[0] == 'ls': | |
self.bash_ls(command) | |
continue | |
elif command[0] == 'pwd': | |
print(self.__WORK_DIR) | |
continue | |
else: | |
self.show_command_not_found(command[0]) | |
if __name__ == '__main__': | |
FakeBash().run() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment