gpt4 book ai didi

Cocoa 运行已包含双引号的 AppleScript

转载 作者:行者123 更新时间:2023-12-03 17:03:24 26 4
gpt4 key购买 nike

我有一个 Cocoa 应用程序需要管理员权限才能执行 cmd,但在某些极端情况下,例如文件名包含双引号,此代码不起作用。

 NSString *fileName = @"~/Documents/My\" File/";
NSString *cmd = [NSString stringWithFormat:@"chown -R '%@' '%@';NSUserName(), fileName];
NSString *cmd_execute = [NSString stringWithFormat:@"do shell script
\"%@\" with administrator privileges",cmd_execute];
//This line is the problem, our %@ contains double quote, so cocoa
//cannot interpret correctly.

最佳答案

以下是使用 NSAppleScript 将参数传递到 AppleScript 处理程序的正确方法:

// load/compile AppleScript
NSAppleScript *scpt = [[NSAppleScript alloc] initWithSource:
@"on joinText(a, b)\n"
@" return a & b\n"
@"end addTo"];

NSString *arg1 = @"Hello ";
NSString *arg2 = @"World!";

// pack positional parameters
NSAppleEventDescriptor *params = [NSAppleEventDescriptor listDescriptor];
[params insertDescriptor: [NSAppleEventDescriptor descriptorWithString: arg1] atIndex: 1];
[params insertDescriptor: [NSAppleEventDescriptor descriptorWithString: arg2] atIndex: 2];

// build Apple event to invoke user-defined handler in script
NSAppleEventDescriptor *eventDesc = [NSAppleEventDescriptor appleEventWithEventClass: 'ascr'
eventID: 'psbr'
targetDescriptor: [NSAppleEventDescriptor nullDescriptor]
returnID: 0
transactionID: 0];
[eventDesc setDescriptor: params forKeyword: '----'];
[eventDesc setDescriptor: [NSAppleEventDescriptor descriptorWithString: @"joinText"] forKeyword: 'snam'];

// invoke handler
NSDictionary *errorInfo = nil;
NSAppleEventDescriptor *resultDesc = [scpt executeAppleEvent: eventDesc error: &errorInfo];
if (resultDesc)
NSLog(@"Result: %@\n", [resultDesc stringValue]);
else
NSLog(@"Error: %@\n", errorInfo);

这避免了动态地修改和编译 AS 脚本的需要 - 正如您的原始 ObjC 代码所演示的那样,这是一个由于清理不充分而在程序中引入错误和安全漏洞的丰富机会。

...

以下是在 AppleScript 中组装 shell 脚本字符串的正确方法:

do shell script ("chown -R " & quoted form of username & " " & quoted form of filepath)

AppleScript 的 do shell script 命令不提供传递参数的安全机制(它在许多其他方面也有缺陷),但 AS 字符串具有引用形式 至少返回适合连接到 shell 脚本字符串的文本的带引号和转义版本的属性。

...

当然,通过 do shell script AppleScript 调用 shell 只是为了以升级的权限运行 chmod 本身并不有点黑客行为,尽管这主要是 Apple 的错没有提供一个简单的官方 API 来执行此操作(例如,通过向 NSUserScriptTask 添加“以管理员权限运行”选项)。

Apple 确实提供了一个示例项目,SMJobBless显示如何使用服务管理框架和 launchd 添加和运行特权进程。但这是一个足够复杂的解决方案,很多人会(有意或无意)走捷径或完全做错事,这反而违背了提供安全的做事方式的初衷。但您需要向 Apple 提出这个问题。

关于Cocoa 运行已包含双引号的 AppleScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19759149/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com