要求,在A机器执行脚本,把A机器的某个目录文件拷贝到B机器。

第一版ftp实现:

1、A 机器先安装 ftp 客户端

$ sudo yum install ftp

2、B机器安装ftp服务端

$ sudo yum -y install vsftpd

2.1、查询B机器是否安装完成,执行后有下面的输出,就是ok的。

$ netstat -an | grep 21
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN

2.2、ftp 的重启命令

$ sudo service vsftpd restart

3、在A机器中编写一个执行脚本

vi upload.sh

#!/bin/bash

#upload dir to remote ftp server
read -p "Input local dir: " updir #local dir
read -p "Input remote dir: " todir #remote dir
read -p "Input remote IP: " ip #remote IP
read -p "Input ftp username: " user #ftp username
read -p "Input password: " password #password sss=`find $updir -type d -printf $todir/'%P\n'| awk '{if ($0 == "")next;print "mkdir " $0}'`
aaa=`find $updir -type f -printf 'put %p %P \n'`
ftp -nv $ip <<EOF
user $user $password
type binary
prompt
$sss
cd $todir
$aaa
quit
EOF

4、再给这个 .sh 文件赋予执行权限

chmod +x upload.sh

5、执行sh

$ ./upload.sh

输入五个参数

/home/admin/testA
aa
1xx.xx.xxx.xx
admin
xxx

完成。

注意:

都是在 admin 账户下操作,所以用了 sudo 借用 root 权限, roo t账户可以省去。

目标服务器只能写一层目录 aa,不能写多层 aa/bb/cc

改善版scp实现:

1、实现过程需要使用到 expect 处理交互,先安装 expect

sudo yum -y install expect

2、在A机器上编写执行脚本

#!/bin/bash

#upload dir to remote scp server
read -p "Input local dir: " updir #localdir
read -p "Input remote dir: " todir #remote dir
read -p "Input remote IP: " ip #remote IP
read -p "Input ftp username: " user #scp username
read -p "Input password: " password #password /usr/bin/expect <<EOF
set timeout -1 ;
spawn ssh ${user}@${ip} ;
expect *password* { send "${password}\r" } ;
expect ${user}@* { send "stat ${todir}\r" } ;
expect {
*File:* {
send "rm -rf ${todir}\r"
expect ${user}@* { send "mkdir -p ${todir}\r" }
}
*stat:* { send "mkdir -p ${todir}\r" }
} ;
send "exit\r" ;
expect eof ;
EOF /usr/bin/expect <<EOF
set timeout -1 ;
spawn scp -r ${updir} ${user}@${ip}:${todir} ;
expect *password* { send "${password}\r" } ;
expect eof ;
EOF

脚本中几个实现逻辑:

1、ssh、scp 连接时,不能直接输入 password,所以要用 expect 处理交互命令。

2、expect处理交互命令时可以写expect执行文件,也可以省事,直接写在bash脚本文件中。写入bash脚本中也有两种方式:

  • 一种是上面脚本中采用的输入重定向的方式。
  • 一种是以可执行命令前置符 expect -c 的方式,把expect 执行命令写到bash脚本中。
#!/bin/bash

#upload dir to remote scp server
read -p "Input local dir: " updir #localdir
read -p "Input remote dir: " todir #remote dir
read -p "Input remote IP: " ip #remote IP
read -p "Input ftp username: " user #scp username
read -p "Input password: " password #password expect -c "
set timeout -1 ;
spawn scp -r ${updir} ${user}@${ip}:${todir} ;
expect *password* { send \"${password}\r\" } ;
expect eof ;
"

expect [-c cmds]

3、在判断文件目录是否存在时,正常在本机执行的 shell 中一般用 test -d 命令判断,但是在 expect 交互时,不便使用 shell 命令,改成使用 linux 命令 stat 。根据目录存在与否的不同输出,作为判断条件,选择执行后续代码。

改善版比第一版好在:改善版能指定B机器的任意目录作为接受路径,并对路径判断,存在-->先删再建,不存在直接建。支持多级目录。

注意:

shell中插入expect脚本的执行,注意第二个EOF所在行前面不能留空格

du命令用来查看目录或文件所占用磁盘空间的大小。常用选项组合为:du -sh

linux服务器间文件夹拷贝的更多相关文章

  1. 从Linux服务器下载文件夹到本地

    从Linux服务器下载文件夹到本地 1.使用scp命令 scp /home/work/source.txt work@192.168.0.10:/home/work/ #把本地的source.txt文 ...

  2. 使用pscp实现Windows 和 Linux 服务器间的远程拷贝文件

    在工作中,每次部署应用时都需要从本机Windows 服务器拷贝文件到Linux 上,有时还将Linux 上的文件拷到本机,这些操作都是可以使用pscp实现的.下文将详细描述如何使用: PSCP (Pu ...

  3. Linux服务器间文件实时同步的实现

    使用场景 现有服务器A和服务器B,如果服务器A的指定目录(例如 /home/paul/rsync/ )中的内容发生变更(增删改和属性变更),实时将这些变更同步到服务器B的目标目录中(例如 /home/ ...

  4. SCP:从Linux服务器下载文件夹到本地

    原文链接:https://blog.csdn.net/netlai/article/details/79756279 scp /home/work/source.txt work@192.168.0. ...

  5. Linux服务器间文件传输

    利用scp传输文件 1.从服务器下载文件 scp username@servername:/path/filename /tmp/local_destination 例如scp codinglog@1 ...

  6. 从Linux服务器下载文件到本地命令

    从Linux服务器下载文件夹到本地1.使用scp命令 scp /home/work/source.txt work@192.168.0.10:/home/work/ #把本地的source.txt文件 ...

  7. scp实现mac与linux服务器之间文件传输

    1.mac上传文件到linux服务器 scp 文件名 用户名@服务器ip:目标路径如:scp /Users/test/testFile test@xxx.xxx.xxx.xxx:/test/ 2.ma ...

  8. rsync+sersync+inotify实现服务器间文件同步之一

    rsync+sersync+inotify实现服务器间文件同步之一:rsync安装配置 2013年12月14日 ⁄ Linux管理, 服务器集群技术 ⁄ 共 4925字 ⁄ rsync+sersync ...

  9. Windows操作系统远程Linux服务器传输文件方法(以EasyDSS云平台、EasyNVR上传部署为例)

    本文转自博客:https://blog.csdn.net/black_3717/article/details/79769406 问题背景: 之前给客户部署我们一款EasyDSS云平台(配合EasyN ...

随机推荐

  1. 缓存ABC

    缓存ABC Intro 缓存是一种比较常见的用来将提高系统性能的方式.从线程缓存.进程缓存.到内存缓存再到分布式缓存再到CDN,都是属于缓存的范畴. 缓存的本质是空间换时间以提高读的效率,牺牲一些内存 ...

  2. PM过程管理成熟度1级

    之前,我已经从项目实现的角度.企业管理诉求两方面,分析了PM的核心能力架构,以及其在过程管理方面的能力等级.接下来,Fancier凡奉信息会站在PM能力成长的角度,横向与纵向阐述每一成熟度等级PM的过 ...

  3. Javascript数组系列五之增删改和强大的 splice()

    今天是我们介绍数组系列文章的第五篇,也是我们数组系列的最后一篇文章,只是数据系列的结束,所以大家不用担心,我们会持续的更新干货文章. 生命不息,更新不止! 今天我们就不那么多废话了,直接干货开始. 我 ...

  4. 总结XSS与CSRF两种跨站攻击

    XSS:跨站脚本(Cross-site scripting),实际应是"CSS",但由于和层叠样式表CSS名称冲突,故改为"XSS" CSRF:跨站请求伪造(C ...

  5. 【原】无脑操作:eclipse创建maven工程时,如何修改默认JDK版本?

    问题描述:eclipse建立maven项目时,JDK版本默认是1.5,想创建时默认版本设置为1.8,如何修改? 解决方案: 找到本机maven仓库存放位置,比如:${user.home}/.m2/路径 ...

  6. python3 正则表达式点星问号(.*?)能不能匹配换行符?不能的话应该怎么写

    python3的re模块使用过程中,正则的书写遇到了一些问题,就是使用.*?能不能匹配到换行符的问题. 答案是不能. 如果在匹配过程中遇到了也没关系,加上这个语句就好: \s+

  7. Servlet是否单例?

    1,测试环境: Java SE版本:1.8.0_161(AMD64) Tomcat版本:9.0.7(AMD64) 2,试验 (1)编写HelloServlet. 由于测试代码很简单,此处只列出doGe ...

  8. Ubuntu composer 安装thinkphp5 失败,报错:[ErrorException] mkdir(): Permission denied

    在Linux环境下,使用composer安装thinkphp5,安装时,报错:[ErrorException]               mkdir(): Permission denied : 看 ...

  9. SpringBoot使用注解实现事务管理

    conttoller controller和普通的controller类一样, 不用改变 @RequestMapping(value = "/path/{id}", method ...

  10. jsonpath 使用教程(快速处理dict的深度查询)

    一 简介 JSONPath - 用于JSON的XPath 用来解析多层嵌套的json数据;JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具. 二 安装 安装方法:pip in ...