2015-07-29 09:58:52 aa120515692 阅读数 1595

交叉编译 expect 需要先编译如下依赖包:tcl
tcl源码下载:
wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz
我的目标主机是一台运行着openwrt系统的x86机器。工具链为 i486-openwrt-linux-

./configure --prefix=$PWD/tmp --host=i486-openwrt-linux --build=i686-linux
make 

生成 Makeflie 文件后,需要修改Makeflie 里面的 CC。默认是 gcc
。改为 i486-openwrt-linux-gcc
make
发现报错。找不到 ieee 这个库。于是只好到网上去找:

找到一个 ieee1284 的库。解压:

CC=i486-openwrt-linux-gcc ./configure --prefix=$PWD/tmp --host=i486-openwrt-linux --build=i686-linux
make
make install
//拷贝所有 库 到工具链的 lib 目录
cp * -rfd /opt/OpenWrt-Toolchain-x86-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-i686/toolchain-i386_i486_gcc-4.8-linaro_uClibc-0.9.33.2/lib/
//拷贝头文件到工具链的 include 目录
cp * /opt/OpenWrt-Toolchain-x86-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-i686/toolchain-i386_i486_gcc-4.8-linaro_uClibc-0.9.33.2/include/

编译发现还是没有找到 ieee。原来我下载的源码库是 ieee1284.于是把makefile文件里面所有 ieee 都改成 ieee1284
在编译。成功
make install 安装到当前目录下的tmp目录。
安装完毕以后,进入tcl源代码的根目录,把子目录unix下面的tclUnixPort.h copy到子目录generic中。
暂时不要删除tcl源代码,因为expect的安装过程还需要用。

交叉编译 expect

./configure --prefix=$PWD/tmp --host=i686-linux --build=i686-linux --with-tcl=/work/src/openwrt_x86/expect/tcl8.4.20/unix/tmp/lib --with-tclinclude=/work/src/openwrt_x86/expect/tcl8.4.20/generic

修改 makeflie 把 gcc 改成 i486-openwrt-linux-gcc 把所有ieee改成ieee1284
修改

expect: exp_main_exp.o $(PKG_LIB_FILE)
        $(CC) \
                 -pipe ${CFLAGS_DEFAULT} ${CFLAGS_WARNING} ${SHLIB_CFLAGS}  \
                 -Wl,--export-dynamic  \
                -o expect exp_main_exp.o \
                -L/work/src/openwrt_x86/expect5.45 -lexpect5.45 \
                -L/work/src/openwrt_x86/expect/tcl8.4.20/unix/tmp/lib -ltcl8.4 \
                -ldl  -lieee1284 -lutil -lm \
                -Wl,-rpath,${LIB_RUNTIME_DIR} \
                -Wl,-rpath,${LIB_RUNTIME_DIR}/${PACKAGE_NAME}${PACKAGE_VERSION}
        $(SETUID) expect

在 连接库行加上 -lieee1284 -lutil 否则编译会报错

再次 make 发现没问题

记得要在目标机器上面运行这个程序的话,需要把前面的交叉编译的 tcl ieee 库文件都拷贝到目标机器上。同时再 expect 目录下会生成一个
libexpect5.45.so
这个也要拷贝到目标机器上

2018-11-09 19:15:07 youyou1543724847 阅读数 232

1.tcl编译

step1 :
下载tcl: https://nchc.dl.sourceforge.net/project/tcl/Tcl/8.6.8/tcl868-src.zip

step2: 解压到/opt/expect/tcl8.6.8目录下
step3: 进入 /opt/expect/tcl8.6.8/unix目录下,运行 配置脚本:

  • ./configure --prefix=/opt/expect/tcl

step4 :编译

  • make
    step5:编译安装:
  • make install

然后拷贝文件:cp tclUnixPort.h …/generic/

2 .expect 编译

step1 :
下载expect : https://nchc.dl.sourceforge.net/project/expect/Expect/5.45.3/expect5.45.3.tar.gz

step2: 解压到/opt/expect/expect目录下
step3: 进入/opt/expect/expect目录下,运行 配置脚本:
./configure --with-tcl=/opt/expect/tcl/lib/ --with-tclinclude=/opt/expect/tcl8.6.8/generic/ --build=arm-linux --prefix=/opt/expect/expect/

step4 :编译

  • make
    step5:编译安装:
  • make install

编译完成,expect可执行文件在expect目录下,其他文件在prefix指定的目录下。

另外,编译完后,在tcl编译结果目录下,也有了expect的相关目标文件。

2018-10-15 11:00:32 u013181216 阅读数 3851

Expect是在Tcl的基础上创建的,可以用来做一些Linux下无法做到交互的命令操作,可用于远程管理服务器。

一、安装Tcl:

1.下载源码包:

wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz

2.解压缩源码包:

tar xfvz tcl8.4.11-src.tar.gz

3.编译安装:

cd tcl8.4.11/unix
./configure --prefix=/usr/tcl --enable-shared
make
make install

4.安装完毕以后,进入tcl源代码的根目录,把子目录unix下面的tclUnixPort.h copy到子目录generic中。

二、安装expect:

1.下载源码包:
wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/download

2.解压源码包:
tar xzvf expect5.45.tar.gz

3.安装配置:
cd expect5.45
./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.11/genericmake
make install

4.建立软连接:
ln -s /usr/tcl/bin/expect /usr/expect/bin/expect

三、expect语法及示例:

set命令:可以设置变量。

spawn命令:激活一个Unix程序来进行交互式的运行。

send命令:向进程发送字符串。

expect命令:等待进程的某些字符串。expect支持正规表达式并能同时等待多个字符串,并对每一个字符串执行不同的操作。

interact命令:执行完毕把持交互状态,然后在控制台继续操作。如果没有这一句,登陆之后就会退出,而不是留在终端上。

 

示例j脚本test.exp:

#!/usr/bin/expect

set HOST [192.168.11.11 $argv 0]

set PWD [123456 $argv 1]

spawn ssh root@$HOST

expect "*passwrod:"

send "$PWD\r"

expect "*#"

send "echo hello\r"

interact

 

修改权限:chmod 755 test.exp

执行:expect test.exp 

 

 

2019-12-27 18:53:15 wxhjk 阅读数 15

expect是什么?

expect是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预。说白了,expect就是一套用来实现自动交互功能的软件。

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

第一步 下载源文件

tcl8.6.4-src.tar.gz

wget http://iweb.dl.sourceforge.net/project/tcl/Tcl/8.6.4/tcl8.6.4-src.tar.gz

expect5.45.4.tar.gz

wget https://downloads.sourceforge.net/expect/expect5.45.4.tar.gz

第二步编译 TCL

2.1 先export 几个常量

export tcl_cv_type_64bit="long long"
export ac_cv_c_bigendian=no
export tcl_cv_strtod_buggy=1
export ac_cv_func_strstr=yes
export ac_cv_func_opendir=yes

2.2解压

mkdir compile

cd compile

tar -zxvf tcl8.6.4-src.tar.gz

2.3.生成Makefile

cd tcl8.6.4/unix/

./configure --prefix=$PWD/tmp --host=mipsel-openwrt-linux --build=i686-linux

--prefix=$PWD/tmp:编译后的结果保存在当前目录的tmp文件夹里
--host=mipsel-openwrt-linux:  MT7628的编译器
--build=i686-linux:编译主机   

2.4.修改Makefile

vim Makefile
 /LIBS

修改Makefile,在LIBS 中增加 -lpthread

LIBS            = -lpthread -ldl  -lm

2.5 make

2.6 make install
最后生成 libtcl8.6.so init.tcl expect要用到的。

 

第三步 编译expect

 

3.1 解压

tar expect5.45.4.tar.gz

3.2 生成Makefile

tar expect5.45.4.tar.gz
cd expect5.45.4
./configure --prefix=$PWD/tmp --with-tcl=/home/xxxx/tmp/expect/compile/tcl8.6.4/unix/tmp/lib --with-tclinclude=/home/xxxx/tmp/expect/compile/tcl8.6.4/unix/tmp/include

--with-tcl:指定tcl库
--with-tclinclude:指定tcl头文件夹

3.3 修改Makefile

vim Makefile  //编辑Makefile
/gcc          //查找gcc
将原来的
CC              = gcc
修改为
CC              = mipsel-openwrt-linux-gcc

/-ldl -lm    //查找-ldl -lm
在同行添加 
-lpthread -lutil

/-lieee     //查找ieee选项
去除
原来为:
LIBS           =    -lutil -lieee -lm -Wl,-rpath,${LIB_RUNTIME_DIR}
改为:
LIBS           =    -lutil -lm -Wl,-rpath,${LIB_RUNTIME_DIR}

3.4 修改 exp_command.c

vim exp_command.c

去除 #include <sys/stropts.h>
增加 #include <sys/ioctl.h> 

3.5 make

此时 生成 expect libexpect5.45.4.so 即完成编译。

第四步 在板子上使用

将以下文件copy到板子相应的目录,即可使用expect了,我用来自动SSH登陆并实现通过外网访问内网的web

expect -->/bin
init.tcl-->/lib/tcl8.6
libexpect5.45.4.so libtcl8.6.so-->/lib

示例脚本:

#!/bin/ash

remotehost=$1
remoteport=$2
remoteuser=$3
passwd=$4
localhost=$5

/bin/expect <<-EOF
        set timeout 300
        spawn ssh -Nf -R 0.0.0.0:$remoteport:$localhost:80 $remoteuser@$remotehost
        expect {
                "*yes/no" { send "yes\r"; exp_continue }
                "*password:" { send "$passwd\r" }
        }
        expect eof
EOF

 

不想编译的同学可以直接下载已经编译好的库

https://download.csdn.net/download/wxhjk/12058459

 

本文参考以下网文

https://blog.csdn.net/aa120515692/article/details/47122773

https://blog.csdn.net/aa120515692/article/details/47122773

https://blog.csdn.net/aysa_bear/article/details/51313321

https://www.jianshu.com/p/2fcdf764f464

 

 

2010-07-14 13:11:00 linfengfeiye 阅读数 1095

expect介绍
http://en.wikipedia.org/wiki/Expect


需要软件
Tcl
ftp://mirror.ovh.net/gentoo-distfiles/distfiles/tcl8.5.8-src.tar.gz

 

Tk
ftp://mirror.ovh.net/gentoo-distfiles/distfiles/tk8.5.8-src.tar.gz

 

expect
http://expect.nist.gov/old/expect-5.43.0.tar.gz

 

Patch
http://www.linuxfromscratch.org/patches/blfs/svn/expect-5.43.0-tcl_8.5.8_fix-1.patch


http://www.linuxfromscratch.org/patches/blfs/svn/expect-5.43.0-spawn-2.patch

 


$cd soft
$tar xzvf tcl8.5.8-src.tar.gz
$tar xzvf tk8.5.8-src.tar.gz
$tar xzvf expect-5.43.0.tar.gz

 

$ln -s tcl8.5.8 tcl
$ln -s tk8.5.8 tk

 

$cd tcl/unix
$./configure -enable-64bit -enable-shared -prefix=/opt/gnu/expect
$make
$make install


$cd ../../tk/unix
$./configure -enable-64bit -enable-shared -prefix=/opt/gnu/expect
$make
$make install


$cd ../../ expect-5.43.0

patch -Np1 -i ../expect-5.43.0-tcl_8.5.8_fix-1.patch
patch -Np1 -i ../expect-5.43.0-spawn-2.patch

$./configure -enable-64bit -enable-shared -prefix=/opt/gnu/expect
$make
$make install

 

$ln -s /opt/gnu/expect /usr/bin/expect
$ln -s /opt/gnu/expectk /usr/bin/expectk

 

参考:
http://www.linuxfromscratch.org/blfs/view/svn/general/expect.html

 

 

 

 

没有更多推荐了,返回首页