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_port
scp_file=.
/code/oaf/
target=$JAVA_TOP
scpuser=$default_ssh_user
for
((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:$target
if
[
"$?"
-
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服务器 首先从你本地切 ...
随机推荐
- PrototypePattrn(原型模式)
/** * * @author TMAC-J * 原型模式,可以说是简化的工厂模式 * 与工厂模式的区别是工厂模式可以生产很多的产品,而原型模式仅仅是复制而已 * 这里有一个问题:深克隆和潜克隆的问题 ...
- OData V4 系列 .net应用
OData 学习目录 添加 OData Client Code Generator 扩展 添加OData T4生成工具 修改 T4 模板的 MetadataDocumentUri 运行Web项目,之后 ...
- linux 文件系统简介
linux文件系统简介 文件系统是linux的一个十分基础的知识,同时也是学习linux的必备知识. 本文将站在一个较高的视图来了解linux的文件系统,主要包括了linux磁盘分区和目录.挂载基 ...
- 记jQuery.fn.show的一次踩坑和问题排查
最近很少已经很少用jQuery,因为主攻移动端,常用Zepto,其实很多细节和jQuery并不一样.最近又无意中接触到了PC的需求和IE6, 使用了jQuery,刚好踩坑了,特意记录一下. 本文内容如 ...
- SharePoint 2010 GridView/SPGridView完全应用系统样式
自定义开发页面如果用到了GridView或SPGridView默认跟列表的样式是不一样的,如要要一样,需要: 1)aspx <asp:GridView DataKeyNames="ID ...
- Linux0.11内核--加载可执行二进制文件之1.copy_strings
从现在开始就是分析最后的核心模块exec.c了,分析完这个文件后,就会和之前的所有分析形成一个环路,从创建进程.加载进程程序到进程调度.内存管理. exec.c的核心do_execve函数很长,而且用 ...
- 比Ansible更吊的自动化运维工具,自动化统一安装部署_自动化部署udeploy 1.0
新增功能: 2015-03-11 除pass(备份与更新)与start(启动服务)外,实现一切自动化. 注:pass与start设为业务类,由于各类业务不同,所以无法实现自动化.同类业务除外,如更新的 ...
- 通过VLD扩展分析PHP opcode
安装VLD扩展 ./configure --with-php-config=/usr/local/php/bin/php-config --enable-vld 生成脚本opcode > p ...
- MongoDB-分片片键
1.分片 分片是什么?分片就是将数据存储在多个机器上.当数据集超过单台服务器的容量,服务器的内存,磁盘IO都会有问题,即超过单台服务器的性能瓶颈.此时有两种解决方案,垂直扩展和水平扩展(分片). ...
- centos7安装vncserver
:# yum install tigervnc-server -y :cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vnc ...