Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 捕获NSTask和rsync所需的凭据_Cocoa_Ftp_Rsync_Nstask - Fatal编程技术网

Cocoa 捕获NSTask和rsync所需的凭据

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:~

法国开发人员的第一篇帖子! 我正在尝试使用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:~/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