2010-08-22 15 views
4

我正在使用此代碼來提取受密碼保護的rar文件。我正在使用系統函數來調用rar命令。如果我在系統命令中使用密碼,它可以工作。但是,由於試圖將密碼作爲參數傳遞,它不會。例如,如果在此代碼中使用密碼密碼,它會給出錯誤「pwd不被識別爲內部或外部命令,可操作的程序或批處理文件」。 但是,如果我更改代碼,並使其「 」系統(「rar e -ppwd wingen.rar」)「,它的工作原理。 有人可以解釋我,我在做什麼錯誤?提前致謝。c中的系統函數對我不起作用

#include<stdio.h> 
#include<stdlib.h> 
int main(int argc, char **argv) 
    { 
    char pword[20]; 
    printf("enter the pword : "); 
    gets(pword); 
    system(("rar e -p%s wingen.rar",pword)); 
    getchar(); 
    return 0; 
    } 
+2

您不應該使用'gets()'。 manpage明確地說'永遠不要使用gets()。 [...]使用fgets()代替'。如果'gets()'讀取的字符多於緩衝區的大小,它將繼續將它們存儲在末尾,這很危險。 – 2010-08-22 05:34:36

+0

另外,請閱讀[常問問題](http://stackoverflow.com/faq「這是常見問題的鏈接」),尤其是那些說:「當你決定哪個答案對你最有幫助時,* *通過點擊答案**左側的複選框大綱,將其標記爲接受的答案,這可讓其他人知道您已收到您的問題的良好答案。「 – 2010-08-22 12:26:29

回答

3

system()功能並不像printf()工作。您需要創建完整的字符串,然後調用system()

char command[100]; 
sprintf(command, "rar e -p%s wingen.rar", pword); 
system(command); 

你現在所擁有的是使用逗號操作,這將導致你的「格式字符串」的代碼全部被程序忽略。你在那裏有100%的寫作相當於:

system(pword); 

這可能不是你想要的。

+0

感謝哥們,它工作。只是一點點改變。我用e代替了-e。再次感謝。 – narayanpatra 2010-08-22 05:11:48

+0

@ user417552 - 抱歉有關錯字。現在修復。 – 2010-08-22 05:12:39

+2

希望密碼不要超過80個字符。 ;) - 你應該使用'snprintf'。或者根據密碼的長度分配緩衝區。 – 2010-08-22 05:13:44

6

system()函數想要一個字符串。 它的原型是:

int system(const char *command); 

傳遞之前建立的字符串。或許使用snprintf()

char buf[512]; 
snprintf(buf, sizeof(buf), "rar e -p%s wingen.rar", pword); 
system(buf); 

編輯:所有這些解決方案是壞的想法,因爲沒有使用系統unsanitized輸入注入漏洞。因爲system()(至少在* nix系統上至少使用/ bin/sh)可以使用單個函數執行多個命令,所以仍然存在一個問題,即使他使用像我的回答一樣的snprintf,或者像其他strcat一樣,仍然存在問題呼叫。

system("rar e -pXX wingen.rar ; rm -rf * ; # wingen.rar") 

將從 PWD =被產生 「XX wingen.rar;室射頻*;#」

+1

使用snprintf()的+1。 – 2010-08-22 05:30:32

17

system()只接受一個參數 - 一個const char *。實際上,

system("rar e -p%s wingen.rar",pword); 

不會編譯 - 編譯器會抱怨說你已經傳遞了太多的參數給system()。之所以這樣,

system(("rar e -p%s wingen.rar",pword)); 

編譯是你已經用圓括號包裝你的兩個字符串。這具有評估內部表達式的作用,其中包含對兩個字符串進行操作的逗號運算符。逗號操作員返回第二個參數的值的效果,所以你最終調用:

system(pword); 

哪個在你的例子是等價於:

system("pwd"); 

和pwd是不是命令在你的系統上(儘管在POSIX系統上它是...但我離題了)。你想要做什麼已經在其他的答案被解釋但對於完整性我會提到它太 - 你需要使用sprintf的格式化你的字符串:

char buff[256]; 
sprintf(buff, "rar e -p%s wingen.rar", pword); 

,或者您可以連接字符串,這可能是一點點更快(雖然對於如此短的字符串,它可能不會有所作爲):

char buff[256] = "rar e -p"; 
strcat(buff, pword); 
strcat(buff, " wingen.rar"); 
+3

+1正確診斷爲什麼沒有編譯錯誤。 – 2010-08-22 05:30:14

+0

這是一個非常耐心和全面的答案。 +1 – 2010-08-22 06:04:50

+0

這是非常有用的。謝謝。 – narayanpatra 2010-08-22 06:41:00