Files
PyShell/main.py

208 lines
7.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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):
# 如果输入包含路径分隔符,则补全路径
if '/' in text:
dir_path, partial_file = os.path.split(text)
if not dir_path: # 如果路径为空,使用当前目录
dir_path = '.'
try:
# 获取指定路径下的文件和文件夹
entries = os.listdir(dir_path)
matches = [os.path.join(dir_path, entry) for entry in entries if entry.startswith(partial_file)]
except FileNotFoundError:
matches = []
else:
# 获取系统命令
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 = 'macOS Sonoma 14.6'
system_version = platform.version()
architecture = platform.architecture()[0]
hostname = platform.node()
username = os.getlogin()
# 获取内存信息
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}")
print(f"主机名: {hostname}")
print(f"用户: {username}")
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(f"cd /{username}/", shell=True) # 切换到用户目录
while True:
try:
dir = os.getcwd()
if dir == '/':
CmdDir = '/'
elif dir == f'/Users/{username}':
CmdDir = '~'
else:
CmdDir = dir
if dir.split('/')[-1] == 'PyShell':
CmdDir = 'Shell/'
# 显示提示符并获取用户输入
cmd = input(f"{CmdDir} > ")
# 如果输入特定命令 "exit",退出程序
if cmd.strip() == "exit":
# 闻讯是否退出
confirm = input("退出PyShell (y/n): ").lower()
if confirm == 'y':
print("退出...")
exit(0)
else:
print("取消。")
continue
# 使用 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] == 'python':
subprocess.run(['python3',args[1]])
continue
if args[0] == 'pip':
subprocess.run(['pip3',args[1]])
continue
if args[0] == 'py':
subprocess.run(['python3',args[1]])
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()