9

私のCocoaアプリケーションでは、NSTaskいくつかの基本的なGitコマンドを実行するために使用しようとしています。リモートにアクセスするためにアクセス許可(SSHキー)を必要とするコマンド(たとえばgit pushgit pull)を実行すると、次のエラーで失敗します。

許可が拒否されました(公開鍵)。リモートエンドが予期せずハングアップしました

ターミナルから同じコマンドを実行すると問題なく動作するため、これはNSTask、sshキーにアクセスするプロセスのどこかで使用される環境変数を設定しない場合の問題である可能性があると考えています。HOMEUSER環境変数を次のように手動で設定してみました。

[task setEnvironment:[NSDictionary dictionaryWithObjectsAndKeys:NSHomeDirectory(), @"HOME", NSUserName(), @"USER", nil]];

しかし、これは効果がありません。NSTaskこれが正しく機能するために設定する必要のある特定の環境変数はありますか?

編集:ダスティンのヒントのおかげで、私はこれを理解するのに少し進んだ。コマンドを使用envして現在のセッションの環境変数を一覧表示しましたが、次のことがわかりました。

SSH_AUTH_SOCK=/tmp/launch-DMQopt/Listeners

テストするために、そのパスをコピーしての環境変数として設定しNSTask、コードを再度実行しましたが、今回は機能しました。SSH_AUTH_SOCKとは言うものの、セッションごとに変更されると確信しているので、ハードコーディングするだけでは不十分です。この変数を動的に生成/取得するにはどうすればよいですか?

4

1 に答える 1

4

チュートリアル「 NSTaskでのrsyncまたはSSHのラップ」(Iraから)に従うことができます。このチュートリアルでは、SSH_AUTH_SOCK変数について言及しています。

この投稿を書いた後、NSTaskの環境変数を設定する際の重要な追加手順を省略したことに気付きました。
パスワードなしのキーベースの認証を機能させるにSSH_AUTH_SOCKは、ユーザーの環境から変数を取得し、これをNSTaskの環境に含める必要があります
したがって、たとえば環境変数を設定する場合、

NSTask *task;
NSDictionary *environmentDict = [[NSProcessInfo processInfo] environment];
// Environment variables needed for password based authentication 
NSMutableDictionary *env = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                         @"NONE", @"DISPLAY",                           askPassPath, @"SSH_ASKPASS",
                         userName,@"AUTH_USERNAME",
                         hostName,@"AUTH_HOSTNAME",
                         nil];

// Environment variable needed for key based authentication
[env setObject:[environmentDict objectForKey:@"SSH_AUTH_SOCK"] forKey:@"SSH_AUTH_SOCK"];

// Setting the task's environment
[task setEnvironment:env];

ただし、OPindragieは次のようにコメントしています。

私は以前にこれを試しましたが、XCodeで呼び出されていたため、envvar SSH_AUTH_SOCK。それに渡されていませんでした。
Finderからアプリを開くと、この問題が修正されます。



askPassPath アプリケーションのメインバンドルの一部として含まれているAskpass実行可能ファイルのパスです。(これを行うには、xcodeの「Products」で実行可能ファイルを見つけて、メインアプリケーションのターゲットの「CopyBundleResources」にドラッグします。)

// Get the path of the Askpass program, which is
// setup to be included as part of the main application bundle
NSString *askPassPath = [NSBundle pathForResource:@"Askpass"
              ofType:@"" 
              inDirectory:[[NSBundle mainBundle] bundlePath]];
于 2011-06-03T07:16:19.337 に答える