2013-09-22 28 views
1

以下C程序編譯並吐出「/ Users/home/tempdir」目錄的目錄列表。如何從C程序scp?

#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 

因此它明顯是想沒有密碼進行SCP。我如何解決這個問題?

+0

我試圖擺脫的第二個參數「SCP」的,但是我得到相同的用法說明,但這次我得到警告「的main.c:17:警告:沒有足夠的可變參數,以適應哨兵」 – user1068636

回答

2

雖然你可以調用使用指望什麼的命令行SCP,你好得多使用庫,如果在所有可能的。

開發時的一般規則是儘可能使庫更適合系統執行。它使您的代碼更清潔,更便於攜帶。例外是如果你正在編寫一個shell腳本。

http://www.libssh2.org/

libssh2是支持密碼驗證以及SCP/SFTP和支持OS X.自由C庫

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

libcurl的支持,幾乎每一個文件傳輸類型,你可以想,幾乎適用於所有你想要的平臺,並且可以綁定幾乎所有你想要的語言。

1

簡短的回答,我知道,但你通常會使用類似Expect以這種方式自動交互式應用程序。

+0

所以有沒有辦法從C做到這一點? – user1068636

+0

您可以使用C的'Expect'庫。 –

+0

我在macintosh OS X 10.6上 - 但我只能看到Expect的unix和windows庫。有一個mac嗎? – user1068636

0

在我看來,您打印的輸出是來自不正確的命令語法。根據手冊頁EXECL(至少在Arch Linux的):

的常量字符* Arg和隨後的橢圓在execl的(),execlp(), 和execle()函數可以被認爲是arg0,arg1,...,argn。

所以它似乎正確的方法來調用它:

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

另外,如果你想避免把密碼中完全,SSH(這SCP是建立在頂部)可以配置一個繞過密碼的「授權密鑰」。不過,它仍然可能會詢問關於未知鍵的指紋。 一個簡單的方法來設置密碼的SCP訪問是(啓動SCP從計算機)上運行:

ssh-copy-id [email protected] 

上面的命令將要求輸入密碼一次,他們不應該需要輸入它再次在隨後的SSH操作。