首先,必须安装几个开发包,在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
分享到:
相关推荐
1. **命令行交互**:`Expect`脚本在命令行环境下运行,通过`spawn`命令启动一个进程(如SSH连接、telnet会话等),然后发送和接收数据。 2. **期望与匹配**:`expect`命令用于设置期望的输出,可以是精确的字符串、...
在Linux系统管理中,有时我们需要自动化执行远程服务器上的任务,比如执行命令或脚本,而`expect`命令正为此目的而设计。`expect`是一个TCL语言的扩展,用于自动处理交互式应用程序,如SSH、telnet等。通过使用`...
`expect`是一个强大的自动化交互式程序的工具,它能够模拟用户与命令行的交互,使得我们可以通过脚本批量执行远程命令和脚本。在本文中,我们将深入探讨如何在`CentOS`中利用`expect`进行批量远程操作。 首先,确保...
5. 安装完成后,`/tools/bin`目录下应该出现了`expect`命令,你可以通过运行`expect`来测试是否安装成功。 至此,`expect`已经安装完成,你可以开始编写和运行`expect`脚本来自动化Linux系统的各种交互式任务。`...
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 ...
在这个脚本中,`spawn`命令启动一个新的进程(这里是SSH),`expect`命令等待指定的字符串(如“password:”),`send`命令发送输入(如密码和命令),最后`expect`再次等待提示符以确认命令已执行。 总结起来,`...
SSH(Secure Shell)是Linux环境下用于远程登录的一种安全协议,它允许用户通过加密的方式连接到另一台计算机,进行命令执行、文件传输等操作。当需要自动化这些过程时,`expect`工具就显得尤为重要。`expect`基于...
这个"expect window版本"可能是 Expect 的一个移植版或兼容版本,专为 Windows 用户设计,允许他们在 Windows 环境下编写和运行 Expect 脚本来自动执行命令行任务。 Expect 的核心概念是模拟用户与终端之间的交互,...
2. 使用`-c`选项执行命令:`expect -c '命令'` 此外,`expect`还有一些选项用于特定场景: - `-d`: 开启调试模式,输出诊断信息。 - `-D`: 启用调试器。 - `-f`: 从指定文件读取命令。 - `-i`: 交互式输入命令。 - ...
你可以通过运行 `expect` 命令来测试是否安装成功。 压缩包中的`check.conf`可能是用于配置或检查环境的文件,具体用途需根据文件内容来确定。 `scp_auto.sh` 是一个自动化SCP文件传输的脚本,可以用来批量复制...
Linux Expect 是一个强大的工具,它允许自动化与交互式应用程序的交互,特别适用于自动化登录和执行命令在远程服务器上的任务。这个工具使用Tcl语言作为基础,并且提供了一个友好的接口来处理诸如SSH这样的协议,...
10. **sudo和su命令**:在远程执行命令时,可能需要提升权限,sudo用于以其他用户身份运行命令,su则用于切换用户。 11. **日志记录和错误处理**:在远程调用命令时,正确记录日志和处理异常非常重要,这有助于排查...
例如,你可以编写一个`Expect`脚本来自动连接到远程服务器,验证身份,然后执行一系列命令,最后安全退出。 在使用`Expect`前,必须确保系统已经安装了`TCL`,因为`Expect`是基于`TCL`的。安装过程通常涉及下载`TCL...
Expect 实现 Linux 自动远程登录技术 Expect 是 Unix 系统中的一种软件工具,用于自动化控制和测试,常用于交互式软件中,如 telnet、ftp、passwd、fsck、rlogin、ssh 等。通过 Expect,可以实现 Linux 的自动远程...
Expect 可以用来实现自动交互功能,例如自动登录、自动执行命令等。Expect 也可以用来实现简单的 BBS 聊天机器人。 6. Tcl 的安装 Tcl 是 Expect 的依赖项,需要先安装 Tcl 才能安装 Expect。可以使用源码包方式...
在Linux环境下,使用Shell脚本结合Expect工具进行远程登录是一种高效且灵活的方式。本文将详细介绍如何利用这两种工具实现自动化远程登录,并提供具体的实现步骤及注意事项。 #### 一、理解Shell与Expect **Shell*...
例如,你可能编写一个expect脚本来自动登录SSH服务器,执行远程命令,然后退出,全程无需手动干预。 在Windows环境下,expect-5.21结合ActiveTcl-8.6.12,不仅能够帮助开发者进行复杂的脚本编写,还能为系统管理员...
总结来说,Python通过`subprocess`模块和`expect`工具实现SCP命令的执行,提供了在脚本环境中安全、自动化地传输文件到远程主机的功能。这种方式适用于需要在不暴露密码的情况下执行文件传输的场景,如持续集成流程...