linux下scp远程拷贝文件无需输入密码工具之expect
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相关推荐
- linux scp拷文件夹,linux scp远程拷贝文件及文件夹
linux scp远程拷贝文件及文件夹 1.拷贝本机/home/administrator/test整个目录至远程主机192.168.1.100的/root目录下 复制代码 代码如下: scp -r ...
- Linux之命令scp远程拷贝文件
scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...
- linux shell scp 远程拷贝 上传下载
目录 简介 命令格式 命令功能 命令参数 使用实例 实例1:从远处复制文件到本地目录 实例2:从远处复制到本地 实例3:上传本地文件到远程机器指定目录 实例4:上传本地目录到远程机器指定目录 简介 s ...
- linux中使用scp远程拷贝文件及文件夹
linux中使用scp远程拷贝文件及文件夹 linux scp远程拷贝文件及文件夹,需要的朋友可以参考下 1.拷贝本机/home/wtf/test整个目录至远程主机192.168.100.1的/roo ...
- linux scp 过滤文件夹,linux中使用scp远程拷贝文件及文件夹
linux中使用scp远程拷贝文件及文件夹 linux scp远程拷贝文件及文件夹,需要的朋友可以参考下 1.拷贝本机/home/wtf/test整个目录至远程主机192.168.100.1的/roo ...
- scp远程复制文件自动输入密码
scp远程复制文件自动输入密码------sshpass命令 在shell脚本中,使用scp远程批量复制文件,每次都要输入密码非常繁琐. scp -r xxx@10.10.48.110:/home/d ...
- scp 远程拷贝文件
远程访问另外一台机器 一.远程登录指令 shellssh 192.168.1.108 Linux实现 [root@localhost ~]# ssh 192.168.1.108 root@192.16 ...
- SSH远程链接:SCP远程拷贝文件与文件夹
scp是ssh的一部分,可以进行远程文件拷贝. 下面以本地A和远程机器B为例介绍: 首先本地A: 用户名为rongtao,ip地址为:180.201.178.4 远程机器B的信息如下: 远程用户名To ...
- linux下SCP命令 传输文件
linux下SCP命令传输,我经常忘记了,虽然是很菜,但是还是要记录一下,免的又玩忘记,其实忘记的原因是我不是经常用,没有用心去记,汗. 设有两机,均为局域网,两机可相互通信无问题,中间无防火墙. 两 ...
最新文章
- ios(iphone/ipad)一个简单的用代码判断当前设备的方法
- 思科宣布NB-IoT平台实现商用
- TCP的状态转换及生产问题实操
- 445端口 mysql_关于如何关闭window端口445的详细介绍
- idea之springboot端口被占用/跳转到login
- bzoj 1661: [Usaco2006 Nov]Big Square 巨大正方形(枚举)
- 应用安全-安全设备-Waf系列-软Waf-安全狗(Safedog)
- ssfn授权_Steam盗号木马窃取授权文件,360安全大脑强力拦截
- 少儿编程培训行业分析
- ThinkPad键盘拆解与清理(附图详解)
- Go 为什么选择 Gopher 作为吉祥物?
- 异步电机无差拍模型预测电流控制(MPCC)
- 移动硬盘在服务器上不显示,为什么移动硬盘不显示盘符
- Google guava之SortedMultiset简介说明
- OpenStack虚拟机冷迁移与热迁移
- mysql 检索结果排序方式_MySQL--排序检索数据(ORDER BY)
- 谁说变态才叫函数,带你了解不一样的表格函数
- 华为老员工谈华为终端的来龙去脉
- Ankylosauridae OS
- Unity2019中的android动态申请权限(Permissions)
热门文章
- 浏览器渲染机制面试_浏览器渲染原理
- spring service 怎么拿到数据源信息_SSM(SpringMVC + Spring + MyBatis)中各层作用及关系Ⅰ...
- 计算机英语复习,计算机英语期末复习
- 手把手入门神经网络系列(2)_74行代码实现手写数字识别
- Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析
- 深入理解多线程(三)—— Java的对象头
- git恢复删除文件之ls-files
- Java的synchronized关键字:同步机制总结
- mysql dba系统学习(12)mysql的数据文件 mysql dba系统学习(13)mysql的体系结构
- 程序员面试题精选100题(15)-含有指针成员的类的拷贝[C/C++/C#]