2011-07-10 14 views
1

NSProcessInfo'sargumentsプロパティで問題が発生しています。私はPHPスクリプトを使用してインターネットから渡されたbase64コードを、他の引数とともにデコードする必要があるコマンドラインツールを作成しています。データは何らかの理由で正常に処理されますが、 [[NSProcessInfo processInfo] arguments]は、base64の文字列を1つだけ渡しても、21個の引数を返します。引数]問題目的-C

NSArray *arguments = [[NSProcessInfo processInfo] arguments]; 

if ([[arguments objectAtIndex:1] isEqualToString:@"-s"]) 
{ 
    if ([arguments objectAtIndex:2] == nil) 
    { 
     printf("Error: No data\n"); 
     [pool drain]; 
     return 0; 
    } 

    NSString*data = [arguments objectAtIndex:2]; 

    if ([data length] == 0) 
    { 
     printf("Error: No data\n"); 
     [pool drain]; 
     return 0; 
    } 

    NSString*password = @""; 

    if ([[arguments objectAtIndex:3] isEqualToString:@"-p"]) 
    { 
     if ([arguments objectAtIndex:4] == nil) 
     { 
      printf("Error: No password\n"); 
      [pool drain]; 
      return 0; 
     } 
     else 
     { 
      password = [NSString stringWithString:[arguments lastObject]]; 
     } 
    } 

NSLog(@"Args: %i\n\n",[arguments count]); //returns 21? I expect 3. 

base64でコードが少し長いですので、私はそれhereを入れている:

は、ここでのObjective-Cの側です。誰もがなぜこのコードがこの多くの引数を返すのか知っていますか?それはちょうど1つの文字列であるはずですか? 編集:私はPHPスクリプトで空白を取り除いています。ここを参照してください:

<?php 

$url = $_GET['data']; 

$query = "/Library/WebServer/email/emailsender -s"; 
$password = "-p somePassword"; 

$commandStr = trim("$query $url $password"); 

$commandStr = removeNewLines($commandStr); 

echo $commandStr; 

$output = shell_exec($commandStr); 

echo "<pre>Output: $output</pre>"; 

function removeNewLines($string) { 

    $string = str_replace("\t", ' ', $string); 
    $string = str_replace("\n", ' ', $string); 
    $string = str_replace("\r", ' ', $string); 
    $string = str_replace("\0", ' ', $string); 
    $string = str_replace("\x0B", ' ', $string); 

    return $string; 

} 

?> 
+0

'NSLog(@"%@ "、引数)'を使って、プログラムの内容を正確に見ることができます。あなたの問題がすぐに明らかになる可能性があります。まず、base64の文字列に13個の空白文字があります。これは、自動的に少なくとも14個の引数を補うものです。 (あなたがそれを単一の引数として扱うためには、base64データを引用する必要があります。) – zneak

+0

私はすでにここに投稿する前にそれをしました。 'base64'コードが18個に分割された配列を示しています。 – Pripyat

+0

次に、結果を共有することができます:) – zneak

答えて

2

プログラムに引数をコマンドラインで送信すると、各引数は空白文字で区切られます。つまり、スペースを含む文字列を投稿すると、プログラムはそれを多くの引数として解釈します。この現象を防ぐには、文字列を引用符で囲む必要があります。

+0

それはトリックでした! – Pripyat

2

私はそれにスペースの多くを参照してください「生」としてあなたpastieページのBase64文字列を表示する場合。したがって、argumentsが正しいと思われ、PHPスクリプトがObjective-Cプログラムを間違った方法で呼び出している可能性があります。簡単な修正は、文字列を渡す前に空白を取り除くか、適切にエスケープすることです。

+0

空白を削除します - 私の上で編集した記事を参照してください。 – Pripyat

+0

@David Schiefer:いいえ、改行やタブのようなものを*スペース*に置き換えています。それが問題です。質問によると[PHP Shell_execでスペースを正しく処理する方法は?](http://stackoverflow.com/questions/378490/how-do-i-to-properly-handle-spaces-in-php-shell-エスケープするために 'escapeshellarg'を使うべきです(あるいはあなたの' str_replace'への呼び出しであなたの '' ''を' '''で置き換える)。 – DarkDust

+0

それを引用符で囲むだけでやりました。しかし、私は努力のために+1とマークします。ありがとう! :) – Pripyat

関連する問題