使用具有管理员权限的AppleScript,“不要在五分钟内再次要求身份验证”。不起作用?

时间:2019-07-26 06:24:42

标签: applescript

在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脚本时,它也不会在五分钟内再次要求身份验证。

1 个答案:

答案 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 ,而应使用NSTaskNSAppleScript是如何从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