【问题标题】:arguments] Problem Objective-C论据]问题Objective-C
【发布时间】:2011-07-11 02:36:12
【问题描述】:

我在使用 NSProcessInfo's arguments 属性时遇到问题。我正在创建一个命令行工具,该工具需要解码使用 PHP 脚本从 Internet 传递的 base64 代码以及其他一些参数。数据传递得很好,但出于某种原因。 [[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 代码有点长,所以我把它放在here 上。有谁知道为什么这段代码会返回这么多参数?应该只有一串吧? 编辑: 我正在删除我的 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;

}

?>

【问题讨论】:

  • 你可能想NSLog(@"%@", arguments) 这样你就可以看到你的程序得到了什么。您的问题有可能立即变得明显。首先,base64 字符串中有 13 个空格字符,它们自动组成至少 14 个参数。 (如果您希望将 base64 数据视为单个参数,则必须引用它。)
  • 在发帖之前我已经这样做了。它显示了一个数组,其中 base64 代码分为 18 个部分。
  • 那么也许你可以分享结果:)
  • trim 删除字符串开头和结尾的空格;真的是你的意思吗?
  • @Zneak - 你是我的英雄。把它放在引号里就行了。请将其作为答案发布,以便我将其标记为正确答案。

标签: php objective-c


【解决方案1】:

当您通过命令行向程序发送参数时,每个参数都由一个空格字符分隔。这意味着如果您发布一个包含空格的字符串,您的程序会将其解释为多个参数。为了防止这种行为,您需要引用您的字符串。

【讨论】:

    【解决方案2】:

    当我在您的粘贴页面上将 Base64 字符串显示为“原始”时,我看到其中有很多空格。因此,arguments 很可能是正确的,并且您的 PHP 脚本以错误的方式调用了 Objective-C 程序。一个简单的解决方法可能是在传递字符串之前去掉任何空格,或者正确地转义它。

    【讨论】:

    • @David Schiefer:不,您将换行符和制表符替换为 空格,这就是问题所在。根据问题How do I to properly handle spaces in PHP Shell_exec?,您应该使用escapeshellarg 转义字符串(或在您对str_replace 的调用中将' ' 替换为'')。
    • 只要把它放在引号里就行了。但我会将其标记为 +1 以表示努力。谢谢! :)
    • @David Schiefer:好的,但请记住,如果您的字符串可能包含引号、美元符号或类似字符等内容,您应该改用 escapeshellarg
    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 2011-09-26
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    相关资源
    最近更新 更多