Created
October 26, 2011 23:17
-
-
Save wong2/1318308 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
#-*-coding:utf-8-*- | |
from cmd import Cmd | |
import os | |
import atexit | |
from user import User | |
import getpwd | |
import sys | |
# ls | |
import stat | |
import time | |
import ctypes ### is_hidden函数里使用 | |
# cp、mv | |
import shutil | |
# alais | |
import cPickle as pickle | |
# color | |
import colorama | |
class Pash(Cmd): | |
def __init__(self, user_name): | |
Cmd.__init__(self) | |
self.app_path = os.getcwd() | |
self.aliasDataPath = self.app_path + "/" + "aliasData" | |
self.intro = "Welcome to pash" | |
self.output = {"type":"", "value":[], "redirect":""} | |
self.changeUser(user_name) | |
colorama.init() | |
# 路径改变后,需要更新提示符 | |
def updatePrompt(self): | |
self.current_path = os.getcwd() | |
self.current_path = self.current_path.replace("C:\\", "/") | |
self.prompt = "%s@SeedCup %s $ " % (self.user_name, self.current_path) | |
def changeUser(self, name): | |
self.user_name = name | |
self.do_cd("C:/") # 默认“C盘”为“/” | |
self.updatePrompt() | |
## Begin ## | |
### alias 从文件里读取 pickle 后 load | |
### 存储形式 {"wong2":{"ll":"ls -l", "catn":"cat -n"}, "HQM":{}} | |
f = open(self.aliasDataPath, "r") | |
self.aliasDataAll = pickle.load(f) | |
f.close() | |
self.aliasData = self.aliasDataAll[uname] | |
## End ## | |
# 用于高亮显示字(蓝色) | |
def printBlue(self, string): | |
print colorama.Fore.BLUE + string + colorama.Fore.RESET, | |
def printWhite(self, string): | |
print colorama.Fore.WHITE + string + colorama.Fore.RESET, | |
def printMagenta(self, string): | |
print colorama.Fore.MAGENTA + string + colorama.Fore.RESET, | |
# 如果输入的命令为空,则神马都不做 | |
def emptyline(self): | |
pass | |
# 如果是未定义的命令, 提示之 | |
def default(self, line): | |
print "unknown command: ", line, len(line) | |
### 用来判断文件(目录)是否为隐藏 | |
# From : http://stackoverflow.com/questions/284115/cross-platform-hidden-file-detection | |
### Just 处理了一下 中文 问题 | |
def is_hidden(self, filepath): | |
name = os.path.basename(os.path.abspath(filepath)) | |
return name.startswith('.') or self.has_hidden_attribute(filepath) | |
def has_hidden_attribute(self, filepath): | |
try: | |
try: | |
ufilepath = unicode(filepath) | |
except UnicodeDecodeError: | |
ufilepath = unicode(filepath, "gb2312") | |
attrs = ctypes.windll.kernel32.GetFileAttributesW(ufilepath) | |
assert attrs != -1 | |
result = bool(attrs & 2) | |
except (AttributeError, AssertionError): | |
result = False | |
return result | |
### 4.3.1 ls [path] (4’) | |
# 系统命令--ls | |
### 判断文件是否是隐藏文件夹还没搞定... | |
### 目录项以蓝色显示没搞定... | |
def do_ls(self, opt): | |
if opt =="": | |
opt = os.getcwd() | |
elif opt[0] == "/": | |
opt = "C:"+opt | |
else: | |
pass | |
isfile = os.path.exists(opt) # check opt is exist&file or not | |
if isfile: | |
lsValue = [] | |
for filename in os.listdir(opt or "."): | |
if os.path.isdir(opt+"/"+filename): | |
lsValue.append("Y"+filename) | |
else: | |
lsValue.append("N"+filename) | |
self.output.update({ | |
"type": "ls", | |
"value": lsValue | |
}) | |
else: | |
if opt[:3] == "-l " or opt[:2] == "-l": # ls -l path # 一开始写成了 opt[:3] == "-l " | |
opt = opt[3:] | |
if opt == "": | |
opt = os.getcwd() | |
elif opt[1] == "/": | |
opt = "C:"+opt | |
else: | |
pass | |
isfile = os.path.exists(opt) | |
if isfile: | |
llValue = [] | |
llValue.append("NName".ljust(18)+"Size(KB)".ljust(18)+"Last modified".ljust(18)+"Type".ljust(18)) | |
for file in os.listdir((opt or ".")): | |
path = opt + "/" + file # path of files | |
if self.is_hidden(path): | |
pass | |
else: | |
if os.path.isdir(path): | |
llValue.append("Y"+file.ljust(18)+str(os.stat(path).st_size).ljust(18)+(str(time.localtime(os.stat(path).st_ctime).tm_year)+"/"+str(time.localtime(os.stat(path).st_ctime).tm_mon)+"/"+str(time.localtime(os.stat(path).st_ctime).tm_mday)).ljust(18)+("<DIR>".ljust(18) if os.path.isdir(file) else " "*18)) | |
else: | |
llValue.append("N"+file.ljust(18)+str(os.stat(path).st_size).ljust(18)+(str(time.localtime(os.stat(path).st_ctime).tm_year)+"/"+str(time.localtime(os.stat(path).st_ctime).tm_mon)+"/"+str(time.localtime(os.stat(path).st_ctime).tm_mday)).ljust(18)+("<DIR>".ljust(18) if os.path.isdir(file) else " "*18)) | |
self.output.update({ | |
"type": "ls -l", | |
"value": llValue, | |
}) | |
else: | |
print "The path input isn't exist!!!" | |
else: | |
print "The path input isn't exist!!!" | |
def complete_ls(self, text, line, begidx, endidx): | |
text = line.rsplit()[-1] | |
text = text if "/" in text else "./" + text | |
path, prefix = text.rsplit("/", 1) | |
return [name for name in os.listdir(path+"/") | |
if name.startswith(prefix)] | |
### cp+mv 的功能实现 | |
# 提供给cp、mv调用 | |
def cpmv(self, opt, flag): | |
canCP = True | |
argList = opt.split() | |
argNum = len(argList) | |
##判断源文件(目录)是否存在## | |
##目标文件(目录)可以不存在## | |
if argNum == 3 and argList[0] == "-r": | |
if os.path.exists(argList[1]): | |
sour = argList[1] | |
if argList[2][0] == "/": | |
dest = "C:"+argList[2] | |
else: | |
dest = argList[2] | |
elif argList[0][0] == "/" and os.path.exists("C:"+argList[1]): | |
sour = "C:"+argList[1] | |
if argList[2][0] == "/": | |
dest = "C:"+argList[2] | |
else: | |
dest = argList[2] | |
else: | |
canCP = False | |
print "Sour file or dir is not exist!!!" ### 源文件或目录不存在 | |
return False | |
elif argNum == 2: | |
if os.path.exists(argList[0]): | |
if os.path.isdir(argList[0]): ### 没有 -r 命令, 则不能 cp 目录 | |
canCP = False | |
if flag == "1": | |
print "No power to copy dir!!!" | |
else: | |
print "No power to move dir!!!" | |
return False | |
else: | |
sour = argList[0] | |
if argList[1][0] == "/": | |
dest = "C:"+argList[1] | |
else: | |
dest = argList[1] | |
elif argList[0][0] == "/" and os.path.exists("C:"+argList[0]): | |
if os.path.isdir("C:"+argList[0]): ### 没有 -r 命令, 则不能 cp 目录 | |
canCP = False | |
if flag == "1": | |
print "No power to copy dir!!!" | |
else: | |
print "No power to move dir!!!" | |
return False | |
else: | |
sour = "C:"+argList[0] | |
if argList[1][0] == "/": | |
dest = "C:"+argList[1] | |
else: | |
dest = argList[1] | |
else: | |
canCP = False | |
print "Sour file or dir is not exist!!!" ### 源文件或目录不存在 | |
return False | |
else: | |
print "Parameter is not correct!!!" ### 可以分的更细,没参数,目标问及那(目录)为空...etc | |
return False | |
if canCP: | |
##判断 源文件(目录) 目标文件/目录 的类型## | |
x, y = os.path.isfile(sour), os.path.isdir(dest) ### or os.path.exists(dest) ### 目录不存在也当成目录 | |
##分别处理## | |
## | |
if (x, y) == (True, False): # sour为文件,dest为文件 | |
if os.path.exists(dest): | |
if flag == "1": | |
choice = raw_input("already exist:1、替换 2、取消复制 3、复制但不替换") | |
else: | |
choice = raw_input("already exist:1、替换 2、取消移动 3、移动但不替换") | |
if choice == "1": | |
try: | |
if flag == "1": | |
shutil.copy(sour, dest) | |
else: | |
shutil.move(sour, dest) | |
except IOException: | |
print "没有权限" | |
elif choice == "2": | |
pass | |
elif choice == "3": | |
partList = dest.split(".") ### | |
destHead = ".".join(partList[:-1]) | |
destTail = partList[-1] | |
i = 2 | |
while destHead + "("+str(i)+")" + "." + destTail in fileList: | |
i += 1 | |
try: | |
if flag == "1": | |
shutil.copy(sour, destHead + "("+str(i)+")" + "." + destTail) | |
else: | |
shutil.move(sour, destHead + "("+str(i)+")" + "." + destTail) | |
except IOException: | |
print "没有权限" | |
else: | |
try: | |
if flag == "1": | |
shutil.copy(sour, dest) | |
else: | |
shutil.move(sour, dest) | |
except IOException: | |
print "没有权限" | |
## | |
elif (x, y) == (True, True): # sour为文件,dest为目录 | |
fileList = os.listdir(dest) | |
if sour in fileList: | |
if flag == "1": | |
choice = raw_input("already exist:1、替换 2、取消复制 3、复制但不替换") | |
else: | |
choice = raw_input("already exist:1、替换 2、取消移动 3、移动但不替换") | |
if choice == "1": | |
try: | |
if flag == "1": | |
shutil.copy(sour, dest+"/"+sour) | |
else: | |
shutil.move(sour, dest+"/"+sour) | |
except IOException: | |
print "没有权限" | |
elif choice == "2": | |
pass | |
elif choice == "3": | |
partList = sour.split(".") ### | |
sourHead = ".".join(partList[:-1]) | |
sourTail = partList[-1] | |
i = 2 | |
while sourHead + "("+str(i)+")" + "." +sourTail in fileList: | |
i += 1 | |
try: | |
if flag == "1": | |
shutil.copy(sour, dest + "/" + sourHead + "("+str(i)+")" + "." +sourTail) | |
else: | |
shutil.move(sour, dest + "/" + sourHead + "("+str(i)+")" + "." +sourTail) | |
except IOException: | |
print "没有权限" | |
else: | |
pass | |
else: # 妹的,冒号搞成另一种了... | |
try: | |
if flag == "1": | |
shutil.copy(sour, dest) | |
else: | |
shutil.move(sour, dest) | |
except IOException: | |
print "没有权限" | |
## | |
elif (x, y) == (False, True): # sour为目录,dest为目录 | |
dirName = (sour.split("/"))[-1] | |
if os.path.isdir(dest+"/"+dirName) == True: ### 如果源目录在目标目录中已经存在 | |
if flag == "1": | |
choice = raw_input("already exist:1、合并目录 2、取消复制") | |
else: | |
choice = raw_input("already exist:1、合并目录 2、取消移动") | |
if choice == "1": | |
for roots, dirs, files in os.walk(sour): | |
for dirsName in dirs: | |
dirsPath = dest+"/"+dirName+"/"+roots[len(sour):]+"/"+dirsName | |
if os.path.exists(dirsPath): | |
pass | |
else: | |
if flag == "1": | |
shutil.copytree(sour+"/"+dirsName, dest+"/"+dirName+"/"+roots[len(sour):]+"/"+dirsName,False) | |
else: | |
shutil.move(sour+"/"+dirsName, dest+"/"+dirName+"/"+roots[len(sour):]+"/"+dirsName) | |
for filesName in files: | |
filesPath = dest+"/"+dirName+"/"+roots[len(sour):]+"/"+filesName | |
if os.path.exists(filesPath): | |
pass | |
else: | |
if flag == "1": | |
shutil.copy(sour+"/"+filesName, dest+"/"+dirName+"/"+roots[len(sour):]+"/"+filesName) | |
else: | |
shutil.move(sour+"/"+filesName, dest+"/"+dirName+"/"+roots[len(sour):]+"/"+filesName) | |
elif choice == "2": | |
pass | |
else: | |
pass | |
else: | |
try: | |
if flag == "1": | |
shutil.copytree(sour, dest+"/"+dirName,False) | |
else: | |
shutil.move(sour, dest+"/"+dirName) | |
except IOException: | |
print "没有权限" | |
else: | |
pass | |
### 4.3.2 cp [args] [sour] [desti] (3’) | |
# 系统命令--cp | |
### 用shutil模块中的copy、copytree | |
def do_cp(self, opt): | |
self.cpmv(opt, "1") | |
def complete_cp(self, text, line, begidx, endidx): | |
text = line.rsplit()[-1] | |
text = text if "/" in text else "./" + text | |
path, prefix = text.rsplit("/", 1) | |
return [name for name in os.listdir(path+"/") | |
if name.startswith(prefix)] | |
### 4.3.3 mv [args] [sour] [desti] (3’) | |
# 系统命令--mv | |
### 首先cp,然后如果cp成功,则删掉sour | |
### 用shutil模块中的move、rmtree | |
def do_mv(self, opt): | |
optTemp = opt | |
argList = optTemp.split() | |
argNum = len(argList) | |
if argNum == 3 and argList[0] == "-r"\ | |
and ((os.path.isdir(argList[1]) and not os.path.isdir(argList[2])) or (os.path.isdir("C:"+argList[1]) and not os.path.isdir("C:"+argList[2])))\ | |
and "/".join(argList[2].split("/")[:-1])=="/".join(argList[1].split("/")[:-1]): | |
if argList[1][0] == "/": | |
shutil.move("C:"+argList[1], "C:"+argList[2]) | |
else: | |
shutil.move(argList[1], argList[2]) | |
else: | |
self.cpmv(opt, "2") | |
def complete_mv(self, text, line, begidx, endidx): | |
text = line.rsplit()[-1] | |
text = text if "/" in text else "./" + text | |
path, prefix = text.rsplit("/", 1) | |
return [name for name in os.listdir(path+"/") | |
if name.startswith(prefix)] | |
### 4.3.4 mkdir [args] [dirpath] (3’) | |
# 系统命令--mkdir | |
def do_mkdir(self, opt): | |
if opt == "": ### 未输入参数(目录) | |
print "No Parameter or Dir!!!" | |
return False | |
## 不能在目录名称中出现的字符 ## | |
noList = ["\\", "/", ":", "*", "?", '”', "<", ">", "|", "'", ";"] | |
## 有参数 -p ## | |
if opt[:3] == "-p ": ### 与 ls 中的 -l 的判断有不同之处 | |
opt = opt[3:] ### 取出要创建的目录名称 | |
#相对路径 | |
flag = True | |
# 判断路径是否符合规则 | |
if opt[0] == "/": ### 绝对路径 | |
flag = False | |
argList = opt.split("/") | |
argList = argList[1:] # 可有可无 | |
opt = "C:"+opt | |
else: ###相对路径 | |
argList = opt.split("/") | |
argNum = len(argList) | |
for i in range(argNum): ### 对每一级目录进行判断 | |
for j in range(len(noList)): | |
if noList[j] in argList[i]: | |
print "Dir Name is illegal!!!" ### 目录名称非法 | |
return False | |
else: | |
pass | |
## 每一级目录名称都符合命名规范 ## | |
if flag == True: | |
tempPath = "" | |
else: | |
tempPath = "C:/" | |
for i in range(argNum): ### 对每一级目录进行mkdir | |
tempPath += argList[i] | |
if os.path.exists(tempPath) == False: ### 如果路径不存在,则新建,如果存在,在下一级 | |
os.mkdir(tempPath) | |
tempPath += "/" | |
else: | |
tempPath += "/" | |
## 无参数 -p ## | |
else: | |
# 判断路径是否符合规则 | |
if opt[0] == "/": ### 绝对路径 | |
argList = opt.split("/") | |
argList = argList[1:] # 可有可无 | |
opt = "C:"+opt | |
argNum = len(argList) | |
tempPath = "C:" | |
for i in range(argNum-1): | |
tempPath += "/"+argList[i] | |
if os.path.exists(tempPath) == False: | |
print "Path is not exist!!!" | |
return False | |
else: ###相对路径 | |
argList = opt.split("/") | |
argNum = len(argList) | |
for i in range(argNum-1): | |
if os.path.exists(argList[i]) == False: | |
print "Path is not exist!!!" | |
return False | |
## 路径存在,判断目录名是否符合要求 ## | |
for i in range(len(noList)): | |
if noList[i] in argList[argNum-1]: | |
print "Dir Name is illegal!!!" ### 目录名称非法 | |
return False | |
else: | |
pass | |
if os.path.exists(opt): | |
print "Dir is already exist!!!" ### 目录已经存在 | |
return False | |
os.mkdir(opt) | |
def complete_mkdir(self, text, line, begidx, endidx): | |
text = line.rsplit()[-1] | |
text = text if "/" in text else "./" + text | |
path, prefix = text.rsplit("/", 1) | |
return [name for name in os.listdir(path+"/") | |
if name.startswith(prefix)] | |
### 4.3.5 cd [dirpath] (3’) | |
# 切换目录 | |
### 如果cd的是当前目录的话... | |
def do_cd(self, opt): | |
opt = opt or "/" | |
try: | |
os.chdir(opt) | |
except OSError as inst: | |
print inst[1], ": ", opt | |
self.updatePrompt() | |
def complete_cd(self, text, line, begidx, endidx): | |
text = line.split(None, 1)[1] | |
text = text if "/" in text else "./" + text | |
path, prefix = text.rsplit("/", 1) | |
return [name for name in os.listdir(path+"/") | |
if name.startswith(prefix)] | |
### 4.3.6 rm [args] [path] (3’) | |
# 系统命令--rm | |
### 要不要支持 rm -r filename ... 即带 -r 的可以删除文件不... | |
### 暂时没支持上面的,讨论一下决定... | |
def do_rm(self, opt): | |
if opt == "": ### 未输入参数(目录文件) | |
print "No Parameter or Dir!!!" | |
return False | |
## 有参数 -r ## | |
if opt[:3] == "-r ": ### | |
opt = opt[3:] ### 取出要删除的目录(文件)名称 | |
if opt[0] == "/": | |
opt = "C:"+opt | |
else: | |
pass | |
if os.path.isdir(opt) == True: | |
## 递归删除 ## | |
if opt in os.getcwd(): | |
print "上层目录,不给删的亲!!!" | |
return False | |
else: | |
shutil.rmtree(opt) | |
else: | |
# 等讨论之后决定怎么写, 是文件,还是不存在,是分开写,还是一起处理掉... | |
if os.path.exists(opt) == False: | |
print "不存在的..." | |
else: | |
pass | |
## 无参数 -r ## | |
else: | |
if opt[0] == "/": | |
opt = "C:"+opt | |
else: | |
pass | |
if os.path.isdir(opt) == False: | |
if os.path.exists(opt) == True: | |
os.remove(opt) | |
else: | |
print "File not exist!!!" | |
return False | |
else: | |
print "No power to del dir!!!" | |
return False | |
def complete_rm(self, text, line, begidx, endidx): | |
text = line.rsplit()[-1] | |
text = text if "/" in text else "./" + text | |
path, prefix = text.rsplit("/", 1) | |
return [name for name in os.listdir(path+"/") | |
if name.startswith(prefix)] | |
### 4.3.7 cat [file] (4’) | |
# 系统命令--cat | |
def do_cat(self, opt): | |
if opt == "": ### 未输入参数(文件) | |
print "No Parameter!!!" | |
return False | |
## 有参数 -n ## | |
if opt[:3] == "-n ": ### | |
opt = opt[3:] ### 取出要删除的目录(文件)名称 | |
if opt[0] == "/": | |
opt = "C:"+opt | |
else: | |
pass | |
if os.path.isfile(opt): | |
fstream = open(opt) | |
catValue = [] | |
j = 1 | |
for i in fstream: | |
catValue.append("0"*(4-len(str(j))) + str(j) + ":" + " "*2 + i) | |
j += 1 | |
fstream.close() | |
self.output.update({ | |
"type": "cat", | |
"value": catValue, | |
}) | |
else: | |
print "No file!!!" | |
return False | |
## 无参数 -n ## | |
else: | |
if opt[0] == "/": | |
opt = "C:"+opt | |
else: | |
pass | |
if os.path.isfile(opt): | |
fstream = open(opt) | |
catValue = [] | |
for i in fstream: | |
catValue.append(i) | |
fstream.close() | |
self.output.update({ | |
"type": "cat", | |
"value": catValue, | |
}) | |
else: | |
print "No file!!!" | |
return False | |
def complete_cat(self, text, line, begidx, endidx): | |
text = line.rsplit()[-1] | |
text = text if "/" in text else "./" + text | |
path, prefix = text.rsplit("/", 1) | |
return [name for name in os.listdir(path+"/") | |
if name.startswith(prefix)] | |
### 4.3.8 alias [cmd1]=’[cmd2]’ (4’) | |
# 系统命令--alias | |
def do_alias(self, opt): | |
if opt == "": | |
print "No Parameter!!!" | |
return False | |
elif "=" not in opt: | |
print "Error Parameter!!!" | |
return False | |
else: | |
cmdList = opt.split("=") | |
for key in self.aliasDataAll[uname]: | |
if key == cmdList[0]: | |
print "The alias of %s already exsits, Cover it??? <Y/N>" | |
if raw_input() == "Y": | |
self.aliasDataAll[uname][cmdList[0]] = cmdList[1] | |
else: | |
pass | |
return | |
self.aliasDataAll[uname][cmdList[0]] = cmdList[1] | |
f = open(self.aliasDataPath, "w") ### 在这里打开为啥没print aliasData成功啊 | |
pickle.dump(self.aliasDataAll, f) | |
f.close() | |
### 4.3.9 find [path] [args] (4’) | |
# 系统命令--find | |
def do_find(self, opt): | |
if opt == "" or opt == ".": ### "find" or "find ." | |
opt = os.getcwd() | |
length = len(opt) | |
findValue = [] | |
for roots, dirs, files in os.walk(opt): | |
findValue.append("."+(roots[length:]).replace("\\", "/")) | |
for filespath in files: | |
findValue.append("."+((os.path.join(roots, filespath))[length:]).replace("\\", "/")) | |
self.output.update({ | |
"type": "find", | |
"value": findValue, | |
}) | |
## 有参数 ## | |
else: | |
argList = opt.split() | |
argNum = len(argList) | |
if argNum == 1: | |
if argList[0] == "/": ### "find /(filename)" or "find filename" | |
opt = "C:" + opt | |
else: | |
pass | |
if os.path.isdir(opt): | |
findValue = [] | |
for roots, dirs, files in os.walk(opt): | |
findValue.append(roots.replace("\\", "/")) | |
for filespath in files: | |
findValue.append((os.path.join(roots, filespath)).replace("\\", "/")) | |
self.output.update({ | |
"type": "find -name", | |
"value": findValue, | |
}) | |
else: | |
flag = 0 | |
if argNum == 2 and argList[0] == "-name": ### "find -name filename" | |
flag = 1 | |
opt = os.getcwd() | |
aim = argList[1] | |
elif argNum == 3 and argList[1] == "-name": | |
if argList[0] == ".": ### "find . -name filename" | |
flag = 1 | |
opt = os.getcwd() | |
aim = argList[2] | |
elif os.path.isdir(argList[0]) == True: ### "find sourfile -name filename" | |
flag = 2 | |
opt = argList[0] | |
aim = argList[2] | |
elif (argList[0][0] == "/") and os.path.isdir("C:"+argList[0]): ### "find /(sourfile) -name filename" | |
opt = "C:"+argList[0] | |
aim = argList[2] | |
else: | |
print "Root dir is not exist!!!" | |
return False | |
else: | |
print "Command error!!!" ###参数个数不对 or 参数错误 -name | |
return False | |
length = len(opt) | |
findValue = [] | |
for roots, dirs, files in os.walk(opt): | |
if aim in files: | |
if flag == 1: | |
#print (roots[length:]).replace("\\", "/")+"/"+aim | |
findValue.append((roots[length:]).replace("\\", "/")+"/"+aim) | |
elif flag == 2: | |
#print roots.replace("\\", "/")+"/"+aim | |
findValue.append(roots.replace("\\", "/")+"/"+aim) | |
else: | |
#print argList[0]+"/"+aim | |
findValue.append(argList[0]+"/"+aim) | |
else: | |
pass | |
self.output.update({ | |
"type": "find -name", | |
"value": findValue, | |
}) | |
def complete_find(self, text, line, begidx, endidx): | |
text = line.rsplit()[-1] | |
text = text if "/" in text else "./" + text | |
path, prefix = text.rsplit("/", 1) | |
return [name for name in os.listdir(path+"/") | |
if name.startswith(prefix)] | |
### 连续命令 | |
def do_multi(self, cmds): | |
for cmd in cmds: | |
self.onecmd(cmd) | |
# 登出,返回登录界面 | |
def do_logout(self, opt): | |
return True | |
# 退出程序, 关闭数据库连接 | |
def do_exit(self, opt): | |
User.closeDB() | |
sys.exit() | |
def do_EOF(self, opt): | |
self.do_exit(opt) | |
def do_useradd(self, name): | |
if not name: | |
print "Usage: useradd [username]" | |
return | |
if not User.isValidUname(name): | |
print "user name should be 1-10 long, ", | |
print "contains only letters and numbers" | |
elif User.hasUser(name): | |
print "user name %s is already taken" % name | |
else: | |
pwd1 = getpwd.getpwd("password: ") | |
if User.isValidPwd(pwd1): | |
pwd2 = getpwd.getpwd("password again: ") | |
if pwd2 == pwd1: | |
User.addUser(name, pwd2) | |
print "%s has been created successfully!" % name | |
else: | |
print "password doesn't match" | |
else: | |
print "password should be 6-20 long, ", | |
print "contains only letters and numbers" | |
def do_passwd(self, name): | |
if not name: | |
print "Usage: passwd [username]" | |
return | |
if not User.hasUser(name): | |
print "no user %s" % name | |
else: | |
old_pwd = getpwd.getpwd("old password: ") | |
if User.isValidUser(name, old_pwd): | |
new_pwd1 = getpwd.getpwd("new password : ") | |
if User.isValidPwd(new_pwd1): | |
new_pwd2 = getpwd.getpwd("new password again: ") | |
if new_pwd2 == new_pwd1: | |
User.setPwd(name, new_pwd2) | |
print "password of %s changed successfully!" % name | |
else: | |
print "password doesn't match" | |
else: | |
print "password should be 6-20 long, ", | |
print "contains only letters and numbers" | |
else: | |
print "password for %s is not correct" % name | |
def do_su(self, name): | |
if not name: | |
print "Usage: su [username]" | |
return | |
if not User.hasUser(name): | |
print "no user %s" % name | |
elif name == self.user_name: | |
print "already logged in as %s" % name | |
else: | |
pwd = getpwd.getpwd("password for %s: " % name) | |
if User.isValidUser(name, pwd): | |
self.changeUser(name) | |
else: | |
print "password error" | |
def do_grep(self, opt): | |
try: | |
pattern, source = opt.split(None, 1) | |
except: | |
print "Usage: grep [pattern] [string]" | |
self.output = "\n".join([line for line in source.split("\n") if pattern in line]) | |
def do_pipe(self, args): | |
buffer = None | |
for arg in args: | |
s = arg | |
if buffer: | |
# This command just adds the output of a previous command as the last argument | |
s += ' ' + buffer | |
self.onecmd(s) | |
buffer = self.output | |
def postcmd(self, stop, line): | |
type = self.output.get("type", "") | |
value = self.output.get("value", []) | |
rf = self.output.get("redirect", "") | |
self.output = {"type":"", "value":[], "redirect":""} | |
fp = open(rf, "w") if rf else sys.stdout | |
if type == "ls": | |
if rf: | |
for i, filename in enumerate(value): | |
fp.write(filename[1:] + " " if (i+1)%4 else "\n") | |
else: | |
fileList = value | |
for i in range(len(fileList)-1): | |
if fileList[i][0] == "Y": | |
self.printBlue(fileList[i][1:].ljust(18)) | |
else: | |
self.printWhite(fileList[i][1:].ljust(18)) | |
if (i+1)%4 == 0: # each line shows 4 files' name | |
if (i+1)%4: #如果不是正好4的倍数个,则,输出一个换行符 | |
elif type == "ls -l": | |
if rf: | |
for i in range(len(value)): | |
value[i] = value[i][1:] | |
fp.write("\n".join(value)) | |
else: | |
for fileInfo in value: | |
if fileInfo[0] == "Y": | |
self.printBlue(fileInfo[1:]) | |
else: | |
self.printWhite(fileInfo[1:]) | |
elif type in ["cat"]: | |
if rf: | |
fp.write("\n".join(value)) | |
else: | |
print "\n".join(value) | |
elif type == "find": | |
if rf: | |
fp.write("\n".join(value)) | |
else: | |
print "\n".join(value) | |
elif type == "find -name": | |
if rf: | |
fp.write("\n".join(value)) | |
else: | |
for valueList in value: | |
pathList = valueList.rsplit("/", 1) | |
self.printWhite(pathList[0]+"/") | |
self.printMagenta(pathList[1]) | |
else: | |
return stop | |
fp.write("\n") | |
if rf: | |
fp.close() | |
return stop | |
def aliasExchange(self, line): | |
command = line.split()[0] | |
for key in self.aliasData: | |
if key == command: | |
return line.replace(key, self.aliasData[key], 1) | |
return line | |
### 将对alias命令的处理加了进去,调用aliasExchange函数 | |
def parseline(self, line): | |
cmds = line.split(";") | |
cmdList = [] | |
for cmd in cmds: | |
if ">" in cmd: | |
cmd = self.aliasExchange(cmd) | |
cmd, self.output["redirect"] = [x.strip() for x in cmd.rsplit(">", 1)] | |
if "|" in cmd: | |
for i in cmd.split("|"): | |
cmdList.append(self.aliasExchange(cmd)) | |
return "pipe", cmdList, cmd | |
#return "pipe", cmd.split("|"), cmd | |
else: | |
cmd = self.aliasExchange(cmd) | |
return Cmd.parseline(self, cmd) | |
#self.onecmd(cmd) | |
''' | |
def do_multi(self, cmds): | |
for cmd in cmds: | |
self.onecmd(cmd) | |
''' | |
if __name__ == "__main__": | |
can_login = False | |
while True: | |
uname = raw_input("username: ") | |
if uname == "guest": | |
can_login = True | |
elif not User.hasUser(uname): | |
print "no such user" | |
else: | |
password = getpwd.getpwd("password: ") | |
if not User.isValidUser(uname, password): | |
print "user name and password don't match" | |
else: | |
can_login = True | |
if can_login: | |
print "Login successfully! ", | |
pash = Pash(uname) | |
pash.cmdloop() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
哇哇, 这个还记得, 哈哈