在Apple文档Technical Note 2065中,它提到“使用管理员权限执行shell脚本命令”,当使用这种方式时,“一旦对脚本进行了正确的身份验证,它将在五分钟内不再要求身份验证。” < / p>
但是,它仍然需要一次又一次地要求认证。
我发现,使用ScriptEditor.app时,Apple Document是正确的。
例如:
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脚本时,它也不会在五分钟内再次要求身份验证。
答案 0 :(得分:1)
首先,我认为这不是解决此问题的最佳方法。但是,让我先回答这个问题,然后再提出另一个途径。
请注意,技术说明2065对此进行了说明:
身份验证仅适用于该特定脚本:不同 脚本或同一脚本的修改版本,将要求提供自己的脚本 身份验证。
每次运行此行:
@Controller
class WebsocketController {
private lateinit var template: SimpMessagingTemplate
@MessageMapping("/send")
fun onReceiveMessage(message: String) {
template.convertAndSend("/topic/chat", message)
}
}
@Configuration
@EnableWebSocketMessageBroker
class WebSocketConfig : WebSocketMessageBrokerConfigurer {
override fun registerStompEndpoints(registry: StompEndpointRegistry) {
registry.addEndpoint("/socket")
.setAllowedOrigins("*")
.withSockJS()
}
override fun configureMessageBroker(registry: MessageBrokerRegistry) {
registry.enableSimpleBroker("/topic")
}
}
//And the Angular code
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
title = 'transport-protocol-web';
protocols: Protocol[] = [];
private serverUrl = 'https://transportdev.azurewebsites.net/socket';
private stompClient;
constructor() {
let ws = new SockJS(this.serverUrl);
this.stompClient = Stomp.over(ws);
let that = this;
this.stompClient.connect({}, function() {
that.stompClient.subscribe('/topic/chat', (message) => {
if (message.body) {
console.log(message.body);
that.protocols.unshift(JSON.parse(message.body))
}
})
});
}
ngOnInit() {
}
sendMessage() {
this.stompClient.send('/app/send',{},'Hello toi');
}
}
...您创建一个新脚本,该 new 脚本将需要其自己的授权。如果要重复使用给定的脚本而不进行不断的授权,则需要创建一个NSAppleScript *copyAppleScript = [[NSAppleScript alloc] initWithSource:copyScript];
属性,将脚本存储在那里,然后重复调用。换句话说:
NSAppleScript
但是,由于您的目标是运行Shell脚本,因此建议您完全不要使用@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
,而应使用NSTask
。 NSAppleScript
是如何从objC运行shell脚本的方式,应完全避免授权问题。最简单的方法是编写一个显式的shell脚本并将其存储在bundle中:
NSTask
然后调用并运行该Shell脚本:
#!/bin/bash
cp -r /Users/Simon/Desktop/Test/test.zip /Users/Simon/Desktop
...或者也许是这样,如果您不想捆绑脚本...
NSError *err;
NSTask *task = [NSTask launchedTaskWithExecutableURL:[[NSBundle mainBundle] URLForResource:@"ShellScript"
withExtension:@"sh"]
arguments:[NSArray array]
error:&err
terminationHandler:nil];
PS
我一直以为这个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
和 NSAppleScript
。改用NSFileManager's
NSTask
。