2013-09-22 3 views
1

Следующая программа C компилирует и выдает список каталогов каталога «/ Users/home/tempdir».Как scp от C-программы?

#include <stdio.h> 
#include <unistd.h> 
int main(int argc, const char * argv[]) 
{ 
     execl("/bin/ls", "ls", "/Users/home/tempdir"); 
     // execl("/usr/bin/scp", "scp", "myfile.txt [email protected]:/Users/home/scpdir"); 
    return 0; 
} 

Это показывает, что можно выполнить двоичный файл из программы C. Я пытаюсь выяснить, как выполнить двоичный файл «scp» и ввести требуемую кодовую фразу. Как я могу изменить приведенный выше код для успешной передачи файлов через scp?

Я попытался линия, которая комментируется выше, однако я получаю следующее сообщение, когда оно раскомментировано:

usage: scp [-1246BCEpqrv] [-c cipher] [-F ssh_config] [-i identity_file] 
      [-l limit] [-o ssh_option] [-P port] [-S program] 
      [[[email protected]]host1:]file1 ... [[[email protected]]host2:]file2 

Так что, очевидно, пытается выполнить УППЫ без пароля. Как мне обойти это?

+0

Я попытался избавиться от второго аргумента «scp», однако я получаю тот же оператор использования, за исключением того, что на этот раз я получаю предупреждение «main.c: 17: warning: недостаточно аргументов аргумента, чтобы подогнать дозор» – user1068636

ответ

2

Хотя вы можете вызвать scp из командной строки, используя ожидание или что-то еще, вам гораздо лучше использовать библиотеку, если это вообще возможно.

Общее правило при разработке заключается в том, чтобы по возможности использовать библиотеки для системных исполнений. Он держит ваш код более чистым и портативным. Исключение составляет, если вы пишете сценарий оболочки.

http://www.libssh2.org/

libssh2 это свободная библиотека C, которая поддерживает аутентификацию по паролю, а также SCP/SFTP и поддерживает OS X.

http://curl.haxx.se/libcurl/

Libcurl поддерживает почти каждый тип передачи файлов вы можете хотеть , работает практически на каждой платформе, которую вы можете захотеть, и имеет привязки для почти любого языка, который вы могли бы захотеть.

1

Короткий ответ, я знаю, но вы обычно используете что-то вроде Expect для автоматизации интерактивных приложений таким образом.

+0

So нет способа сделать это с C? – user1068636

+0

Вы можете использовать библиотеку 'Expect' от C. –

+0

Я нахожусь в Macintosh OS X 10.6 - но я вижу только библиотеки unix и windows для Expect. Есть ли для Mac? – user1068636

0

Мне кажется, что вывод, который вы печатаете, - это неправильный синтаксис команды. Согласно странице руководства для execl (по крайней мере, на Arch Linux):

Констого символ * арг и последующие эллипсы в execl(), функции имеют(), и execle() функцию можно рассматривать как arg0, arg1, ..., argn.

Так что, казалось бы, правильный способ назвать это:

execl("/usr/bin/scp", "scp", "myfile.txt", "[email protected]:/Users/home/scpdir"); 

Кроме того, если вы хотите, чтобы избежать того, чтобы положить в пароле полностью, SSH (который УПП построен на вершине) может быть настроен с помощью «авторизованного ключа», который обходит пароль. Тем не менее, он все еще может спрашивать о неизвестных ключевых отпечатках пальцев. Простой способ установить беспарольный доступ УПП работать (от компьютера инициируя УПП):

ssh-copy-id [email protected] 

выше команда будет запрашивать пароль один раз, они вам не нужно вводить его снова при последующих операциях ssh.

Смежные вопросы