0.前言

expect是一个用来处理交互命令的工具。借助expect,我们可以将交互过程写在一个脚本上,使之自动化完成。比如ssh登录,scp远程拷贝,ftp登录等都是交互命令。

在有外网的情况下可以使用命令安装,这里的目标是将编译后的程序作为一个绿色化的工具,可以直接携带到部署服务器上使用,所以这里使用源码编译。

1.下载源码

由于expect依赖tcl库,所以编译expect之前先下载tcl的源码,编译依赖动态库。

A. Tcl

主页: http://www.tcl.tk

下载地址: http://www.tcl.tk/software/tcltk/downloadnow84.tml

1.下载源码包

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

2.解压缩源码包

tar xfvz tcl8.4.11-src.tar.gz

B. expect

主页: http://expect.nist.gov/

1.下载源码包

wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/download

2.解压缩源码包

tar xzvf expect5.45.tar.gz

完成上述步骤后,目录结构如下:

$ tree -L 1
.
├── bin
├── build-expect.sh
├── build-tcl.sh
├── expect5.45
├── expect5.45.tar.gz
├── expect-tool
├── tcl8.4.11
├── tcl8.4.11-src.tar.gz
└── test.sh4 directories, 5 files

里面的build-expect和build-tcl分别是生成exepct和tcl的脚本,expect-tool是tcl和expect安装目录,bin是拷贝出来的执行程序和lib库,test是一个测试脚本。

2.编译

由于使用configure命令生成的安装目录中只能是绝对路径,而且生成的makefile里面使用了rpath选项,导致依赖了具体的路径,在其他的地方使用会出现找不到依赖库。所以这里先使用脚本生成makefile,然后修改一下生成的makefile,修改安装目录为相对路径,去掉rpath选项,依赖动态库路径。

tcl编译脚本:

$ cat build-tcl.sh
#!/bin/bash#tar xfvz tcl8.4.11-src.tar.gzcd tcl8.4.11/unix
./configure --prefix=. --enable-shared --enable-static
make
make install

Makefile2为修改后的makefile

$ diff Makefile Makefile2
30,31c30,31
< prefix         = .
< exec_prefix        = .
---
> prefix         = ../../expect-tool/tcl
> exec_prefix        = ../../expect-tool/tcl
33c33
< libdir         = ./lib
---
> libdir         = ../../expect-tool/tcl/lib
89c89
< TCL_PACKAGE_PATH   = ./lib
---
> TCL_PACKAGE_PATH   = ../../expect-tool/tcl/lib
220,221c220,221
< CC_SEARCH_FLAGS    = -Wl,-rpath,${LIB_RUNTIME_DIR}
< LD_SEARCH_FLAGS    = -Wl,-rpath,${LIB_RUNTIME_DIR}
---
> CC_SEARCH_FLAGS    = #-Wl,-rpath,${LIB_RUNTIME_DIR}
> LD_SEARCH_FLAGS    = #-Wl,-rpath,${LIB_RUNTIME_DIR}

expect编译脚本:

$ cat build-expect.sh
#!/bin/bash#tar xzvf expect5.45.tar.gzcd expect5.45
home_path=/home/lsx/scripts-coders/shell/expect-dir
./configure --prefix=$home_path/expect-tool/expect --exec-prefix=$home_path/expect-tool/tcl \--enable-static --with-tcl=../expect-tool/tcl/lib --with-tclinclude=../tcl8.4.11/genericmake
make install
ln -s $home_path/expect-tool/tcl/bin/expect $home_path/expect-tool/expect/bin/expect

Makefile2为修改后的makefile

$ diff Makefile Makefile2
112,113c112,113
< prefix     = /home/lsx/scripts-coders/shell/expect-tool/expect
< exec_prefix    = /home/lsx/scripts-coders/shell/expect-tool/tcl
---
> prefix     = ../expect-tool/expect
> exec_prefix    = ../expect-tool/tcl
152c152
< SHLIB_LD_LIBS  = ${LIBS} -L../../expect-tool/tcl/lib -ltclstub8.4
---
> SHLIB_LD_LIBS  = ${LIBS} -L../expect-tool/tcl/lib -ltclstub8.4
155,156c155,156
< TCL_BIN_DIR    = /home/lsx/scripts-coders/shell/expect-tool/tcl/lib
< TCL_SRC_DIR    = /home/lsx/scripts-coders/shell/tcl8.4.11
---
> TCL_BIN_DIR    = ../expect-tool/tcl/lib
> TCL_SRC_DIR    = ../tcl8.4.11
172c172
< TCLSH_PROG = /home/lsx/scripts-coders/shell/expect-tool/tcl/bin/tclsh8.4
---
> TCLSH_PROG = ../expect-tool/tcl/bin/tclsh8.4
176c176
< INCLUDES   =  -I. -I"." -I"/home/lsx/scripts-coders/shell/tcl8.4.11/generic" -I"/home/lsx/scripts-coders/shell/tcl8.4.11/unix"
---
> INCLUDES   =  -I. -I"." -I"../tcl8.4.11/generic" -I"../tcl8.4.11/unix"
191c191,192
< LIBS       =    -lutil -lieee -lm -Wl,-rpath,${LIB_RUNTIME_DIR}
---
> #LIBS      =    -lutil -lieee -lm -Wl,-rpath,${LIB_RUNTIME_DIR}
> LIBS       =    -lutil -lieee -lm
395,399c396,400
<        -L/home/lsx/scripts-coders/shell/expect5.45 -lexpect5.45 \
<        -L../../expect-tool/tcl/lib -ltcl8.4 \
<        -ldl  -lieee -lm \
<        -Wl,-rpath,${LIB_RUNTIME_DIR} \
<        -Wl,-rpath,${LIB_RUNTIME_DIR}/${PACKAGE_NAME}${PACKAGE_VERSION}:../../expect-tool/tcl/lib
---
>        -L../expect5.45 -lexpect5.45 \
>        -L../expect-tool/tcl/lib -ltcl8.4 \
>        -ldl  -lieee -lm
> #      -Wl,-rpath,${LIB_RUNTIME_DIR} \
> #      -Wl,-rpath,${LIB_RUNTIME_DIR}/${PACKAGE_NAME}${PACKAGE_VERSION}:../expect-tool/tcl/lib

3.绿化处理

一共要拷贝4个东西到绿化工具包中,expect主程序,两个依赖库libexpect,libtcl,还有一个tcl使用的配置文件,将tcl生成后的lib目录整个拷贝出来就行。

上述完成后,expect工具的目录结构如下:

$ tree -L 2 autoupdate/tools
autoupdate/tools
├── bin
│   ├── expect
│   ├── libexpect5.45.so
│   └── libtcl8.4.so
├── lib
│   └── tcl8.4
└── sbin└── docker.sh4 directories, 4 files

其中lib目录里面就是tcl的配置文件了。

4.脚本测试

$ cat test.sh
#!/usr/bin/expect
set timeout 10
set host [lindex $argv 0]
set username [lindex $argv 1]
set password [lindex $argv 2]
set src_file [lindex $argv 3]
set dest_file [lindex $argv 4]
spawn scp $src_file $username@$host:$dest_file
expect {
"(yes/no)?"
{send "yes\n"expect "*assword:" { send "$password\n"}
}
"*assword:"
{send "$password\n"
}
}
expect "100%"
expect eof

5.参考资料

http://blog.csdn.net/jgmydsai/article/details/39858357

linux下scp远程拷贝文件无需输入密码工具之expect相关推荐

  1. linux scp拷文件夹,linux scp远程拷贝文件及文件夹

    linux scp远程拷贝文件及文件夹 1.拷贝本机/home/administrator/test整个目录至远程主机192.168.1.100的/root目录下 复制代码 代码如下: scp -r ...

  2. Linux之命令scp远程拷贝文件

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...

  3. linux shell scp 远程拷贝 上传下载

    目录 简介 命令格式 命令功能 命令参数 使用实例 实例1:从远处复制文件到本地目录 实例2:从远处复制到本地 实例3:上传本地文件到远程机器指定目录 实例4:上传本地目录到远程机器指定目录 简介 s ...

  4. linux中使用scp远程拷贝文件及文件夹

    linux中使用scp远程拷贝文件及文件夹 linux scp远程拷贝文件及文件夹,需要的朋友可以参考下 1.拷贝本机/home/wtf/test整个目录至远程主机192.168.100.1的/roo ...

  5. linux scp 过滤文件夹,linux中使用scp远程拷贝文件及文件夹

    linux中使用scp远程拷贝文件及文件夹 linux scp远程拷贝文件及文件夹,需要的朋友可以参考下 1.拷贝本机/home/wtf/test整个目录至远程主机192.168.100.1的/roo ...

  6. scp远程复制文件自动输入密码

    scp远程复制文件自动输入密码------sshpass命令 在shell脚本中,使用scp远程批量复制文件,每次都要输入密码非常繁琐. scp -r xxx@10.10.48.110:/home/d ...

  7. scp 远程拷贝文件

    远程访问另外一台机器 一.远程登录指令 shellssh 192.168.1.108 Linux实现 [root@localhost ~]# ssh 192.168.1.108 root@192.16 ...

  8. SSH远程链接:SCP远程拷贝文件与文件夹

    scp是ssh的一部分,可以进行远程文件拷贝. 下面以本地A和远程机器B为例介绍: 首先本地A: 用户名为rongtao,ip地址为:180.201.178.4 远程机器B的信息如下: 远程用户名To ...

  9. linux下SCP命令 传输文件

    linux下SCP命令传输,我经常忘记了,虽然是很菜,但是还是要记录一下,免的又玩忘记,其实忘记的原因是我不是经常用,没有用心去记,汗. 设有两机,均为局域网,两机可相互通信无问题,中间无防火墙. 两 ...

最新文章

  1. ios(iphone/ipad)一个简单的用代码判断当前设备的方法
  2. 思科宣布NB-IoT平台实现商用
  3. TCP的状态转换及生产问题实操
  4. 445端口 mysql_关于如何关闭window端口445的详细介绍
  5. idea之springboot端口被占用/跳转到login
  6. bzoj 1661: [Usaco2006 Nov]Big Square 巨大正方形(枚举)
  7. 应用安全-安全设备-Waf系列-软Waf-安全狗(Safedog)
  8. ssfn授权_Steam盗号木马窃取授权文件,360安全大脑强力拦截
  9. 少儿编程培训行业分析
  10. ThinkPad键盘拆解与清理(附图详解)
  11. Go 为什么选择 Gopher 作为吉祥物?
  12. 异步电机无差拍模型预测电流控制(MPCC)
  13. 移动硬盘在服务器上不显示,为什么移动硬盘不显示盘符
  14. Google guava之SortedMultiset简介说明
  15. OpenStack虚拟机冷迁移与热迁移
  16. mysql 检索结果排序方式_MySQL--排序检索数据(ORDER BY)
  17. 谁说变态才叫函数,带你了解不一样的表格函数
  18. 华为老员工谈华为终端的来龙去脉
  19. Ankylosauridae OS
  20. Unity2019中的android动态申请权限(Permissions)

热门文章

  1. 浏览器渲染机制面试_浏览器渲染原理
  2. spring service 怎么拿到数据源信息_SSM(SpringMVC + Spring + MyBatis)中各层作用及关系Ⅰ...
  3. 计算机英语复习,计算机英语期末复习
  4. 手把手入门神经网络系列(2)_74行代码实现手写数字识别
  5. Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析
  6. 深入理解多线程(三)—— Java的对象头
  7. git恢复删除文件之ls-files
  8. Java的synchronized关键字:同步机制总结
  9. mysql dba系统学习(12)mysql的数据文件 mysql dba系统学习(13)mysql的体系结构
  10. 程序员面试题精选100题(15)-含有指针成员的类的拷贝[C/C++/C#]