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/

和一个源代码示例here。

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

尽管这些示例适用于 ssh,但它们也适用于 rsync。我自己使用它,虽然设置起来有些复杂,但它工作得很好。

于 2010-10-28T00:00:44.477 回答
1

从 rsync手册页:

远程守护程序上的某些模块可能需要身份验证。如果是这样,您将在连接时收到密码提示。您可以通过将环境变量 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 指定证书作为身份证明您是谁并自动“登录”。

该证书是通过调用生成的:

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

该脚本将需要用户名和密码一次,但从那时起 rsync 将使用证书作为您的凭据。

密钥是私有证书,保存在您的计算机上,用于签署传出数据

key.pub 是公共证书,保存在任何用于检查签名数据并确认它来自您的计算机上。

.ssh 是主目录中的一个特殊文件夹,用于存储用于 ssh 的证书。

我希望这有帮助。

于 2012-07-13T04:43:01.603 回答