首先,必须安装几个开发包,在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 server
- int 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 responses
- result = 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