解決在iOS開發的代碼中實現scp的ssh遠程連接,怎麼輸入密碼問題

有時間一個頭疼的問題,爲什麼網上的大俠們不能總結下呢。。。

具體問題如下:

我要在代碼裏面實現命令遠程拷貝:scp “源目錄文件” user@IP:/目的地址“ 

這個命令輸入後會有一個提示是否連接:yes

密碼:xxxxxx

所以這裏會有兩個交互,怎麼辦呢?

我找了個種資料,想用以下幾個方法,但都只會一半,交互那裏就不知道怎麼辦。


一、用exec

      

在父進程中fork一個子進程,在子進程中調用exec函數啓動新的程序。exec函數一共有六個,其中execve爲內核級系統調用,其他(execl,execle,execlp,execv,execvp)都是調用execve的庫函數。

#include<unistd.h>

函數定義 int execve(const char *filename, char *const argv[ ], char *const envp[ ]);

返回值 函數執行成功時沒有返回值,執行失敗時的返回值爲-1.

函數說明 execve()用來執行參數filename字符串所代表的文件路徑,第二個參數是利用數組指針來傳遞給執行文件,並且需要以空指針(NULL)結束,最後一個參數則爲傳遞給執行文件的新環境變量數組。

  1. #include<unistd.h>   
  2. main()   
  3. {   
  4.   char *argv[ ]={"ls""-al""/etc/passwd", NULL};   
  5.   char *envp[ ]={"PATH=/bin", NULL}   
  6.   execve("/bin/ls", argv, envp);   
  7. }  
解決不了交互。。。

二、用NSPipe

     

#include "NSTask.h"

- (void) listTcpPorts {
   NSTask *task = [[NSTask alloc] init];
   [task setLaunchPath: @"/usr/sbin/lsof"];
   [task setArguments: [[NSArray alloc] initWithObjects: @"-i4tcp", nil]];

   NSPipe *pipe= [NSPipe pipe];
   [task setStandardOutput: pipe];

   NSFileHandle *file = [pipe fileHandleForReading];

   [task launch];

   NSData *data = [file readDataToEndOfFile];

   NSString *output = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
   NSLog(@"tcp ports: \n %@", output);
}
 

三、網上提出來的用expect腳本自動輸入

用TCL的expect

需要安裝TCL語言,是什麼東東。。。

四、僞終端

有人說已經用這個解決了

用的是打開一個僞終端,執行/bin/sh,再在裏面執行scp,這樣可以捕獲到輸入密碼的提示,在輸入密碼就可以了”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章