要求,在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. Docker 镜像编排并部署SpringBoot应用

    Docker-compose是一个基于Docker的编排工具,所谓编排个人理解就是将不同的镜像通过配置,组成一个新的运行环境,官方定义是:Compose is a tool for defining ...

  2. Java实现栈数据结构

    栈(英语:stack)又称为栈或堆叠,是计算机科学中一种特殊的串列形式的抽象数据类型,其特殊之处在于只能允许在链表或数组的一端(称为堆栈顶端指针,英语:top)进行加入数据(英语:push)和输出数据 ...

  3. 如何为 .NET Core CLI 启用 TAB 自动补全功能

    如何为 .NET Core CLI 启用 TAB 自动补全功能 Intro 在 Linux 下经常可以发现有些目录/文件名,以及有些工具可以命令输入几个字母之后按 TAB 自动补全,最近发现其实 do ...

  4. 【公众号系列】两分钟学会SAP F1技巧

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[公众号系列]两分钟学会SAP F1技巧   写 ...

  5. Python面试笔记一

    目录 一.MySQL(30题) 二.django(15题) 三.Python部分(46题) 四.RESTful API设计指南(7题) 五.补充 一.MySQL(30题) 1.mysql如何做分页 m ...

  6. kubernetes-整体概述和架构

    1.Kubernetes是什么 Kubernetes是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务.通过Kubernetes能够进行应用的自动化部署和扩缩容.在Kubernetes中,会将组 ...

  7. c++ cout、cin、endl

    cout是标准输出流对象,<<是输出操作符:cin是标准输入流对象,>>是输入操作符:endl是换行符操作符.他们都属于C++标准库,所以都在std的名字空间里.所以要在开头写 ...

  8. Struts2的核心——拦截器

    虽然以前已经学了很多的拦截器,但是在这里还是想重头梳理一下所有有关拦截器的知识,尤其是struts2中的拦截器 1:拦截器是什么? java里的拦截器是动态拦截Action调用的对象.它提供了一种机制 ...

  9. Visual Studio 2017 设置透明背景图

    一.前言 给大家分享一下,如何为VS2017设置透明背景图.下面是一张设置前和设置后的图片. 设置前: 设置后: 二.设置背景图片的扩展程序 我们打开VS的扩展安装界面:[工具]->[扩展和更新 ...

  10. Golang 入门 : 切片(slice)

    切片(slice)是 Golang 中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合.切片是围绕动态数组的概念构建的,可以按需自动增长和缩小.切片的动态增长是通过内置函数 append( ...