diff --git a/src/client.rs b/src/client.rs index ea3c0f2..f4819df 100644 --- a/src/client.rs +++ b/src/client.rs @@ -68,8 +68,20 @@ async fn execute(payload: Payload, debug: bool) -> Option { if debug { println!("{:#?}", payload); } - match Command::new(payload.command) - .args(payload.args) + let command = if cfg!(target_os = "windows") { + "cmd" + } else { + "sh" + }; + + let first_arg = if cfg!(target_os = "windows") { + "/C" + } else { + "-c" + }; + match Command::new(command) + .arg(first_arg) + .arg(payload.args) .output() .await { diff --git a/src/lib.rs b/src/lib.rs index 90fb3f4..63c3d8e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -26,8 +26,7 @@ pub struct Config { pub struct Payload { pub sudo: bool, pub user: String, - pub command: String, - pub args: Vec, + pub args: String, } #[derive(Debug, Serialize, Deserialize)] diff --git a/src/server.rs b/src/server.rs index ab6aa4d..d1eedbe 100644 --- a/src/server.rs +++ b/src/server.rs @@ -91,26 +91,19 @@ async fn payload_from_input(debug: bool) -> Option { println!("Command"); match get_input(debug) { Some(input) => { - let mut args: Vec = input.split_ascii_whitespace().map(String::from).collect(); - if args.is_empty() { - None - } else { - let mut sudo = false; - let mut command = args.remove(0); - if command == "sudo" { - if args.is_empty() { - return None; + 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 } - sudo = true; - command = args.remove(0); } - Some(Payload { - sudo, - user, - command, - args, - }) - } + None => input, + }; + Some(Payload { sudo, user, args }) } None => None, }