我有NSProcessInfo's
arguments
属性的麻烦。我正在创建一个命令行工具,需要解码base64代码,它已经从互联网上通过使用PHP脚本,以及一些其他参数。数据传递正常,但由于某些原因。[[NSProcessInfo processInfo] arguments]
返回21个参数,即使我只传递一个base64字符串。
这是objective-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代码有点长,所以我把它放在这里。有人知道为什么这段代码返回这么多参数吗?应该只有一根弦吗?编辑:我剥离空白在我的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;
}
?>
当您通过命令行向程序发送参数时,每个参数由空白字符分隔。这意味着如果你发送一个包含空格的字符串,你的程序将把它解释为多个参数。为了防止这种行为,您需要给字符串加上引号。
当我在您的pastie页面上显示Base64字符串为"raw"时,我看到其中有很多空格。所以最有可能的arguments
是正确的,你的PHP脚本调用Objective-C程序错误的方式。一个简单的修复方法可能是在传递字符串之前去掉所有空白,或者正确地转义它。