/
arcane
/
Athena-main
Обзор
Документация
Войти
/
arcane
/
Athena-main
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
FRST
LinuxTerminallibRM.cpp/PYLIB/terminalLIBPY.py
78 строк
2 KB
Namilskyy
0.0.11a
21 окт 2024, 18:31
21 окт 2024, 18:31
8fb65e6
Код
Авторство
О чём код?
import os import pty import fcntl import termios import select class Terminal: def __init__(self): self.master_fd, self.slave_fd = pty.openpty() self.terminal_name = os.ttyname(self.slave_fd) def set_terminal_mode(self, mode): if mode == 'raw': attrs = termios.tcgetattr(self.master_fd) attrs[3] &= ~termios.ECHO attrs[3] &= ~termios.ICANON termios.tcsetattr(self.master_fd, termios.TCSANOW, attrs) elif mode == 'cooked': attrs = termios.tcgetattr(self.master_fd) attrs[3] |= termios.ECHO attrs[3] |= termios.ICANON termios.tcsetattr(self.master_fd, termios.TCSANOW, attrs) def read_from_terminal(self): data = os.read(self.master_fd, 1024) return data.decode('utf-8') def write_to_terminal(self, data): os.write(self.master_fd, data.encode('utf-8')) def run_command(self, command): pid, master_fd = pty.fork() if pid == 0: # Child process os.setsid() os.dup2(master_fd, 0) os.dup2(master_fd, 1) os.dup2(master_fd, 2) os.execvp('/bin/sh', ['/bin/sh', '-c', command]) else: # Parent process os.waitpid(pid, 0) return self.read_from_terminal() def get_terminal_name(self): return self.terminal_name def __del__(self): os.close(self.master_fd) os.close(self.slave_fd) class RootTerminal(Terminal): def __init__(self): super().__init__() self.uid = os.getuid() self.gid = os.getgid() os.setuid(0) os.setgid(0) def __del__(self): os.setuid(self.uid) os.setgid(self.gid) super().__del__() # Example usage terminal = Terminal() print(terminal.get_terminal_name()) terminal.set_terminal_mode('raw') print(terminal.read_from_terminal()) terminal.write_to_terminal('Hello, world!\n') print(terminal.run_command('ls -l')) root_terminal = RootTerminal() print(root_terminal.get_terminal_name()) root_terminal.set_terminal_mode('raw') print(root_terminal.read_from_terminal()) root_terminal.write_to_terminal('Hello, world!\n') print(root_terminal.run_command('ls -l /root'))