`
bollaxu
  • 浏览: 217149 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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 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

分享到:
评论

相关推荐

    expect交互式执行网络命令

    expect实现 shell 交互式网络命令,插件安装: tar xzvf expect5.45.tar.gz cd expect5.45 ./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.11/generic make make install ...

    shell中使用expect命令进行远程执行命令脚本

    今天小编就为大家分享一篇关于shell中使用expect命令进行远程执行命令脚本,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    CentOS使用expect批量远程执行脚本和命令

    主要介绍了CentOS使用expect批量远程执行脚本和命令,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Linux expect交互命令使用详解.docx

    expect 说明 执行方法 expect选项 命令(参数)说明 示例

    expect and tcl安装包及手册

    Expect是在Tcl基础上创建起来的,它还提供了一些Tcl所没有的命令,它可以用来做一些linux下无法做到交互的一些命令操作,在远程管 理方面发挥很大的作用。 spawn命令激活一个Unix程序来进行交互式的运行。  send...

    expect_tcl.zip

    centos7、centos8安装expect及tcl所需的安装包...下载完拷贝到linux系统文件目录下,unzip expect_tcl.zip,然后执行sh install_expect.sh 即可完成tcl和expect的安装 安装完毕后,可以输入expect测试能否执行expect命令

    linux expect实现登陆远程主机并执行命令示例代码

    主要给大家介绍了linux expect实现登陆远程主机并执行命令的相关资料,文中给出了详细的示例代码供大家参考学习,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。

    详解Linux使用shell+expect远程登录主机

    主要介绍了详解Linux使用shell+expect远程登录主机的相关资料,这里提供了详细的实现步骤,需要的朋友可以参考下

    用expect 实现切换用户时自动输入密码.txt

    注意:这里强调一下执行脚本时要注意的地方,不能按照习惯来用sh ***.sh来这行expect的程序,会提示找不到命令,因为expect用的不是bash所以会报错。执行的时候直接./***.sh就可以了。~切记! 应用二: 从...

    linux实现交互执行:expect

    expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信

    expect+tcl工具大合集,用于远程登陆到另外一台linux机器。

    expect+tcl工具大合集,用于远程登陆到另外一台linux机器(大家都用的起)。

    expect手动安装.zip

    在实际工作中,我们运行命令、脚本或程序时,这些命令、脚本或程序都需要从终端输入某些继续运行的指令,而这些输入都需要人为的手工进行。而利用expect,则可以根据程序的提示,模拟标准输入提供给程序,从而实现...

    expect在windows下使用的

    windows下可以使用的expect安装文件

    用Expect实现Linux自动远程登陆.pdf

    用Expect实现Linux自动远程登陆.pdf

    C++语言常见知识点复习系统(C++版)

    用于复习C++语言的常见知识点,在一个程序中体现C++中的各种知识点,用菜单的形式实现功能。

    Expect 手册中文版

    Expect手册中文版 Expect-----能与交互式程序进行“可程序化”会话的脚本语言 概述: Expect是一种能够按照脚本内容里面设定...Expect也可以直接嵌入到C或是C++程序中(这种情况是不涉及Tcl解释)。请看libexpect(3).

    expect5.43.0和tcl8.4.11.zip

    expect据说是交互性很强的脚本语言,但是expect依赖于tcl,但linux系统里一般不自带安装tcl,需要手动安装

    linux下expect的安装方法

    linux自动化管理的必备工具,或许你需要perl,但个人觉得expect更好,针对性强。

    expect.rar

    在实际工作中,我们运行命令、脚本或程序时,这些命令、脚本或程序都需要从终端输入某些继续运行的指令,而这些输入都需要人为的手工进行。而利用expect,则可以根据程序的提示,模拟标准输入提供给程序,从而实现...

Global site tag (gtag.js) - Google Analytics