使用具有管理员权限的AppleScript,"not ask for authentication again for five minutes."不起作用?



在Apple文档技术说明2065中,它提到了"使用管理员权限执行shell脚本命令",使用这种方式时,"一旦脚本正确通过身份验证,它将在五分钟内不再要求身份验证。

但是,它仍然需要一次又一次地要求身份验证。

我发现,当使用 ScriptEditor.app 时,苹果文档是正确的。 例如:do shell script "/bin/cp -r /Users/Simon/Desktop/Test/test.zip /Users/Simon/Desktop/ " with administrator privileges

但是,当使用NSAppleScript运行shell脚本时,Apple Document是错误的。 例如:

NSDictionary *error = nil;
NSString *copyScript = @"do shell script "/bin/cp -r /Users/Simon/Desktop/Test/test.zip /Users/Simon/Desktop " with administrator privileges";
NSAppleScript *copyAppleScript = [[NSAppleScript alloc] initWithSource:copyScript];
if ([copyAppleScript executeAndReturnError:&error])
{
NSLog(@"copyAppleScript Success!");
}
else
{
NSLog(@"copyAppleScript Failuer!");
}

我希望,当使用 NSAppleScript 进行 shell 脚本时,它也不会再次要求身份验证五分钟。

首先,我不认为这是解决这个问题的最佳方法。但让我先回答这个问题,然后再提出另一种途径。

请注意,技术说明 2065 是这样说的:

身份验证仅适用于该特定脚本:不同的 脚本或同一脚本的修改版本将要求自己的脚本 认证。

每次运行此行时:

NSAppleScript *copyAppleScript = [[NSAppleScript alloc] initWithSource:copyScript];

。您创建一个新脚本,该脚本将需要自己的授权。如果要重用给定脚本而不不断重新授权,则需要创建一个NSAppleScript属性,将脚本存储一次,然后重复调用它。 换句话说:

@interface MyObject ()
@property (strong) NSAppleScript *myAppleScript;
@end
@implementation MyObject
- (void)setUpScript {
// call this once
NSDictionary *error = nil;
NSString *copyScript = @"do shell script "/bin/cp -r /Users/Simon/Desktop/Test/test.zip /Users/Simon/Desktop " with administrator privileges";
self.myAppleScript = [[NSAppleScript alloc] initWithSource:copyScript];
}
- (void)runScript {
// call this as needed; shouldn't need reauthorization
if ([self.myAppleScript executeAndReturnError:&error]) {
NSLog(@"myAppleScript Success!");
} else {
NSLog(@"myAppleScript Failure!");
}
}
@end

但是,由于您在这里的目标是运行 shell 脚本,我建议您完全忘记NSAppleScript,改用NSTaskNSTaskshell 脚本是如何从 objC 运行的,并且应该完全避免授权问题。最简单的方法是编写一个显式 shell 脚本并将其存储在捆绑包中:

#!/bin/bash
cp -r /Users/Simon/Desktop/Test/test.zip /Users/Simon/Desktop

然后调用并运行该 shell 脚本:

NSError *err;
NSTask *task = [NSTask launchedTaskWithExecutableURL:[[NSBundle mainBundle] URLForResource:@"ShellScript"
       withExtension:@"sh"]
arguments:[NSArray array]
error:&err
terminationHandler:nil];

。或者也许这个,如果你不想捆绑脚本......

NSError *err;
NSTask *task = [[NSTask alloc] init]
task.arguments = [NSArray arrayWithObjects:@"#!/bin/bash",
@"-c",
@"cp -r /Users/Simon/Desktop/Test/test.zip /Users/Simon/Desktop",
nil];
[task launchAndReturnError:&err];

附言

我一直假设这个cp命令只是概念验证,但是如果您的实际目标是复制文件,请忘记NSAppleScriptNSTask。请改用NSFileManager'scopyItemAtURL:toURL:error:

相关内容

最新更新