| 
									
										
										
										
											2025-01-31 12:06:42 +01:00
										 |  |  | import asyncio | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-29 07:13:23 +01:00
										 |  |  | import asyncssh | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-31 12:06:42 +01:00
										 |  |  | # SSH Server Configuration | 
					
						
							|  |  |  | HOST = "0.0.0.0" | 
					
						
							|  |  |  | PORT = 2225 | 
					
						
							|  |  |  | USERNAME = "user" | 
					
						
							|  |  |  | PASSWORD = "password" | 
					
						
							|  |  |  | SHELL = "/bin/sh"  # Change to another shell if needed | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-29 07:13:23 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-31 12:06:42 +01:00
										 |  |  | class CustomSSHServer(asyncssh.SSHServer): | 
					
						
							|  |  |  |     def connection_made(self, conn): | 
					
						
							|  |  |  |         print(f"New connection from {conn.get_extra_info('peername')}") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def connection_lost(self, exc): | 
					
						
							|  |  |  |         print("Client disconnected") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def password_auth_supported(self): | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def validate_password(self, username, password): | 
					
						
							|  |  |  |         return username == USERNAME and password == PASSWORD | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-29 07:13:23 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-31 12:06:42 +01:00
										 |  |  | async def custom_bash_process(process): | 
					
						
							|  |  |  |     """Spawns a custom bash shell process""" | 
					
						
							|  |  |  |     env = os.environ.copy() | 
					
						
							|  |  |  |     env["TERM"] = "xterm-256color" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Start the Bash shell | 
					
						
							|  |  |  |     bash_proc = await asyncio.create_subprocess_exec( | 
					
						
							| 
									
										
										
										
											2025-03-29 07:13:23 +01:00
										 |  |  |         SHELL, | 
					
						
							|  |  |  |         "-i", | 
					
						
							|  |  |  |         stdin=asyncio.subprocess.PIPE, | 
					
						
							|  |  |  |         stdout=asyncio.subprocess.PIPE, | 
					
						
							|  |  |  |         stderr=asyncio.subprocess.PIPE, | 
					
						
							|  |  |  |         env=env, | 
					
						
							| 
									
										
										
										
											2025-01-31 12:06:42 +01:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async def read_output(): | 
					
						
							|  |  |  |         while True: | 
					
						
							|  |  |  |             data = await bash_proc.stdout.read(1) | 
					
						
							|  |  |  |             if not data: | 
					
						
							|  |  |  |                 break | 
					
						
							|  |  |  |             process.stdout.write(data) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async def read_input(): | 
					
						
							|  |  |  |         while True: | 
					
						
							|  |  |  |             data = await process.stdin.read(1) | 
					
						
							|  |  |  |             if not data: | 
					
						
							|  |  |  |                 break | 
					
						
							|  |  |  |             bash_proc.stdin.write(data) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     await asyncio.gather(read_output(), read_input()) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-29 07:13:23 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-31 12:06:42 +01:00
										 |  |  | async def start_ssh_server(): | 
					
						
							|  |  |  |     """Starts the AsyncSSH server with Bash""" | 
					
						
							|  |  |  |     await asyncssh.create_server( | 
					
						
							|  |  |  |         lambda: CustomSSHServer(), | 
					
						
							|  |  |  |         host=HOST, | 
					
						
							|  |  |  |         port=PORT, | 
					
						
							|  |  |  |         server_host_keys=["ssh_host_key"], | 
					
						
							| 
									
										
										
										
											2025-03-29 07:13:23 +01:00
										 |  |  |         process_factory=custom_bash_process, | 
					
						
							| 
									
										
										
										
											2025-01-31 12:06:42 +01:00
										 |  |  |     ) | 
					
						
							|  |  |  |     print(f"SSH server running on {HOST}:{PORT}") | 
					
						
							|  |  |  |     await asyncio.Future()  # Keep running | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-29 07:13:23 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-31 12:06:42 +01:00
										 |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         asyncio.run(start_ssh_server()) | 
					
						
							|  |  |  |     except (OSError, asyncssh.Error) as e: | 
					
						
							|  |  |  |         print(f"Error starting SSH server: {e}") |