| import os |
| import json |
| import argparse |
| import paramiko |
|
|
| def load_servers(config_path='config.json'): |
| """تحميل قائمة الخوادم من ملف إعدادات JSON""" |
| try: |
| with open(config_path, 'r') as f: |
| data = json.load(f) |
| return data.get('servers', []) |
| except Exception as e: |
| print(f"[!] Failed to load config: {e}") |
| return [] |
|
|
| def copy_file(server, local_file, remote_file): |
| """نسخ ملف من الجهاز المحلي إلى الخادم عبر SSH""" |
| try: |
| ssh = paramiko.SSHClient() |
| ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) |
| ssh.connect( |
| hostname=server['host'], |
| port=server.get('port', 22), |
| username=server['username'], |
| password=server['password'] |
| ) |
| sftp = ssh.open_sftp() |
| sftp.put(local_file, remote_file) |
| sftp.close() |
| print(f"[+] Uploaded '{local_file}' to '{server['host']}:{remote_file}'") |
| return ssh |
| except Exception as e: |
| print(f"[!] Failed to upload '{local_file}': {e}") |
| return None |
|
|
| def execute_remote_command(ssh, command): |
| """تنفيذ أمر على الخادم عن بعد وطباعة النتيجة""" |
| try: |
| stdin, stdout, stderr = ssh.exec_command(command) |
| output = stdout.read().decode() |
| errors = stderr.read().decode() |
| if output: |
| print(f"[+] Output:\n{output}") |
| if errors: |
| print(f"[!] Errors:\n{errors}") |
| except Exception as e: |
| print(f"[!] Failed to execute command: {e}") |
|
|
| def main(): |
| parser = argparse.ArgumentParser(description="Upload files to server (optional).") |
| parser.add_argument("files", nargs="*", help="Local files to upload (optional)") |
| parser.add_argument("--remote-path", default="/tmp", help="Remote path to upload files to") |
| parser.add_argument("--run", action="store_true", help="Execute main.py after upload") |
| parser.add_argument("--config", default="config.json", help="Path to server config JSON file") |
| args = parser.parse_args() |
|
|
| if not args.files: |
| print("[ℹ️] No files provided. Skipping file upload.") |
| return |
|
|
| servers = load_servers(args.config) |
| if not servers: |
| print("[!] No servers loaded from config.") |
| return |
|
|
| server = servers[0] |
| for file in args.files: |
| if not os.path.exists(file): |
| print(f"[!] File not found: {file}") |
| continue |
|
|
| remote_file = os.path.join(args.remote_path, os.path.basename(file)) |
| ssh = copy_file(server, file, remote_file) |
| if ssh and args.run and os.path.basename(file) == "main.py": |
| execute_remote_command(ssh, f"python3 {remote_file}") |
| ssh.close() |
|
|
| if __name__ == "__main__": |
| main() |
|
|
|
|