天天看点

将expect脚本移植到嵌入式linux上

嵌入式设备需要telnet访问服务器并在服务器上执行工具,用expect脚本实现,但嵌入式系统已经将expect裁剪掉,今天将expect移植过来,不是十分清晰,为了防止以后忘记,将整个过程记录下来。

网上相关并不多,这篇是我认为写的最好的。tcl和expect版本有很多,为了简洁,我使用的也是这篇文章链接中的版本,分别是tcl8.6.10-src.tar.gz和expect5.45.3.tar.gz。编译服务器是Ubuntu18.04_x86_64,嵌入式是linux4.9_armv7l。整个过程分为三步:tcl的编译、expect的编译和嵌入式部署,下面就按这个过程记述整个过程。

tcl的编译

1、打开终端,确认交叉编译链arm-hAI-linux-gcc能够正确引用,是否需要执行export LC_ALL=C和source /etc/profile

2、在/home/ubuntu/下mkdir expect创建工作文件夹,将下载好的tcl8.6.10-src.tar.gz解压到/home/ubuntu/expect中

3、进入tcl对应的文件夹,cd /home/ubuntu/expect/tcl8.6.10/

4、为编译提前设置几个变量,如果不设置在后面make的时候有可能报错。例如下面这种问题。 当然这些不全必须。

export tcl_cv_type_64bit="long long
  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
           

5、配置:./configure --prefix=/home/ubuntu/expect/arm-tcl --host=arm-hAI-linux

--prefix:指定后面make install将tcl的最终结果放到哪

--host:指定交叉编译工具,为工具前缀,我的gcc全称为arm-hAI-linux-gcc

6、先执行make编译,再执行make install安装。极大概率不会出错。这部执行成功整个工作完成40%

expect的编译

1、将下载好的expect5.45.3.tar.gz解压到/home/ubuntu/expect中,进入expect对应的文件夹,

cd /home/ubuntu/expect/expect5.45.3/

2、配置:./configure --prefix=/home/ubuntu/expect/arm-expect

3、修改Makefile,将里面的CC = gcc改为CC = arm-hAI-linux-gcc

4、先执行make编译,再执行make install安装。极大概率不会出错。这部执行成功整个工作完成60%,剩下的就是嵌入式部署

嵌入式部署

1、expect编译完成后可执行程序expect并不在arm-expect/bin中,需要将它拷贝过来,

cp /home/ubuntu/expect5.45.3/expect /home/ubuntu/arm-expect/bin/

2、将arm-expect整个文件夹拷贝到嵌入式设备上,假设路径为/tmp/arm-expect

3、其实现在就可以到嵌入式设备上尝试手动执行expect,cd /tmp/arm-expect;./expect执行过程中遇到错改错即可,都是依赖库找不到或文件找不到,拷贝一下即可。不放心可以看完第4步再执行

4、expect的执行依赖3个文件,libtcl8.6.so、libexpect5.45.3.so和init.tcl。前两个动态库存在这几个文件夹中存在不止一处,将arm-tcl/lib/中的libtcl8.6.so拷贝到程序运行的环境变量文件夹中,例如/usr/lib.arm-expect/bin/中的libexpect5.45.3.so也做相同操作拷贝。拷贝完后如果重新export更新环境变量。这个时候如果运行expect,可能会报下面错误:

Tcl_Init failed: Can't find a usable init.tcl in the following directories:
           

后面跟着若干路径,这是缺少init.tcl所致,先不要相信提示中说的:

This probably means that Tcl wasn't installed properly.
           

init.tcl也不止存在与一个地方,将arm-tcl/lib/tcl8.6/中的拷贝到上面提示信息中的任意一个你觉得合适的位置,再执行expect就成功了!

继续阅读