1. 引言

最近做了一个项目,需要频繁与另一台主机进行文件的传输;中间想到了很多方式:FTP、samba、curl等,但是还是感觉scp最好用。

但scp也存在着一些问题,每次都需要输入目标机的密码,需人为手动干预,这个就比较烦了,那么有没有可以自动进行界面交互的命令呢?

使用shell嵌套使用expect命令工作,很好的达到了文件的批量传输,无需人工干预的效果。

2. 内容详解

2.1 目标

本博的目的是为了解决项目中出现的问题:scp文件时,需要人为干预(输入密码等),且scp需要输入目的主机+绝对路径

而采用本博的脚本,可以实现快速简单的文件拷贝,而不需要输入目标主机的ip等,且无需人为干预输入目的主机的密码,实现快速、高效的文件传输

2.2 实现框架

  • 1 目标主机的ip地址以变量的形式写入到脚本中,因此省略了每次输入目标ip的繁琐
  • 2 将目标主机的登录密码写入到脚本中,采用expect工具自动抓取密码,省略了人为的交互界面
  • 3 scp分为pull和push两种情况,本脚本的处理是:
  • push状态:即推送文件到目的主机,推送到的位置固定在目标主机的一个目录下,因此,便可以省略了每次都要写目标主机和存放的文件位置;命令如下:

    scp <local-file/dir>
  • pull状态:即从远程目标主机拉取文件到本机,无需写目标主机的ip,只要写上需要拉取的目标主机的文件和本机存放的位置即可,命令如下:

    scp <remote-file/dir> <local-file/dir>

2.3 实现代码

#==============================================================
#CopyRight: 2018-06-03@jimmy_nie
#E-mail: JimmyNie2017@163.com
#Autor Date Modify
#Jimmy 2018-06-01 create
#==============================================================
#!/bin/bash TAR_MAC="root@192.168.1.94" #目标主机的IP地址
TAR_DIR="/mnt/UDISK" #目标主机存放文件的位置 # 1. Determine the scp is push or pull, if there only 1 argument(push); 2(pull)
if [ $# -eq 1 ];then
FLAG="PUSH"
elif [ $# -eq 2 ];then
FLAG="PULL"
else
echo -e "scpd useage:\n\tscpd local_dir[file] \t\t\t --- push local dir/file to remote $TAR_MAC:$TAR_DIR \
\n\tscpd remote_dir[file] local_dir[file] \t --- pull $TAR_MAC file/dir to local [without $TAR_MAC, only remote dir/file]\n"
exit 1
fi # 2. If push, Determine whether the destinated file existed or not
if [ "$FLAG" == "PUSH" ];then
if [ -f $1 -o -d $1 ];then
expect -c " #采用expect工具的命令(注意与shell命令的差异)
spawn scp -r \"$1\" \"$TAR_MAC:$TAR_DIR\" #-r为递归,将本机的文件/目录发送到目标机的固定位置
expect \"*password:\" #当遇到以“*password:”结尾的字符串时
set timeout 100 #设置超时时间,超过这个时间,scp执行失败
send \"123123\r\" #将密码填入到password中,相当于人为输入密码
expect eof #执行结束
"
else
echo -e "$1 does not normal file or directory"
exit 1
fi # 3. If pull, determine whether local dir existed or not
elif [ "$FLAG" == "PULL" ];then
if [ ! -e $2 -a "$2" == "*/" ];then #如果本机的目录不存在,则创建该目录,再执行拷贝
mkdir -p \"$2\"
expect -c "
spawn scp -r \"$TAR_MAC:$1\" \"$2\"
expect \"*password:\"
set timeout 600
send \"123123\r\"
expect eof
"
else
expect -c "
spawn scp -r \"$TAR_MAC:$1\" \"$2\"
expect \"*password:\"
set timeout 600
send \"123123\r\"
expect eof
"
fi fi #4. Output error info
if [ ! $? -eq 0 ]; then
if [ "$FLAG" == "PUSH" ];then
echo -e "PUSH $1 to $TAR_MAC:$TAR_DIR failed"
elif [ "$FLAG" == "PULL" ];then
echo -e "PULL $2 from $TAR_MAC:$1 failed"
fi
fi

ssh采用expect实现自动输入密码登录、拷贝的更多相关文章

  1. 通过expect免自动输入密码登陆远程服务器

    通过expect免自动输入密码登陆远程服务器 1.前提必须已经安装expect 2.新建login.sh,文件内容如下 #!/usr/bin/expect -f spawn ssh root@140. ...

  2. Shell结合Expect实现自动输入密码

    Shell结合Expect自动输入密码示例 #!/bin/bash cd /data/live /usr/bin/expect <<-EOF spawn git clone "s ...

  3. Linux自动输入密码登录用户

    每次进去Linux系统,都有切换root用户,输入密码很麻烦,所以就写了一个小脚本,自动输入密码,登录到root用户, 1,首先检查一些是否安装了expect root@wuzs:/home/wuzs ...

  4. 用expect实现SCP/SSH自动输入密码登录

    在命令行ssh远程登录服务器和scp远程传输文件都需要交互式输入密码,无法像mysql登录数据库 mysql -uroot -p123456一样直接完成. 其实可以用脚本依赖expect来达到这一目的 ...

  5. Linux下Expect 完成自动输入密码

    今天要开发一个定时任务,然后加入cron列表中.但是有个问题摆在眼前,脚本的执行中需要输入数据库密码(貌似5.1版本以上不允许在-p后直接加密码,会报错) mysql -u root -p <& ...

  6. iTerm 使用expect实现自动远程登录,登录跳板机

    #!/usr/bin/expect set timeout 10 spawn ssh -p [lindex $argv 0] [lindex $argv 1]@[lindex $argv 2] exp ...

  7. expect实现自动输入密码功能

    系统: Ubuntu:16.04 安装expect: sudo apt-get update sudo apt-get install expect 脚本实例: //这一行告诉操作系统脚本里的代码使用 ...

  8. linux ssh自动输入密码,expect使用

    想搞一个使用ssh登录批量ip地址执行命令,自动输入密码的脚本,但是ssh不能使用标准输入来实现自动输入密码,于是了解到了expect这个可以交互的命令 是什么 查看使用man查看expect,是这么 ...

  9. 使用expect实现自动登录的脚本

    使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写却不知其然.本文用一个最短的例子说明脚本的原理. 脚本代码如下: ######## ...

随机推荐

  1. Android 软件管理工具类Utils

    Android 软件管理工具类Utils /** * Created by uilubo on 2015/9/30. * 工具类 */ public class Utils { public stat ...

  2. Codeforces Round #539 (Div. 2) 异或 + dp

    https://codeforces.com/contest/1113/problem/C 题意 一个n个数字的数组a[],求有多少对l,r满足\(sum[l,mid]=sum[mid+1,r]\), ...

  3. noip第23课资料

  4. hdu 1069 Monkey and Banana 【动态规划】

    题目 题意:研究人员要测试猴子的IQ,将香蕉挂到一定高度,给猴子一些不同大小的箱子,箱子数量不限,让猩猩通过叠长方体来够到香蕉. 现在给你N种长方体, 要求:位于上面的长方体的长和宽  要小于  下面 ...

  5. 【洛谷4770】 [NOI2018]你的名字(SAM,线段树合并)

    传送门 洛谷 Solution 做过的比较玄学的后缀自动机. 果然就像\(Tham\)所讲,后缀自动机这种东西考场考了不可能做的出来的... 考虑如果\(l=1,r=|S|\)的怎么做? 直接建后缀自 ...

  6. 从零开始的程序逆向之路基础篇 第二章——用OllyDbg(OD)分析一个简单的软件

    作者:Crazyman_Army 原文来自:https://bbs.ichunqiu.com/thread-43469-1-1.html 0x00知识回顾 (由于笔者省事,没开XP虚拟机,而且没关闭A ...

  7. 利用Burp Suite攻击Web应用

    i春秋作家:Passerby2 web应用测试综述: Web应用漏洞给企业信息系统造成了很大的风险.许多web应用程序漏洞是由于web应用程序缺乏对输入的过滤.简而言之Web应用程序利用来自用户的某种 ...

  8. scikit-image 图像处理库介绍

    今天学习图像处理的时候,无意中看到了scikit 软件包,抱着学习的态度,这里做个记录,方便以后翻阅. 概念:scikit-image 是一种开源的用于图像处理的 Python 包.它包括分割,几何变 ...

  9. vue 项目记录.路飞学城(一)

    前情提要: 通过vue 搭建路飞学城记录  一:项目分析 二:项目搭建 1:创建项目 vue init webpack luffy 2:初始化项目 清除默认的HelloWorld.vue组件和APP. ...

  10. Python网络编程-IO阻塞与非阻塞及多路复用

    前言 问题:普通套接字实现的服务端的缺陷 一次只能服务一个客户端!                         accept阻塞! 在没有新的套接字来之前,不能处理已经建立连接的套接字的请求 re ...