2014-03-01 13 views
0

첫째, 나는 아래의 코드를 애플 스크립트 응용 프로그램 (: UnloadTest.scpt 파일 이름) : 생성 된NSAppleScript를 사용하여 ObjectScript C의 AppleScript 앱을 만들고 호출하면 동일한 코드로 다른 결과가 나타 납니까?

-- Set user name and password 
set UserName to "MyAccount" 
set MyPASSWORD to "MyPassword" 
-- unload FTDIUSBSerialDriver 
do shell script "sudo kextunload /System/Library/Extensions/FTDIUSBSerialDriver.kext" user  name UserName password MyPASSWORD with administrator privileges 
-- Copy driver to the used location 
do shell script "sudo cp ./libftd2xx.1.0.2.dylib /usr/local/lib" user name UserName password MyPASSWORD with administrator privileges 
do shell script "sudo cp ./libd2xx_table.dylib /usr/local/lib" user name UserName password MyPASSWORD with administrator privileges 
do shell script "cd /usr/local/lib" user name UserName password MyPASSWORD with administrator privileges 
do shell script "sudo ln -sf libftd2xx.1.0.2.dylib libftd2xx.dylib" user name UserName password MyPASSWORD with administrator privileges 

을 그리고, 아래의 코드 호출에 NSAppleScript 클래스를 사용

NSString * strScript = [[NSBundle mainBundle] pathForResource:@"UnloadTest" ofType:@"scpt"]; 
NSAppleScript * appScript = [[NSAppleScript alloc] initWithContentsOfURL:[NSURL fileURLWithPath:strScript] error:nil]; 
[appScript executeAndReturnError:NULL]; 
[appScript release]; 

잘 작동 할 수는 있지만 문제가 있습니다. 다른 컴퓨터에서 내 APP를 실행하려면 UserName과 MyPASSWORD를 다른 사람의 "UnloadTest.scpt"파일로 변경해야합니다. 바보입니다! 그래서 다른 방법을 가고 싶어 : 사용 "- (ID) initWithSource : (있는 NSString *) 소스"코드에서 애플 스크립트를 생성하는 기능, 내 APP 인터페이스에서 사용자 이름 & 암호를 보낼 수 있습니다

NSString  *strScriptUnload = [NSString stringWithFormat:@"\ 
              set UserName to \"%@\"\ 
              set MyPASSWORD to \"%@\"\ 
              do shell script \"sudo kextunload /System/Library/Extensions/FTDIUSBSerialDriver.kext\" user name UserName password MyPASSWORD with administrator privileges\ 
              do shell script \"sudo cp ./libftd2xx.1.0.2.dylib /usr/local/lib\" user name UserName password MyPASSWORD with administrator privileges\ 
              do shell script \"sudo cp ./libd2xx_table.dylib /usr/local/lib\" user name UserName password MyPASSWORD with administrator privileges\ 
              do shell script \"cd /usr/local/lib\" user name UserName password MyPASSWORD with administrator privileges\ 
              do shell script \"sudo ln -sf libftd2xx.1.0.2.dylib libftd2xx.dylib\" user name UserName password MyPASSWORD with administrator privileges",[m_textUserName stringValue], [m_textPassword stringValue]]; 
    NSAppleScript *appUnloadScript = [[NSAppleScript alloc] initWithSource:strScriptUnload]; 
    returnDescriptor = [appUnloadScript executeAndReturnError:nil]; 
    [appUnloadScript release]; 

그러나 그것은 나를 위해 실패한 작품이다. 모양은 다음과 같다.

sudo ln -sf libftd2xx.1.0.2.dylib libftd2xx.dylib 

성공하지 않는다. AppleScript가 권한을 얻지 못했지만 그것을 수정하는 방법을 모르겠습니다.

이 문제를 이해하는 데 도움을 줄 수있는 사람이 있습니까?

+0

* 사용자의 로그인 세부 정보를 절대 하드 코딩하지 않습니다. 거대한 보안 위반입니다. 하나의'do shell script "set -e; cmd1; cmd2; cmd3; ..."with administrator privileges' 명령을 사용하십시오. 그러면 사용자는 계속 진행하기 전에 한 번 인증을 받으라는 메시지를 자동으로 표시합니다. – foo

+0

하지만 내 앱이 매번 AppleScript를 호출해야하기 때문에 저에게는 좋지 않습니다. 내가 말한대로 그렇게하면 사용자가 한 번이 아니라 항상 인증을 받도록합니다. – Raniys

+0

앱에서이 스크립트를 얼마나 자주 실행해야합니까? 원래 게시물은 배경 정보를 제공하지 않습니다. – foo

답변

1

AppleScript 코드 행 다음에 "\ n"이 누락 된 이유를 발견했습니다. 아래 코드는 성공입니다.

NSString  *strScriptUnload = [NSString stringWithFormat:@"\ 
             set UserName to \"%@\"\n\ 
             set MyPASSWORD to \"%@\"\n\ 
             do shell script \"sudo kextunload /System/Library/Extensions/FTDIUSBSerialDriver.kext\" user name UserName password MyPASSWORD with administrator privileges\n\ 
             do shell script \"sudo cp ./libftd2xx.1.0.2.dylib /usr/local/lib\" user name UserName password MyPASSWORD with administrator privileges\n\ 
             do shell script \"sudo cp ./libd2xx_table.dylib /usr/local/lib\" user name UserName password MyPASSWORD with administrator privileges\n\ 
             do shell script \"cd /usr/local/lib\" user name UserName password MyPASSWORD with administrator privileges\n\ 
             do shell script \"sudo ln -sf libftd2xx.1.0.2.dylib libftd2xx.dylib\" user name UserName password MyPASSWORD with administrator privileges\n",[m_textUserName stringValue], [m_textPassword stringValue]]; 
NSAppleScript *appUnloadScript = [[NSAppleScript alloc] initWithSource:strScriptUnload]; 
returnDescriptor = [appUnloadScript executeAndReturnError:nil]; 
[appUnloadScript release]; 

감사합니다.

+0

문자열 munging을 사용하여 매개 변수를 스크립트에 전달하는 것은 좋지 않습니다. 문자열에 문자열을 삽입하기 전에 입력을 위생적으로 처리하지 못하는 것은 아주 나쁜 습관이며 완전히 안전하지 않습니다. (텍스트에 큰 따옴표 나 역 슬래쉬가 포함 된 경우 어떻게됩니까?) [다음은 올바른 방법입니다.] (http://stackoverflow.com/questions/19759149/cocoa-run-applescript-that-already-contains-double- quotes/19774696 # 19774696) – foo