Поймать учетные данные, необходимые с NSTask и rsync - PullRequest
3 голосов
/ 27 октября 2010

Первый пост для французского разработчика! Я пытаюсь создать простую синхронизацию, используя rsync и target-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 голос
/ 28 октября 2010

Насколько я знаю, единственный способ сделать это - создать отдельную программу для ввода пароля (например, программу "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.Я использую это сам, и это работает довольно хорошо, хотя это несколько сложно настроить.

1 голос
/ 27 октября 2010

от rsync man страница:

Некоторые модули на удаленном демоне могут требовать аутентификации. Если это так, вы получите пароль подскажите при подключении. Вы можете избежать запроса пароля, установив переменная окружения RSYNC_PASSWORD - пароль, который вы хотите использовать, или параметр --password-file. Это может быть полезно фул при написании скриптов rsync.

ВНИМАНИЕ: В некоторых системах переменные окружения видны всем пользователям. На этих системах, использующих --password-файл рекомендуется.

0 голосов
/ 13 июля 2012

Я считаю, что лучший способ избежать паролей - это использовать сертификаты с 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 ..

Надеюсь, это поможет.

...