有时间一个头疼的问题,为什么网上的大侠们不能总结下呢。。。
具体问题如下:
我要在代码里面实现命令远程拷贝: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,这样可以捕获到输入密码的提示,在输入密码就可以了”