两台linux设备文件直接传输,有很多应用场景
一、可能的方案
(一)先下载再上传
从linux通过ssh下载到windows下,然后再通过ssh上传到另一台linux。
1.优点:简单
2.缺点:效率低,需要额外的设备
(二)http服务器
比如通过如nginx,需要被下载的设置目录,另一条linux使用wget下载
1.优点:相对简单
2.缺点:每次要设置,如果目录设置的太宽泛则安全性堪忧。
(三)rsync
rsync搭配一些工具可以实现实时同步,可以参考这篇:
rsync+lsync实时备份
单纯的使用rsync比较简单
1.优点:相对简单
2.缺点:也是要设置目录,操作不灵活。而且rsync吃资源
(四)secure copy(scp)
这个算是比较好的方法,相当于通过ssh直连。
我这里就是用的scp
二、scp具体操作
1.安装scp
apt-get install openssh-client
或
dnf install openssh-clients
2.具体操作
设备1:192.168.0.100
设备2:192.168.0.200
将本地的文件复制到另一台设备
将设备1的/aaa目录的file.ini复制到设备2的/bbb目录下,使用root登录:
scp /aaa/file.ini root@192.168.0.200:/bbb/
将本地的文件夹(目录)复制到另一台设备
scp -r /aaa/bbb root@192.168.0.200:/bbb/
将另一台设备文件复制到本地设备
将设备2的/bbb目录的file.ini复制到本地的/aaa目录下,使用root登录:
scp root@192.168.0.200:/bbb/file.ini /aaa/
将另一台设备文件夹(目录)复制到本地设备
将另一台设备的/aaa/bbb目录复制到本地的/ccc目录下,使用root登录:
scp -r root@192.168.0.200:/aaa/bbb /ccc/
第一次连接会提示是否继续连接,选择yes,然后输入密码。之后每次都需要设定密码
3.自动填写密码的方法
如果使用这种方法,也要手动传输一次,因为ssh第一次连接会有提示,需要手动yes
每次使用都需要重新输入密码,而且需要两次输入
安装
apt-get install sshpass
或者
yum install sshpass
第一次使用sshpass,先使用手动登录ssh(即一台linux通过ssh登录另一条ssh)
ssh root@192.168.0.200
输入密码就远程登录了ssh,输入exit后退出远程登录的ssh
exit
后然后就可以用sshpass
在上面的命令加上sshpass -p ‘password’ ,引号中的password换成登录密码即可。
sshpass -p 'password' scp /aaa/file.ini root@192.168.0.200:/bbb/
sshpass -p 'password' scp root@192.168.0.200:/bbb/file.ini /aaa/
三、bash脚本
这个脚本运行前需要先手动scp命令一次,使得可以自动登录,再使用这个脚本即可
1.创建脚本文件
mkdir /etc/sh
vi /etc/sh/scp.sh
注意下面脚本中的常量改为自己的实际情况,下面会有脚本使用方法说明:
修改下面脚本中的ip,登录账户、密码三项
#!/bin/bash
# 常量设置区域(也可以改造成参数)
remote_ip="192.168.0.200" # 连接的设备地址
login_user="root" # 登录的账户
password="aaabbbccc" # 远程root的密码
# 运行区域
if [ $1 == "send" ];
then
# 发送文件/文件夹
if [ -d "$3/$2" ]; then
sshpass -p $password scp -r $3/$2 $login_user@$remote_ip:$4/
else
sshpass -p $password scp $3/$2 $login_user@$remote_ip:$4/
fi
elif [ $1 == "get" ]; then
# 下载文件/文件夹
if [ $5 ]; then
if [ $5 == "t" ]; then
# 文件夹
sshpass -p $password scp -r $login_user@$remote_ip:$4/$2 $3/
else
# 文件
sshpass -p $password scp $login_user@$remote_ip:$4/$2 $3/
fi
else
# 文件
sshpass -p $password scp $login_user@$remote_ip:$4/$2 $3/
fi
else
echo "请输入传输方式"
fi
赋予执行权限
chmod +x /etc/sh/scp.sh
2.运行及说明
我这个脚本这样用
第一个参数:传输方式,接收(get)还是发送(send)
第二个参数:文件名或目录名(不带上级目录)
第三个参数:本地目录(不带后面的/)
第四个参数:远程目录(不带后面的/)
第五个参数:上传是否为目录,是t,否f(下载时需要写这个参数,因为不能远程执行这些命令,上传时可以进行本地判断,所以不用写这个参数)
(1)将file.ini从本地的/aaa目录发送到远程主机的/bbb/下:
/etc/sh/scp.sh send file.ini /aaa /bbb
(2)从另一台电脑的/aaa目录下的file.ini复制到/bbb
/etc/sh/scp.sh get file.ini /bbb /aaa
(3)将wjj文件夹(目录)从本地的/aaa目录发送到远程主机的/bbb/下:
/etc/sh/scp.sh send wjj /aaa /bbb
(4)将wjj文件夹(目录)从本地的/aaa目录发送到远程主机的/bbb/下:
/etc/sh/scp.sh get wjj /bbb /aaa t
第一次使用sshpass需要先手动登录一下ssh
ssh root@192.168.0.200
输入密码后然后就可以用sshpass跳过了
如果不知道问题在那里,可以sshpass加个 -v参数
sshpass -v -p 'your_password' ssh user@host
如果是有线连接,通常能跑满(受路由器、交换机、两边硬盘速度影响)
我这个是千兆内网(),另外复制的文件从固态硬盘到机械硬盘,速度瓶颈在交换机和机械硬盘上面。
另外还受文件大小影响,如果非常多零散小文件,速度上不了,一个大文件速度通常能跑满