2011-11-23 106 views
0

所以,我有我想修改我自己的目的簡單嗎?的argv []轉換爲char *

它基本上是運行shell腳本(下面的測試例子),但使用蘋果的安全框架PRIVS一個示例應用程序源(見以下鏈接爲原始來源)。

#!/bin/bash 
echo [email protected] 
whoami 

在該示例代碼我們通過以下內容:

 myFlags = kAuthorizationFlagDefaults;       // 8 
     myStatus = AuthorizationExecuteWithPrivileges     // 9 
     (myAuthorizationRef, myToolPath, myFlags, myArguments, 
     &myCommunicationsPipe); 

我已修改命令添加myToolPath作爲第一個參數爲這樣:

 // Grab the arguent length 
     int size = strlen(argv[1]); 

     // Grab the first argument 
     char myToolPath[size]; 
     strcpy(myToolPath,argv[1]); 

其中工程,這意味着當我運行時

./compiled_priv_tool /tmp/example.sh 

它返回「root」而不是我正在使用的用戶。

但現在我希望能夠傳遞參數給這個幫手,並讓他們加入到這個數組 這是示例中的示例代碼

 char *myArguments[] = { "-u", NULL }; 

所以我以前的shell示例可能會輸出什麼像這樣:

./compiled_priv_tool /tmp/example.sh 

-u 
root 

,但我希望能夠動態傳遞儘可能多的參數作爲argv的可以包含到這個腳本後,輸出應該是這樣的

./compiled_priv_tool /tmp/example.sh -u user -f file path -b lah 

-u user -f file path -b lah 
root 

我不需要處理C代碼中的參數,我只是需要將它們直接傳遞給shell腳本(外部命令)。

因此,繼承我的(希望)簡單的問題,如果一個人想採取argv []並將它除了參數0(這是路徑到./compiled_priv)複製到期望的char * myArguments var那麼看什麼像在代碼中一樣。我學習了Objective C,並且從不用C開始,所以這可能很基本,但我嘗試了一個for循環並複製這兩個索引,但它不起作用。是這樣的:

的char * myArguments [] =的argv

就是我想要的,但還是不行,因爲它說無效的初始化,並且即使它看起來我們在年底需要一個NULL該陣列非常像NSTask。我會包括我的for循環,但它不是一個啓動器。

所以我需要argv的內容從1到數組的末尾,並在末尾添加一個NULL,並在原始示例代碼中以與char * myArguments []相同的形式包裝它。如果我對c有更好的理解,它會有所幫助,但同時也會有所幫助?

下面是我與它是否有助於播放源鏈接,

http://developer.apple.com/library/mac/documentation/security/conceptual/authorization_concepts/03authtasks/authtasks.html#//apple_ref/doc/uid/TP30000995-CH206-TPXREF33

+0

酷,所以我會繼續前進,並刪除這一個安全標籤。 – rook

回答

2

argv已經在您需要的格式(的char *指針一個NULL終止陣列),所以你可以做:

char **myArguments = &argv[2]; 

(假設您已經測試argc至少2)。

+0

這樣工作的很好,但是我在編譯時警告時沒有從不兼容的指針類型進行初始化。 – acidprime

+0

@acidprime:什麼是'argv'的聲明?如果它是'const',則可以將'myArguments'聲明爲'const char **'。 – caf

+0

根據引用AuthorizationExecuteWithPrivileges期望char * const *參數作爲它的第4個參數,所以如果我按照所述更改該錯誤,則會得到一個錯誤 – acidprime