首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++环境上的expect远程命令执行

2012-11-01 
C++环境下的expect远程命令执行首先,必须安装几个开发包,在centos/fedora下,可以使用yum安装:$ yum -y ins

C++环境下的expect远程命令执行

首先,必须安装几个开发包,在centos/fedora下,可以使用yum安装:

$ yum -y install tcl-devel expect-devel

?

装完以后,就可以使用expect来写代码了,从网上拉下来一段代码,稍微修改了一下:

#include <tcl.h>#include <expect.h>#include <stdio.h>#include <unistd.h>#include <iostream>#include <expect_tcl.h>using namespace std;int main(){extern int exp_timeout;exp_timeout = 100;Tcl_Interp *tcl;tcl = Tcl_CreateInterp();if (Expect_Init(tcl) != TCL_OK){puts("failure");return 1;}//start a connection with remote ssh serverint fd = exp_spawnl("ssh", "ssh", "-p 22", "username@server_address", "echo start;ls ~;", (char *)0);if(fd < 0){cout<<"Fail to ssh"<<endl;return -1;}int loop = 1;int result;while(loop){//predefine some expected responsesresult = exp_expectl(fd, exp_glob, "*assword: ", 1, exp_exact, "Permission denied, please try again.", 2, exp_regexp, "(The authenticity of host)(.)*(Are you sure you want to continue connecting (yes/no)?)", 3, exp_end);char pas[] = "your_password\n";switch(result){case 1:write(fd, pas, sizeof(pas) - 1);break;case 2:cout <<"wrong password"<<endl;break;case 3:cout<<"connect security"<<endl;write(fd, "yes\n", 4);break;case EXP_EOF:cout << "EOF\n";loop = 0;break;case EXP_TIMEOUT:cout<<"Time out\n";loop = 0;break;default:cout<<"logged in "<<result<<endl;loop = 0;break;}}Tcl_DeleteInterp(tcl);}

?

?

保存为test-expect.cpp, 编译:

g++ test-expect.cpp -o test-expect -lexpect5.43 -ltcl8.4

?

执行./test-expect,得到远程root用户的根目录列表。?

远程命令的标准输出存在exp_buffer缓冲区。

?

详细的手册可以参考http://www.cims.nyu.edu/cgi-systems/man.cgi?section=3&topic=libexpect

热点排行