解决在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,这样可以捕获到输入密码的提示,在输入密码就可以了”

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