Linux下文件传输一般有两个命令scp、ftp(工具需要下载安装)
本文主要讲讲scp的文件传输脚本
1、scp ssh-keygen -t rsa免输入密码,传输
这里假设主机A 用来获到主机B的文件。
在主机A的用户根目录下执行如下命令来生成配对密钥:
ssh-keygen -t rsa
遇到提示回车默认即可,两次回车后,显示完成。公钥被存到用户目录下.ssh目录,比如root存放在:
/root/.ssh/id_rsa.pub
将 .ssh 目录中的 id_rsa.pub 文件复制到 主机B 的 ~/.ssh/ 目录中,并改名为 authorized_keys,
到主机A中执行命令和主机B建立信任,例(假设主机B的IP为:192.168.100.4):
scp ~/.ssh/id_rsa.pub 192.168.100.4:/root/.ssh/authorized_keys (如果是集群之间实现秘钥免登录,authorized_keys里面的内容就只能累加,而不能这样直接修改文件名)
下面就可以用scp、ssh命令不需要密码来获取主机B的文件了
ssh 192.168.100.4 回车就不需要密码了。
注:其实id_rsa.pub内容添加到对方机器的authorized_keys中就行了
2、scp中使用expect 进行文件传输
脚本如下:
#!/bin/bash time=`date +%Y%m%d_%H%M%S`
ip=`ifconfig eth0 |grep "inet addr"|awk -F ":" '{print $2}'|awk '{print $1}'` #获取机器的ip地址
if [ ! -d /tmp/back ]; then
mkdir -p /tmp/back
fi
cd /tmp/back
if [[ -d test ]]; then
rm -r -f /tmp/back
fi if [ $ = "script" ]; then #获取运行脚本是传入的参数,根据不同的参数备份不同的文件
if [ ! $ ]; then
cp -r /home/www/scheduleshell /tmp/back #默认文件地址
else
cp -r -f $ /tmp/back
fi elif [ $ = "crontab" ]; then
cp -r /var/spool/cron /tmp/back
else
echo "the words is not defined!"
exit
fi
cd /tmp/back
pwd
tar -zvcf $ip-$time-$.tar.gz ./*
/usr/bin/expect -c " #expect语句部分,根据命令行提示输入密码,没有考虑容错部分 crontab 使用的环境变量可能与我们手动执行的时候有点不一致,运行的时候加上绝对路径会好一点
set timeout 10
spawn scp -r /tmp/back/$ip-$time-$1.tar.gz root@172.*.*.176:/home/hefeng/
expect \"password:\" {send \"password\r\"}
spawn scp -r /tmp/back/$ip-$time-$1.tar.gz root@172.*.*.182:/home/hefeng/
expect \"password:\" {send \"password\r\"}
expect eof
exit #使用interact 在crontab下运行会有点问题
"
if [ $? !=0 ]; then
echo "step for scp is failed"
exit 0
fi
rm -r -f /tmp/back/*