使用NSTask和rsync捕获凭证需要的问题

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
3个回答

1

来自rsync man页面:

远程守护进程上的某些模块可能需要身份验证。如果是这样,连接时您将收到密码提示。您可以通过设置环境变量RSYNC_PASSWORD为要使用的密码或使用--password-file选项来避免密码提示。在编写rsync脚本时,这可能非常有用。

警告:在某些系统上,环境变量对所有用户可见。在这些系统上,建议使用--password-file。


1
此选项不会向诸如ssh之类的远程shell传输提供密码;要了解如何执行此操作,请参阅远程shell的文档。当使用远程shell作为传输方式访问rsync守护程序时,此选项仅在远程shell完成身份验证后生效(即,如果您还在守护程序的配置文件中指定了密码)。 - Mickael

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。我自己使用它,它运行得相当不错,尽管设置有点复杂。


博客404错误。它能在其他地方找到吗? - wcochran

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是私有证书,保存在您的计算机上,用于签署出站数据

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

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

希望这可以帮助到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接