3

フランスの開発者のための最初の投稿! rsync と Objective-C を使用して簡単な同期を作成しようとしています。だから私はそのようにNSTaskを使用しました:

NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"/usr/bin/rsync"];
NSArray* args = [NSArray arrayWithObjects:@"-av", @"/Users/BiB1/Documents/test/", @"login@ftp.myserver.net:~/test/", nil];
NSDictionary* env = [NSDictionary dictionaryWithObject:<#(id)object#> forKey:<#(id)key#>
[task setArguments:args];
NSPipe *outPipe = [[NSPipe alloc] init];
[task setStandardOutput:outPipe];
[outPipe release];
[task launch];

NSData *data = [[outPipe fileHandleForReading] readDataToEndOfFile];
[task waitUntilExit];

int status = [task terminationStatus];
[task release];
if(status != 0)
{
    NSDictionary *eDict = [NSDictionary dictionaryWithObject:@"Sync impossible" forKey:NSOSStatusErrorDomain];
    NSError *outError   = [NSError errorWithDomain:NSOSStatusErrorDomain code:0 userInfo:eDict];

    NSLog(@"EDICT : %@",eDict);
    NSLog(@"ERROR : %@",outError);
}

NSString *aString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
[self.textField setStringValue:aString];

[aString release];

ターミナルではコマンドは正常に機能しますが、パスワードを要求しています。NSTask では、この要求はありません。

だから私の質問は、必要な資格情報を取得する方法があるか、またはパスワードをパラメーターなどとして設定することは可能かということです。

事前に感謝します。

BiB1

4

3 に答える 3

1

私の知る限り、これを行う唯一の方法は、パスワードを提供する別のプログラム (つまり、"Askpass" プログラム) を作成し、環境変数 SSH_ASKPASS を設定することです。ここにこれを行う方法に関する一連の指示を書きました

http://www.mudflatsoftware.com/blog/2010/01/wrapping-rsync-or-ssh-in-an-nstask/

ソースコードの例はこちら。

http://bitbucket.org/iracooke/ssh-nstask

例は ssh 用ですが、rsync にも適用されます。私はこれを自分で使用しており、セットアップがやや複雑ですが、かなりうまく機能します。

于 2010-10-28T00:00:44.477 に答える
1

rsync のmanページから:

リモート デーモンの一部のモジュールでは、認証が必要になる場合があります。その場合、接続時にパスワード プロンプトが表示されます。環境変数 RSYNC_PASSWORD を使用するパスワードに設定するか、 --password-file オプションを使用すると、パスワード プロンプトを回避できます。これは、rsync のスクリプトを作成するときに役立つ場合があります。

警告: 一部のシステムでは、環境変数がすべてのユーザーに表示されます。これらのシステムでは、 --password-file を使用することをお勧めします。

于 2010-10-27T14:22:02.777 に答える
0

パスワードを回避する最善の方法は、SSH/rsyncで証明書を使用することです。これはrsyncへの私の呼び出しです:

rsync -azvr --stats --rsh="ssh -p${ssh port} -i /path/to/certificate/key" ${source} ${destination}

重要な部分は次のとおりです。

--rsh="ssh -p${ssh port} -i /path/to/certificate/key"

-iは、あなたが誰であるかを証明するためのIDとして証明書を指定し、自動的に「ログイン」します。

この証明書は、次の呼び出しによって生成されます。

ssh-keygen -t rsa -b 2048 -f key

どこからバックアップしてからキーを置くかは、目的地の特定の場所です

このスクリプト(以下のスクリプトが必要)を実行します。ここから、サーバーのパラメーターipとsshのポート番号
(例:./setup.sh //192.168.1.22 23024)を使用して証明書を保存します。

echo "generate key"
ssh-keygen -t rsa -b 2048 -f key
echo "push key to server"
rsync -avz --rsh="ssh -p$2" key.pub $1:~/.ssh/key.pub
echo "put key in authorized_keys on server"
ssh -p$2 $1 'bash -s' < ../remote.sh

このスクリプトは、「remote.sh」という名前の同じ場所に保存する必要があります

#!/bin/bash

mkdir .ssh
cd .ssh
cat key.pub > authorized_keys

exit

スクリプトはユーザー名とパスワードを1回要求しますが、それ以降、rsyncは証明書を資格情報として使用します。

キーは秘密証明書であり、送信データに署名するために使用されるコンピューターに保持されます

key.pubは公開証明書であり、署名されたデータをチェックし、それがあなたからのものであることを確認するために使用されるすべてのコンピューターに保持されます。

.sshは、sshで使用する証明書を格納するためのホームディレクトリ内の特別なフォルダです。

これがお役に立てば幸いです。

于 2012-07-13T04:43:01.603 に答える