diff --git a/README.md b/README.md index 0fa12f9..380260b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1 @@ -# 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 +# rust-remote \ No newline at end of file diff --git a/src/client.rs b/src/client.rs index 1008eb8..f4819df 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 { - payload.print(); + println!("{:#?}", payload); } let command = if cfg!(target_os = "windows") { "cmd" @@ -90,7 +90,7 @@ async fn execute(payload: Payload, debug: bool) -> Option { if debug { eprintln!("Error: Command Execution | {}", err_val); } - None + return None; } } } @@ -145,10 +145,6 @@ 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 80c029d..63c3d8e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,58 +11,24 @@ pub enum Runner { Server, Client, } - -impl Runner { - fn print(&self) { - println!("-------"); - 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!("-------"); - println!("IP = {}", self.ip); - println!("Port = {}", self.port); - } -} - #[derive(Debug, Serialize, Deserialize, Clone)] pub struct Payload { + pub sudo: bool, + pub user: String, pub args: String, } -impl Payload { - fn print(&self) { - println!("-------"); - println!("args = {}", self.args); - } -} - #[derive(Debug, Serialize, Deserialize)] pub struct Report { pub payload: Payload, @@ -70,23 +36,3 @@ 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); - } - } -} diff --git a/src/main.rs b/src/main.rs index cfb2455..0626937 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,27 +5,23 @@ async fn main() { println!("Hello, world!"); let args = take_args(); + println!("{:#?}", args); match args { - Some((runner_mode, config)) => { - runner_mode.print(); - config.print(); - - 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 - } + Some((runner_mode, config)) => 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 + } + }, None => { eprintln!("Error: Take Args"); return; diff --git a/src/server.rs b/src/server.rs index f337089..d1eedbe 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, Report}; +use crate::{Config, Payload}; type WebSocketSender = SplitSink, Message>; type WebSocketReceiver = SplitStream>; @@ -31,22 +31,11 @@ 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 { - if let Some(report) = receive(ws_receiver, debug).await { - match serde_json::from_str::(&report) { - Ok(report) => report.print(), - Err(err_val) => { - if debug { - eprintln!("Error: Deserialize | {}", err_val); - } - } - } - } + let report = receive(ws_receiver, debug).await; + println!("{:#?}", report); }); } None => continue, @@ -93,9 +82,31 @@ async fn establish_connection( } async fn payload_from_input(debug: bool) -> Option { - println!("-------"); + println!("User"); + // let user = match get_input() { + // Some(input) => input, + // None => return None, + // }; + let user = "tahinli".to_string(); println!("Command"); - get_input(debug).map(|args| Payload { args }) + 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, + } } fn get_input(debug: bool) -> Option { diff --git a/src/utils.rs b/src/utils.rs index 5f620d2..0d12ef0 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::Client; + let mut runner = Runner::Server; let mut debug = false; let mut ip = "127.0.0.1".to_string(); let mut port = "3444".to_string(); @@ -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.clone_from(&args[i + 1]), - "--port" | "-p" => port.clone_from(&args[i + 1]), + "--ip" | "-i" => ip = args[i + 1].clone(), + "--port" | "-p" => port = args[i + 1].clone(), "--help" | "-h" => { show_help(); std::process::exit(0); @@ -30,6 +30,8 @@ pub fn take_args() -> Option<(RunnerMode, Config)> { } }; + println!("{:#?}", ip); + let port = match port.parse::() { Ok(port) => port, Err(err_val) => { @@ -50,8 +52,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 | False"); - println!(" -cl -> --client | Starts as a Client | True"); + println!(" -sv -> --server | Starts as a Server | True"); + println!(" -cl -> --client | Starts as a Client | False"); println!(" -d -> --debug | Starts in Debug Mode | False"); println!(" -h -> --help | Shows Help | False"); println!("\n\n\n");