Cocoa 捕获NSTask和rsync所需的凭据
法国开发人员的第一篇帖子! 我正在尝试使用rsync和objective-c创建一个简单的同步。 所以我使用了类似这样的任务:Cocoa 捕获NSTask和rsync所需的凭据,cocoa,ftp,rsync,nstask,Cocoa,Ftp,Rsync,Nstask,法国开发人员的第一篇帖子! 我正在尝试使用rsync和objective-c创建一个简单的同步。 所以我使用了类似这样的任务: NSTask *task = [[NSTask alloc] init]; [task setLaunchPath:@"/usr/bin/rsync"]; NSArray* args = [NSArray arrayWithObjects:@"-av", @"/Users/BiB1/Documents/test/", @"login@ftp.myserver.net:~
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*task=[[NSTask alloc]init];
[任务集启动路径:@/usr/bin/rsync];
NSArray*args=[NSArray ARRAY WITHOBJECTS:@“-av”,@“/Users/BiB1/Documents/test/,@”login@ftp.myserver.net:~/test/“,无];
NSDictionary*env=[NSDictionary Dictionary WithObject:forKey:
[任务集参数:args];
NSPipe*outPipe=[[NSPipe alloc]init];
[任务设置标准输出:输出管];
[输出管释放];
[任务启动];
NSData*data=[[outPipe fileHandleForReading]readDataToEndOfFile];
[task waitUntilExit];
int status=[任务终止状态];
[任务发布];
如果(状态!=0)
{
NSDictionary*法令=[NSDictionary Dictionary WithObject:@“不可能同步”forKey:NSOSStatusErrorDomain];
NSError*outError=[NSError errorWithDomain:NSOSStatusErrorDomain代码:0用户信息:法令];
NSLog(@“法令:%”,法令);
NSLog(@“错误:%@”,外部错误);
}
NSString*aString=[[NSString alloc]initWithData:数据编码:NSUTF8StringEncoding];
[self.textField setStringValue:aString];
[收敛释放];
在终端中,命令可以正常工作,但我有一个密码请求。在NSTask中,我没有这个请求
所以我的问题是,有一种方法可以捕获所需的credential,或者可以将密码设置为参数或其他东西
提前谢谢
BiB1来自rsync页面:
远程守护进程上的某些模块可能需要身份验证。
如果是,您将收到一个密码
连接时提示。通过设置
环境变量
RSYNC_PASSWORD指向要使用的密码或使用--PASSWORD file选项。这可能是使用-
在编写rsync脚本时使用ful
警告:在某些系统上,所有用户都可以看到环境变量
--建议使用密码文件
据我所知,唯一的方法是创建一个单独的程序来提供密码(即“Askpass”程序)并设置环境变量SSH_Askpass 这里有一个源代码示例
虽然这些示例是针对ssh的,但它们也适用于rsync。我自己使用它,虽然设置起来有点复杂,但效果很好。我发现避免使用密码的最佳方法是在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"
-我指定一个证书作为身份,以证明您是谁,并自动“登录”
此证书是通过调用以下命令生成的:
ssh-keygen -t rsa -b 2048 -f key
从何处进行备份,然后将密钥放置在目标上的特定位置
运行此脚本(需要下面的脚本),从中存储证书,其中包含服务器的参数ip和ssh的端口号(例如./setup.sh//192.168.1.22 23024) 脚本将需要用户名和密码一次,但从那时起rsync将使用证书作为您的凭据 密钥是私人证书,保存在计算机上,用于对传出数据进行签名 key.pub是公共证书,保存在任何用于检查签名数据并确认其来自您的计算机上 .ssh是主目录中的一个特殊文件夹,用于存储用于ssh的证书
我希望这会有所帮助。此选项不会为ssh等远程shell传输提供密码;要了解如何做到这一点,请参阅远程shell的文档。当使用远程shell作为传输访问rsync守护程序时,此选项仅在远程shell完成其身份验证后生效(即,如果您在守护进程的配置文件中也指定了密码)。Blog 404的。是否可以在其他地方找到它?
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
#!/bin/bash
mkdir .ssh
cd .ssh
cat key.pub > authorized_keys
exit