From 9d93e52ac51117e3abd4e1892ada0197f568c3b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20Kaan=20G=C3=9CM=C3=9C=C5=9E?= <96421894+Tahinli@users.noreply.github.com> Date: Tue, 9 Jul 2024 03:55:38 +0300 Subject: [PATCH 1/4] feat: :sparkles: fancy prints --- src/client.rs | 2 +- src/lib.rs | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 37 +++++++++++++++++++++------------- src/server.rs | 13 ++++++++---- src/utils.rs | 8 +++----- 5 files changed, 92 insertions(+), 24 deletions(-) diff --git a/src/client.rs b/src/client.rs index f4819df..d2c4c17 100644 --- a/src/client.rs +++ b/src/client.rs @@ -66,7 +66,7 @@ async fn serve((ws_sender, mut ws_receiver): (WebSocketSender, WebSocketReceiver async fn execute(payload: Payload, debug: bool) -> Option { if debug { - println!("{:#?}", payload); + payload.print(); } let command = if cfg!(target_os = "windows") { "cmd" diff --git a/src/lib.rs b/src/lib.rs index 63c3d8e..bc5e7ed 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,17 +11,44 @@ pub enum Runner { Server, Client, } + +impl Runner { + fn print(&self) { + match self { + Runner::Server => println!("Runner = Server"), + Runner::Client => println!("Runner = Client"), + } + } +} #[derive(Debug)] pub enum RunnerMode { State(Runner, bool), } +impl RunnerMode { + pub fn print(&self) { + match self { + RunnerMode::State(runner, debug) => { + runner.print(); + println!("Debug = {}", debug); + } + } + } +} + #[derive(Debug, Clone)] pub struct Config { pub ip: IpAddr, pub port: u16, } +impl Config { + pub fn print(&self) { + println!("IP = {}", self.ip); + println!("Port = {}", self.port); + } +} + #[derive(Debug, Serialize, Deserialize, Clone)] pub struct Payload { pub sudo: bool, @@ -29,6 +56,14 @@ pub struct Payload { pub args: String, } +impl Payload { + fn print(&self) { + println!("sudo = {}", self.sudo); + println!("user = {}", self.user); + println!("args = {}", self.args); + } +} + #[derive(Debug, Serialize, Deserialize)] pub struct Report { pub payload: Payload, @@ -36,3 +71,24 @@ pub struct Report { pub stdout: String, pub stderr: String, } + +impl Report { + fn print(&self) { + println!("-------"); + println!("Payload ↓"); + self.payload.print(); + println!("-------"); + if !self.status.is_empty() { + println!("Status ↓ \n{}", self.status); + println!("-------"); + } + if !self.stdout.is_empty() { + println!("Stdout ↓ \n{}", self.stdout); + println!("-------"); + } + if !self.stderr.is_empty() { + println!("Stderr ↓ \n{}", self.stderr); + println!("-------"); + } + } +} diff --git a/src/main.rs b/src/main.rs index 0626937..07652d0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,23 +5,32 @@ async fn main() { println!("Hello, world!"); let args = take_args(); - println!("{:#?}", args); match args { - Some((runner_mode, config)) => match runner_mode { - RunnerMode::State(Runner::Server, false) => { - rust_remote::server::start(config, false).await + Some((runner_mode, config)) => { + println!("-------"); + println!("Runner Mode ↓"); + runner_mode.print(); + println!("-------"); + println!("Config ↓"); + config.print(); + println!("-------"); + + match runner_mode { + RunnerMode::State(Runner::Server, false) => { + rust_remote::server::start(config, false).await + } + RunnerMode::State(Runner::Server, true) => { + rust_remote::server::start(config, true).await + } + RunnerMode::State(Runner::Client, false) => { + rust_remote::client::start(config, false).await + } + RunnerMode::State(Runner::Client, true) => { + rust_remote::client::start(config, true).await + } } - RunnerMode::State(Runner::Server, true) => { - rust_remote::server::start(config, true).await - } - RunnerMode::State(Runner::Client, false) => { - rust_remote::client::start(config, false).await - } - RunnerMode::State(Runner::Client, true) => { - rust_remote::client::start(config, true).await - } - }, + } None => { eprintln!("Error: Take Args"); return; diff --git a/src/server.rs b/src/server.rs index d1eedbe..f35709e 100644 --- a/src/server.rs +++ b/src/server.rs @@ -10,7 +10,7 @@ use tokio::{ }; use tokio_tungstenite::{accept_async, tungstenite::Message, WebSocketStream}; -use crate::{Config, Payload}; +use crate::{Config, Payload, Report}; type WebSocketSender = SplitSink, Message>; type WebSocketReceiver = SplitStream>; @@ -34,8 +34,13 @@ pub async fn start(config: Config, debug: bool) { break; } tokio::spawn(async move { - let report = receive(ws_receiver, debug).await; - println!("{:#?}", report); + match receive(ws_receiver, debug).await { + Some(report) => match serde_json::from_str::(&report) { + Ok(report) => report.print(), + Err(_) => {} + }, + None => todo!(), + } }); } None => continue, @@ -83,7 +88,7 @@ async fn establish_connection( async fn payload_from_input(debug: bool) -> Option { println!("User"); - // let user = match get_input() { + // let user = match get_input(debug) { // Some(input) => input, // None => return None, // }; diff --git a/src/utils.rs b/src/utils.rs index 0d12ef0..d085165 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -4,7 +4,7 @@ use crate::{Config, Runner, RunnerMode}; pub fn take_args() -> Option<(RunnerMode, Config)> { let args: Vec = env::args().collect(); - let mut runner = Runner::Server; + let mut runner = Runner::Client; let mut debug = false; let mut ip = "127.0.0.1".to_string(); let mut port = "3444".to_string(); @@ -30,8 +30,6 @@ pub fn take_args() -> Option<(RunnerMode, Config)> { } }; - println!("{:#?}", ip); - let port = match port.parse::() { Ok(port) => port, Err(err_val) => { @@ -52,8 +50,8 @@ fn show_help() { println!("----------------------------------------------------------------------"); println!(" -i -> --ip | Specifies IP Address | 127.0.0.1"); println!(" -p -> --port | Specifies Port Address | 3444"); - println!(" -sv -> --server | Starts as a Server | True"); - println!(" -cl -> --client | Starts as a Client | False"); + println!(" -sv -> --server | Starts as a Server | False"); + println!(" -cl -> --client | Starts as a Client | True"); println!(" -d -> --debug | Starts in Debug Mode | False"); println!(" -h -> --help | Shows Help | False"); println!("\n\n\n"); From 674d3c69632b89fd95e2650f68a9d6382313049b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20Kaan=20G=C3=9CM=C3=9C=C5=9E?= <96421894+Tahinli@users.noreply.github.com> Date: Wed, 10 Jul 2024 14:26:19 +0300 Subject: [PATCH 2/4] perf: :zap: clippy fix --- src/client.rs | 6 +++++- src/lib.rs | 4 +++- src/main.rs | 7 +------ src/server.rs | 19 +++++++++++++------ src/utils.rs | 4 ++-- 5 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/client.rs b/src/client.rs index d2c4c17..1008eb8 100644 --- a/src/client.rs +++ b/src/client.rs @@ -90,7 +90,7 @@ async fn execute(payload: Payload, debug: bool) -> Option { if debug { eprintln!("Error: Command Execution | {}", err_val); } - return None; + None } } } @@ -145,6 +145,10 @@ async fn send( }, }; + if debug { + report.print(); + } + let report = serde_json::json!(report); let result = ws_sender.lock().await.send(report.to_string().into()).await; match result { diff --git a/src/lib.rs b/src/lib.rs index bc5e7ed..e1966eb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -14,6 +14,7 @@ pub enum Runner { impl Runner { fn print(&self) { + println!("-------"); match self { Runner::Server => println!("Runner = Server"), Runner::Client => println!("Runner = Client"), @@ -44,6 +45,7 @@ pub struct Config { impl Config { pub fn print(&self) { + println!("-------"); println!("IP = {}", self.ip); println!("Port = {}", self.port); } @@ -58,6 +60,7 @@ pub struct Payload { impl Payload { fn print(&self) { + println!("-------"); println!("sudo = {}", self.sudo); println!("user = {}", self.user); println!("args = {}", self.args); @@ -88,7 +91,6 @@ impl Report { } if !self.stderr.is_empty() { println!("Stderr ↓ \n{}", self.stderr); - println!("-------"); } } } diff --git a/src/main.rs b/src/main.rs index 07652d0..cfb2455 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,14 +8,9 @@ async fn main() { match args { Some((runner_mode, config)) => { - println!("-------"); - println!("Runner Mode ↓"); runner_mode.print(); - println!("-------"); - println!("Config ↓"); config.print(); - println!("-------"); - + match runner_mode { RunnerMode::State(Runner::Server, false) => { rust_remote::server::start(config, false).await diff --git a/src/server.rs b/src/server.rs index f35709e..0bd6cda 100644 --- a/src/server.rs +++ b/src/server.rs @@ -31,15 +31,21 @@ pub async fn start(config: Config, debug: bool) { match payload_from_input(debug).await { Some(payload) => { if !send(payload, ws_sender, debug).await { + if debug { + eprintln!("Error: Send"); + } break; } tokio::spawn(async move { - match receive(ws_receiver, debug).await { - Some(report) => match serde_json::from_str::(&report) { + if let Some(report) = receive(ws_receiver, debug).await { + match serde_json::from_str::(&report) { Ok(report) => report.print(), - Err(_) => {} - }, - None => todo!(), + Err(err_val) => { + if debug { + eprintln!("Error: Deserialize | {}", err_val); + } + } + } } }); } @@ -87,6 +93,7 @@ async fn establish_connection( } async fn payload_from_input(debug: bool) -> Option { + println!("-------"); println!("User"); // let user = match get_input(debug) { // Some(input) => input, @@ -97,7 +104,7 @@ async fn payload_from_input(debug: bool) -> Option { match get_input(debug) { Some(input) => { let mut sudo = false; - let args = match input.split_once(" ") { + let args = match input.split_once(' ') { Some(input_splitted) => { if input_splitted.0 == "sudo" { sudo = true; diff --git a/src/utils.rs b/src/utils.rs index d085165..5f620d2 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -13,8 +13,8 @@ pub fn take_args() -> Option<(RunnerMode, Config)> { "--server" | "-sv" => runner = Runner::Server, "--client" | "-cl" => runner = Runner::Client, "--debug" | "-d" => debug = true, - "--ip" | "-i" => ip = args[i + 1].clone(), - "--port" | "-p" => port = args[i + 1].clone(), + "--ip" | "-i" => ip.clone_from(&args[i + 1]), + "--port" | "-p" => port.clone_from(&args[i + 1]), "--help" | "-h" => { show_help(); std::process::exit(0); From 5f7cd49e37a5626e43860b63c5a90e4f1dbc2f8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20Kaan=20G=C3=9CM=C3=9C=C5=9E?= <96421894+Tahinli@users.noreply.github.com> Date: Wed, 10 Jul 2024 15:43:00 +0300 Subject: [PATCH 3/4] feat: :building_construction: design strategy about sudo and user changed --- src/lib.rs | 4 ---- src/server.rs | 25 +------------------------ 2 files changed, 1 insertion(+), 28 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index e1966eb..80c029d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -53,16 +53,12 @@ impl Config { #[derive(Debug, Serialize, Deserialize, Clone)] pub struct Payload { - pub sudo: bool, - pub user: String, pub args: String, } impl Payload { fn print(&self) { println!("-------"); - println!("sudo = {}", self.sudo); - println!("user = {}", self.user); println!("args = {}", self.args); } } diff --git a/src/server.rs b/src/server.rs index 0bd6cda..f337089 100644 --- a/src/server.rs +++ b/src/server.rs @@ -94,31 +94,8 @@ async fn establish_connection( async fn payload_from_input(debug: bool) -> Option { println!("-------"); - println!("User"); - // let user = match get_input(debug) { - // Some(input) => input, - // None => return None, - // }; - let user = "tahinli".to_string(); println!("Command"); - match get_input(debug) { - Some(input) => { - let mut sudo = false; - let args = match input.split_once(' ') { - Some(input_splitted) => { - if input_splitted.0 == "sudo" { - sudo = true; - input_splitted.1.to_string() - } else { - input - } - } - None => input, - }; - Some(Payload { sudo, user, args }) - } - None => None, - } + get_input(debug).map(|args| Payload { args }) } fn get_input(debug: bool) -> Option { From b0501ebe6871ea6e04ce0cf227ab14fe50a37a95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20Kaan=20G=C3=9CM=C3=9C=C5=9E?= <96421894+Tahinli@users.noreply.github.com> Date: Sun, 5 Jan 2025 23:52:33 +0300 Subject: [PATCH 4/4] docs: :memo: readme --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 380260b..0fa12f9 100644 --- a/README.md +++ b/README.md @@ -1 +1,5 @@ -# rust-remote \ No newline at end of file +# Remote Code Execution Program + +I implemented this for my remote server. + +Sometimes ssh can't be possible because of NAT. That's why I add a public remote server as a relay. \ No newline at end of file