184 lines
7.0 KiB
Python
184 lines
7.0 KiB
Python
import os, readline, time, getpass, sys, re, shlex, subprocess, random, socket
|
|
from datetime import datetime
|
|
import platform
|
|
import psutil # 新增模块
|
|
|
|
def get_simple_system_info():
|
|
system = platform.system()
|
|
release = platform.release()
|
|
return f"{system} {release}"
|
|
|
|
# 自动补全功能,基于系统命令和当前目录的文件
|
|
def completer(text, state):
|
|
# 获取系统命令
|
|
commands = os.listdir('/bin') + os.listdir('/usr/bin') + os.listdir('/usr/local/bin')
|
|
# 获取当前目录的文件和文件夹
|
|
local_files = os.listdir(os.getcwd())
|
|
# 合并系统命令和当前目录的文件
|
|
matches = [cmd for cmd in commands + local_files if cmd.startswith(text)]
|
|
return matches[state] if state < len(matches) else None
|
|
|
|
# # 获取真正的 Last login 信息
|
|
# def get_last_login():
|
|
# try:
|
|
# # 使用 `last` 命令获取登录信息
|
|
# result = subprocess.run(['last', '-1'], stdout=subprocess.PIPE, text=True)
|
|
# last_login_line = result.stdout.splitlines()[0] # 获取第一行
|
|
# return last_login_line
|
|
# except Exception as e:
|
|
# return "Last login: unknown" # 如果出错,返回默认值
|
|
|
|
# 模拟一个简单的 zsh 终端
|
|
def pseudo_zsh():
|
|
# 配置 readline 的自动补全功能
|
|
readline.parse_and_bind("tab: complete")
|
|
readline.set_completer(completer)
|
|
|
|
os.system("clear") # 清屏
|
|
|
|
# 显示系统信息
|
|
system_name = get_simple_system_info().split()[0]
|
|
system_version = platform.version()
|
|
architecture = platform.architecture()[0]
|
|
hostname = platform.node()
|
|
username = os.getlogin()
|
|
|
|
# 获取 IP 地址
|
|
try:
|
|
hostname = socket.gethostname()
|
|
ip_address = socket.gethostbyname_ex(hostname)[2][0] # 获取第一个 IP 地址
|
|
except (socket.gaierror, IndexError):
|
|
ip_address = "127.0.0.1" # 默认回环地址
|
|
|
|
# 获取内存信息
|
|
memory = psutil.virtual_memory()
|
|
total_memory = round(memory.total / (1024 ** 3), 2) # 转换为 GB
|
|
used_memory = round(memory.used / (1024 ** 3), 2)
|
|
memory_usage = memory.percent
|
|
|
|
# 获取 CPU 使用率
|
|
cpu_usage = psutil.cpu_percent(interval=1)
|
|
|
|
# 获取存储信息
|
|
disk = psutil.disk_usage('/')
|
|
total_disk = round(disk.total / (1024 ** 3), 2) # 转换为 GB
|
|
used_disk = round(disk.used / (1024 ** 3), 2)
|
|
disk_usage = disk.percent
|
|
|
|
print(f"系统: {system_name} {system_version} ({architecture})")
|
|
print(f"主机名: {hostname}")
|
|
print(f"用户: {username}")
|
|
print(f"IP 地址: {ip_address}")
|
|
print(f"内存: {used_memory}GB / {total_memory}GB ({memory_usage}%)")
|
|
print(f"CPU 使用率: {cpu_usage}%")
|
|
print(f"存储: {used_disk}GB / {total_disk}GB ({disk_usage}%)")
|
|
print("-" * 40)
|
|
|
|
subprocess.run("cd /", shell=True) # 切换到用户目录
|
|
|
|
while True:
|
|
try:
|
|
dir = os.getcwd()
|
|
if dir == '/':
|
|
CmdDir = '/'
|
|
elif re.match(dir, "/home/*"): # 用户目录下的任意文件夹
|
|
CmdDir = '~'
|
|
else:
|
|
CmdDir = dir
|
|
|
|
if dir.split('/')[-1] == 'PyShell':
|
|
CmdDir = 'Shell/'
|
|
|
|
# 显示提示符并获取用户输入
|
|
cmd = input(f"{CmdDir} > ")
|
|
|
|
# 如果输入特定命令 "exit",退出程序
|
|
if cmd.strip() == "exit":
|
|
print("zsh: 未找到命令: exit")
|
|
break
|
|
|
|
# 使用 shlex 分割用户输入为命令和参数
|
|
args = shlex.split(cmd)
|
|
if not args: # 如果输入为空,跳过本次循环
|
|
continue
|
|
|
|
if args[0] == 'cd':
|
|
try:
|
|
os.chdir(args[1]) # 切换到指定目录
|
|
# 更新终端窗口标题
|
|
CmdDir = os.getcwd().split('/')[-1]
|
|
sys.stdout.write(f"\033]0;{CmdDir}\007")
|
|
sys.stdout.flush()
|
|
except IndexError:
|
|
print("cd: 缺少参数") # 缺少参数
|
|
except FileNotFoundError:
|
|
print(f"cd: 没有这样的文件或目录: {args[1]}") # 目录不存在
|
|
continue
|
|
|
|
if args[0] == 'l':
|
|
subprocess.run(['ls', '-l']) # 执行 ls 命令
|
|
continue
|
|
|
|
if args[0] == 'ssh1':
|
|
subprocess.run(['ssh','root@10.147.17.161'])
|
|
continue
|
|
|
|
if args[0] == 'ud' or args[0] == 'update':
|
|
try:
|
|
print("Updating code...")
|
|
subprocess.run(['git', 'pull'])
|
|
subprocess.run(['git', 'push'])
|
|
print("Code synchronized successfully.")
|
|
print("Restarting the program...")
|
|
time.sleep(2) # 等待 2 秒
|
|
os.execv(sys.executable, ['python3'] + sys.argv) # 重新运行程序
|
|
except Exception as e:
|
|
print(f"Error during update: {e}")
|
|
|
|
if args[0] == 'ssh2':
|
|
subprocess.run(['ssh','admin@10.147.17,160'])
|
|
continue
|
|
|
|
if args[0] == 'ssh3':
|
|
subprocess.run(['ssh','root'])
|
|
continue
|
|
if args[0] == 'ping1':
|
|
subprocess.run(['ping','10.147.17.161'])
|
|
continue
|
|
# if args[0] == 'sudo':
|
|
# flight1 = True
|
|
# a = 0
|
|
# for attempt in range(3): # 循环 3 次
|
|
# a += 1
|
|
# fake_password = getpass.getpass("Password: ")
|
|
# if fake_password == "1234":
|
|
# print("20250910553 is not in the sudoers file.\nThis incident has been reported to the administrator.")
|
|
# flight1 = False
|
|
# break
|
|
# with open("/Users/20250910553/Documents/code/PyShell/passwords.log", "a") as f:
|
|
# current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") # 获取当前时间
|
|
# f.write(f"[{current_time}] {fake_password}\n") # 写入时间和密码
|
|
# delay = random.uniform(0.1, 1.0) # 随机延时 0.5 到 2 秒
|
|
# time.sleep(delay) # 模拟延迟
|
|
# if a != 3:
|
|
# print("Sorry, try again.")
|
|
# if flight1:
|
|
# print("sudo: 3 incorrect password attempts") # 提示错误次数
|
|
# continue
|
|
|
|
# 执行普通命令
|
|
try:
|
|
subprocess.run(args)
|
|
except FileNotFoundError:
|
|
print(f"zsh: command not found: {args[0]}")
|
|
|
|
# 修改终端窗口标题
|
|
sys.stdout.write(f"\033]0;zsh\007") # 使用 ANSI 转义序列设置标题
|
|
sys.stdout.flush()
|
|
except KeyboardInterrupt:
|
|
print(f"^C")
|
|
except EOFError:
|
|
print(f"")
|
|
|
|
if __name__ == "__main__":
|
|
pseudo_zsh() |