一個選項是要求/bin/sh
以正常方式處理輸入。當然除了處理空格之外,這也會處理像$
,#
,~
,*
等字符,這可能是也可能不是你想要的。
root ;rm *
否則,execl
型功能將無法正常工作,除非你知道電話號碼:
execl("/bin/sh", "sh", "-c", ("groups " + args).c_str(), nullptr);
很顯然,如果數據是用戶輸入的,並且可能含有討厭的字符串像不要用這種方式在編譯時的命令行參數。假設你的args
字符串可能有不同數量的參數,你需要改用execv
類型的函數。
std::string args = "root sys bin";
std::vector<std::string> arg_vec;
std::istringstream arg_iss(args);
std::copy(std::istream_iterator<std::string>(arg_iss),
std::istream_iterator<std::string>(),
std::back_inserter(arg_vec));
char groups_exec[] = "groups";
std::vector<char*> arg_ptr_vec{ groups_exec };
std::for_each(arg_vec.begin(), arg_vec.end(),
[&](std::string& arg){ arg_ptr_vec.push_back(&arg[0]); });
arg_ptr_vec.push_back(nullptr);
execvp("groups", arg_ptr_vec.data());
嘗試'execlp( 「組」, 「組」, 「根」, 「SYS」, 「賓」, 「空」);' – bobah
我認爲最後一個參數應該是'NULL'(空指針)。 – sleepy42