有時間一個頭疼的問題,爲什麼網上的大俠們不能總結下呢。。。
具體問題如下:
我要在代碼裏面實現命令遠程拷貝: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)結束,最後一個參數則爲傳遞給執行文件的新環境變量數組。
- #include<unistd.h>
- main()
- {
- char *argv[ ]={"ls", "-al", "/etc/passwd", NULL};
- char *envp[ ]={"PATH=/bin", NULL}
- execve("/bin/ls", argv, envp);
- }
二、用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,這樣可以捕獲到輸入密碼的提示,在輸入密碼就可以了”