Compare commits

..

3 commits

Author SHA1 Message Date
Ahmet Kaan GÜMÜŞ
b0501ebe68 docs: 📝 readme 2025-01-05 23:52:33 +03:00
Ahmet Kaan GÜMÜŞ
5f7cd49e37 feat: 🏗️ design strategy about sudo and user changed 2024-07-10 15:43:00 +03:00
Ahmet Kaan GÜMÜŞ
674d3c6963 perf: clippy fix 2024-07-10 14:26:19 +03:00
6 changed files with 29 additions and 44 deletions

View file

@ -1 +1,5 @@
# rust-remote # 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.

View file

@ -90,7 +90,7 @@ async fn execute(payload: Payload, debug: bool) -> Option<Output> {
if debug { if debug {
eprintln!("Error: Command Execution | {}", err_val); 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 report = serde_json::json!(report);
let result = ws_sender.lock().await.send(report.to_string().into()).await; let result = ws_sender.lock().await.send(report.to_string().into()).await;
match result { match result {

View file

@ -14,6 +14,7 @@ pub enum Runner {
impl Runner { impl Runner {
fn print(&self) { fn print(&self) {
println!("-------");
match self { match self {
Runner::Server => println!("Runner = Server"), Runner::Server => println!("Runner = Server"),
Runner::Client => println!("Runner = Client"), Runner::Client => println!("Runner = Client"),
@ -44,6 +45,7 @@ pub struct Config {
impl Config { impl Config {
pub fn print(&self) { pub fn print(&self) {
println!("-------");
println!("IP = {}", self.ip); println!("IP = {}", self.ip);
println!("Port = {}", self.port); println!("Port = {}", self.port);
} }
@ -51,15 +53,12 @@ impl Config {
#[derive(Debug, Serialize, Deserialize, Clone)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Payload { pub struct Payload {
pub sudo: bool,
pub user: String,
pub args: String, pub args: String,
} }
impl Payload { impl Payload {
fn print(&self) { fn print(&self) {
println!("sudo = {}", self.sudo); println!("-------");
println!("user = {}", self.user);
println!("args = {}", self.args); println!("args = {}", self.args);
} }
} }
@ -88,7 +87,6 @@ impl Report {
} }
if !self.stderr.is_empty() { if !self.stderr.is_empty() {
println!("Stderr ↓ \n{}", self.stderr); println!("Stderr ↓ \n{}", self.stderr);
println!("-------");
} }
} }
} }

View file

@ -8,14 +8,9 @@ async fn main() {
match args { match args {
Some((runner_mode, config)) => { Some((runner_mode, config)) => {
println!("-------");
println!("Runner Mode ↓");
runner_mode.print(); runner_mode.print();
println!("-------");
println!("Config ↓");
config.print(); config.print();
println!("-------");
match runner_mode { match runner_mode {
RunnerMode::State(Runner::Server, false) => { RunnerMode::State(Runner::Server, false) => {
rust_remote::server::start(config, false).await rust_remote::server::start(config, false).await

View file

@ -31,15 +31,21 @@ pub async fn start(config: Config, debug: bool) {
match payload_from_input(debug).await { match payload_from_input(debug).await {
Some(payload) => { Some(payload) => {
if !send(payload, ws_sender, debug).await { if !send(payload, ws_sender, debug).await {
if debug {
eprintln!("Error: Send");
}
break; break;
} }
tokio::spawn(async move { tokio::spawn(async move {
match receive(ws_receiver, debug).await { if let Some(report) = receive(ws_receiver, debug).await {
Some(report) => match serde_json::from_str::<Report>(&report) { match serde_json::from_str::<Report>(&report) {
Ok(report) => report.print(), Ok(report) => report.print(),
Err(_) => {} Err(err_val) => {
}, if debug {
None => todo!(), eprintln!("Error: Deserialize | {}", err_val);
}
}
}
} }
}); });
} }
@ -87,31 +93,9 @@ async fn establish_connection(
} }
async fn payload_from_input(debug: bool) -> Option<Payload> { async fn payload_from_input(debug: bool) -> Option<Payload> {
println!("User"); println!("-------");
// let user = match get_input(debug) {
// Some(input) => input,
// None => return None,
// };
let user = "tahinli".to_string();
println!("Command"); println!("Command");
match get_input(debug) { get_input(debug).map(|args| Payload { args })
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<String> { fn get_input(debug: bool) -> Option<String> {

View file

@ -13,8 +13,8 @@ pub fn take_args() -> Option<(RunnerMode, Config)> {
"--server" | "-sv" => runner = Runner::Server, "--server" | "-sv" => runner = Runner::Server,
"--client" | "-cl" => runner = Runner::Client, "--client" | "-cl" => runner = Runner::Client,
"--debug" | "-d" => debug = true, "--debug" | "-d" => debug = true,
"--ip" | "-i" => ip = args[i + 1].clone(), "--ip" | "-i" => ip.clone_from(&args[i + 1]),
"--port" | "-p" => port = args[i + 1].clone(), "--port" | "-p" => port.clone_from(&args[i + 1]),
"--help" | "-h" => { "--help" | "-h" => {
show_help(); show_help();
std::process::exit(0); std::process::exit(0);