您的位置:首页 > 移动开发 > IOS开发

解决在iOS开发的代码中实现scp的ssh远程连接,怎么输入密码问题

2014-09-05 10:24 661 查看
有时间一个头疼的问题,为什么网上的大侠们不能总结下呢。。。

具体问题如下:

我要在代码里面实现命令远程拷贝: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,这样可以捕获到输入密码的提示,在输入密码就可以了”
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐