scp 上传文件到多个服务器节点
实测,代码可运行.
1.如果遇到syntax error near unexpected token问题,基本是由于windows环境下编写的shell脚本上传到UNIX中包含了^M引起的。
使用remove_ctrlM.sh替换掉sh脚本中的^M字符,也可以使用 vi -b your_file编辑文件。
如果scp.conf报syntax error near unexpected token问题,则vi -b scp.conf编辑此配置文件,替换掉其中的特殊字符。
2.如果遇到source: not found的异常,查看ubuntu12.04中shell脚本无法使用source的原因及解决方法。
原作者的脚本在copy dir的时候,会将整个dir目录拷贝至 target中,这跟scp命令本身有关。
scp -r ./code/oaf/* huanghongbo@192.168.233.136:$JAVA_TOP会仅拷贝oaf目录下的文件及文件夹至$JAVA_TOP
但是此处不能用sh multi_scp.sh ./scp.conf ./code/oaf/* $JAVA_TOP,会抛出异常。
所以我针对想仅拷贝目录下的文件及文件夹做了一点改动。
把multi_scp.sh中的
/usr/bin/expect scp_upload.sh "$ssh_host" "$ssh_port" "$ssh_user" "$ssh_password" "$scp_file" "$scp_target"
改为了
if [ -d "$scp_file" ]
then
for f in ` ls "$scp_file"`
do
/usr/bin/expect scp_upload.sh "$ssh_host" "$ssh_port" "$ssh_user" "$ssh_password" "$scp_file/$f" "$scp_target"
done
else
#scp file or dir
/usr/bin/expect scp_upload.sh "$ssh_host" "$ssh_port" "$ssh_user" "$ssh_password" "$scp_file" "$scp_target"
fi
鉴于此种方式需要使用linux的expect模块,我又写了一个简陋的scp,此种方式需要在每次执行scp的时候交互式的输入scp的密码,但是特别繁琐,所以就想到了加入ssh信任免密码登录。
Step 1. Linux基础 - scp免密码登陆进行远程文件同步
Step 2. $ sh scp2multi_nodes.sh(下载)
#!/bin/bash
ssh_hosts=("192.168.233.136" "192.168.233.137") default_ssh_user="huanghongbo"
default_ssh_password="huanghongbo"
default_ssh_port="" port=$default_ssh_port
scp_file=./code/oaf/
target=$JAVA_TOP
scpuser=$default_ssh_user for((i=;i<${#ssh_hosts[@]};i++))
do
#remote ssh host
scphost=${ssh_hosts[$i]}
echo $i node ,host is $scphost
#echo "["`date +"%F %T"`"] (scp -r $scp_file $ssh_user@$ssh_host:$ssh_port:$scp_target) start" echo "["`date +"%F %T"`"] (scp -r -P $port $scp_file $scpuser@$scphost:$target ) start"
#scp -q -r -P $port $scp_file/* $scpuser@$scphost:$target
#-q 不显示传输进度 scp -r -P $port $scp_file/* $scpuser@$scphost:$target if [ "$?" -eq "" ]
then
success_hosts="$success_hosts,$scphost"
else
fail_hosts="$fail_hosts,$scphost"
fi echo "["`date +"%F %T"`"] (scp -r -P $port $scp_file $scpuser@$scphost:$target ) end" done
echo "success_hosts=[$success_hosts]"
echo "fail_hosts=[$fail_hosts]"
PS:
1.示例中的target都是使用的环境变量$JAVA_TOP,如果remote环境和local环境的$JAVA_TOP环境变量不一致,则会导致传输到错误的路径或者scp:***:No such file or directory。
在scp中如何获取remote环境的环境变量,我暂时还没找到方法。
看到的一种比较合理的解释是
How is it supposed to know what the remote variables values are? scp/rcp DO NOT execute a .profile or any login script. They establish a connection to the remote server only.
2.Expect在这个程序里就是用来帮助自动输入scp的密码,Expect主要用于把需要人工交互的程序变为程序自动化完成,这个对于运维批量部署系统,批量无人值守安装,批量执行命令,批量上传下载
现代的Shell对程序提供了最小限度的控制(开始,停止,等等),而把交互的特性留给了用户。 这意味着有些程序,你不能非交互的运行,比如说passwd。 有一些程序可以非交互的运行,但在很大程度上丧失了灵活性,比如说fsck。这表明Unix的工具构造逻辑开始出现问题。Expect恰恰填补了其中的一些裂痕,解决了在Unix环境中长期存在着的一些问题。
default_ssh_user="huanghongbo" default_ssh_password="huanghongbo"default_ssh_port="22"port=$default_ssh_portscp_file=./code/oaf/target=$JAVA_TOPscpuser=$default_ssh_userfor((i=0;i<${#ssh_hosts[@]};i++)) do#remote ssh host scphost=${ssh_hosts[$i]}echo $i node ,host is $scphost#echo "["`date +"%F %T"`"] (scp -r $scp_file $ssh_user@$ssh_host:$ssh_port:$scp_target) start" echo "["`date +"%F %T"`"] (scp -r -P $port $scp_file $scpuser@$scphost:$target ) start"#scp -q -r -P $port $scp_file/* $scpuser@$scphost:$target#-q 不显示传输进度scp -r -P $port $scp_file/* $scpuser@$scphost:$targetif [ "$?" -eq "0" ] then success_hosts="$success_hosts,$scphost" else fail_hosts="$fail_hosts,$scphost" fi echo "["`date +"%F %T"`"] (scp -r -P $port $scp_file $scpuser@$scphost:$target ) end" done echo "success_hosts=[$success_hosts]" echo "fail_hosts=[$fail_hosts]" scp 上传文件到多个服务器节点的更多相关文章
- c++使用http协议上传文件到七牛云服务器
使用c++ http协议上传文件到七牛服务器时,比较搞的一点就是header的设置: "Content-Type:multipart/form-data;boundary=xxx" ...
- linux 执行远程linux上的shell脚本或者命令以及scp 上传文件到ftp--免密码登陆
场景:在linux A 上执行Linux B上的shell脚本和命令 步骤1.设置ssh免登陆 1.SSH无密码登录 # 本地服务器执行(A机器):生成密钥对 ssh-keygen -t dsa -P ...
- scp 上传文件自动录入密码
--- 服务器IP地址 des_host=serverIp 服务器存储路径(文件上传后存储指定目录下) des_direc=/home/lk/ 服务器用户密码 des_pass=root_passwo ...
- linux scp上传文件到其他机器上
scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...
- springboot +fastdfs 上传文件到到云服务器
fastdfs在云服务器的搭建和配置:https://blog.csdn.net/qq_41592652/article/details/104006289 springboot结构如下: appli ...
- PHP 利用CURL(HTTP)实现服务器上传文件至另一服务器
// 上传端 /** * 向目标地址推送xls文件 * @Date 2019/4/29 */ public function putXls() { // 目标接口 $url = "http: ...
- scp上传文件到远程服务器
scp -P 22 E:/download/2028792_www.yeves.cn_nginx/cloud.pem root@ip:/usr/local/src
- windows上传文件到linux云服务器上
安装putty,将pscp.exe移到 C:\Windows\System32 目录下. 在cmd 中执行,pscp -l rot -pw [password] -ls [ip]:/opt 查看目录 ...
- ssh 上传文件以及文件夹到linux服务器
闲来无事分享一篇,帮助到你的话,麻烦给老弟点个关注.经常会分享一些实用技能. 回归正题,现在服务器linux很多.是不是不会传文件?别急 下面就是方法: 一.上传文件到linux服务器 首先从你本地切 ...
随机推荐
- MongoDB常用操作--集合3
1.更新集合中的文档,语法如下: db.collection.update(criteria,objNew,upsert,multi) 参数说明: criteria:用于设置查询条件的对象 objNe ...
- OO方式下,ALV TREE和ALV GRID的不同之处
作为大部分报表程序的基础,ALV GRID差不多是每个ABAP开发者必须了解和掌握的内容,因此网上也不乏相关资料,而ALV TREE的应用相对较少,中文资料也就比较少见了.实际上,ALV TREE和A ...
- iOS 事件处理之UIResponder简介
在用户使用app过程中,会产生各种各样的事件 iOS中的事件可以分为3大类型:触摸事件.加速计事件.远程控制事件 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处 ...
- sharepoint2013的审核日志的时间区域设置
最近在项目中碰到审核日志的时间为GMT格式 ,如何格式化成本地时间. 网站集设置成本地区域无法解决此类问题,后来查询资料才知道.无法更改 Change Audit Time From GMT Time ...
- SVN(Cornerstone)-添加忽略文件
1.打开CornerStone,找到偏号设置,找到Subversion选项 2.去看"Use default global ignores"前面的"勾",删除& ...
- Java基础知识
1.java中的短路与(&&).短路或(||) 与 逻辑与(&).逻辑或(|)有什么区别啊? 最佳答案 &是java中的位逻辑运算: eg: 2&3=2: 分析 ...
- 【Swift】UILabel 设置内边距
前言 对应一个曾经开发 Android 的人来说,没有这些基础属性简直令人发指,还是表喷这个,认真写代码 - - # 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblo ...
- 记CentOS-7-x86_64-DVD-1503与Windows7单硬盘双系统的安装
我最初的设想是:Win引导CentOS,最后却变成了CentOS引导Win了.算是‘弄拙成巧’了吧. 因为我打算用U盘刻录镜像直接从U盘启动,所以不需要网上一些教程里面的繁琐的win下引导CentOS ...
- couchDB文档
每个文档都是自包含的数据单元,是一系列数据项的集合. 每个数据项都有一个名称与对应的值,值既可以是简单的数据类型,如字符串.数字和日期等:也可以是复杂的类型,如有序列表和关联对象. 每个文档都有一个全 ...
- #研发中间件介绍#定时任务调度与管理JobCenter
郑昀 最后更新于2014/11/11 关键词:定时任务.调度.监控报警.Job.crontab.Java 本文档适用人员:研发员工 没有JobCenter时我们要面对的: 电商业务链条很长,业 ...