问题集锦

  其实标题的内容就是很常见的集群操作,当有一个脚本或者一个命令需要很多个机器同时(或者说接近同时)执行时,就涉及到几个问题:

  1.   怎么通知每个主机?
  2.   每个主机收到通知后,怎么让主机执行命令?
  3.   怎么让上面的过程同时发生?

  上面其实可以分为两步:

  1.   登录到单个机器
  2.   让单个机器执行命令

  重复上面的两个操作,执行多进程或者创建子进程都能达到目标。

  

  接下来的问题:

  1.   ssh登录需要密码,怎么设置无需密码就可以登录
  2.   登录后怎么让登录的机器执行命令

ssh免密码登录

  关于这个问题,可以参考这篇博客ssh免密码登录配置

  大致的过程:  

  ServerA 的UserA用户 希望使用ServerB 中UserB的账号免密登录ServerB

→ ~ $  ssh-keygen -t rsa
#使用RSA加密算法生成密钥对 → ~ $ ssh-copy-id UserB@ServerB
#将自己生成的公钥复制到远程主机的authorized_keys文件上

  设置完成后,就可以在本地使用ssh UserB@ServerB来免密登录了。

让远程机执行命令

  登录远程机之后,让远程机执行命令,在ServerB

  你可能你会说下面这个命令

→ ~ $  ssh UserB@ServerB && echo "hello world" > index

  然而上面这个命令并不会像我们期望的那样执行,过程如下:

  1.   在ServerA的终端执行上面这条命令
  2.   会先使用UserB免密登录到ServerB
  3.   接着会进入ServerB的终端
  4.   那条命令中的echo命令就被挂起了,因为ssh进程还没执行结束呢
  5.   在ServerB的终端中执行exit,退出ServerB
  6.   回到ServerA的终端,继续执行echo命令,然后命令执行结束

  查看ServerA中UserA的子目录,会多出一个index文件,但是ServerB中UserB的家目录中却不会有index文件。

  正确做法

→ ~ $  ssh UserB@ServerB  'echo "hello world" > index'

  没错,只是单纯的用引号将命令括起来就行了,这样会被当做位置参数传递给ssh,然后就能成功在远程机上运行了

同时对多个机器发指令(多进程并行)

  Linux里面的多进程有一个特别方便的方法:在命令后面加一个&符号,那么该命令就会在后台执行,也就是多进程了。

  所以要有了前面几步基础之后,可以下面这样做,实现向所有机器同时发送指令:

#!/bin/bash
#多进程对多个机器同时发指令 #注意下面的用户和ip是一一对应的,顺序不要搞错,额否则不能登录
#user1登录server1
server=(
"192.168.1.1"
"192.168.1.2"
"192.168.1.3"
"192.168.1.4"
)
user=(
"test1"
"test2"
"test3"
"test4"
) #服务器和用户账号对应关系
tot_s=${#server[*]}
tot_u=${#user[*]} if [ $tot_s -ne $tot_u ];then
echo "服务器和用户账号数量不对应,请检查server列表和user列表"
exit
fi i=0
while [ $i -lt $tot_u ];do
(ssh ${user[$i]}@${server[$i]} "command1;command2" & ) 2>> ~/Desktop/log.txt
#注意一定要在最后面加&符号,否则就是串行执行,不能体现并行。
#将错误重定向到日志文件中 if [ $? -ne 0 ];then
echo "${user[$i]}@${server[$i]}执行过程中出现异常"
fi #注意迭代器别忘了自增
i=$[ $i + 1 ]
done

  注意:前提是已经可以无密登录,否则每次连接都要输入密码。

ssh无密码登录多台机器,并让所有远程机执行相同命令的更多相关文章

  1. 【转发】SSH无密码登录的配置

    免责声明:     本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除.     原文作者:http://cn.soulmachine.me/     原文地址:http ...

  2. 批量实现多台服务器之间ssh无密码登录的相互信任关系

    最近IDC上架了一批hadoop大数据业务服务器,由于集群环境需要在这些服务器之间实现ssh无密码登录的相互信任关系.具体的实现思路:在其中的任一台服务器上通过"ssh-keygen -t ...

  3. 普通用户ssh无密码登录设置

    这段时间在做Hadoop的环境配置,用root用户只需要按照一定的步骤进行操作就可以直接实现无密码登录,但如果使用新建用户,怎么尝试都不行. 本帖大部分都是其他人帖子的内容.如果按照下面的步骤还是不能 ...

  4. 【原创】Linux服务器集群通过SSH无密码登录

    SSH 无密码授权访问slave集群机器 1. 安装SSH,所有集群机器,都要安装SSH环境介绍:  Master : CNT06BIG01 192.168.3.61 SLAVE 1: CNT06BI ...

  5. Linux SSH无密码登录

    Linux服务器常见的登录方式有两种:密码登录.秘钥登录.工作中我们最常使用的是用秘钥登录的方法,因为使用秘钥登录更高效.更安全. 如何实现SSH无密码登录: 原理:无密码ssh登录的主要操作为将本机 ...

  6. SSH无密码登录及远程拷贝命令SCP的使用

    SSH无密码登录 1.生成密钥对(公钥和私钥) $ cd /home/cen/.ssh $ ssh-keygen -t rsa #生成密钥,使用rsa方式进行加密,四个回车 $ ssh-copy-id ...

  7. 集群之间配置 SSH无密码登录

    集群之间配置 SSH无密码登录 配置 ssh (1)基本语法 ssh 另一台电脑的 ip 地址 (2)ssh 连接时出现 Host key verification failed 的解决方法 # ss ...

  8. 配置SSH无密码登录【原著】

    环境:两台Centos虚拟机,配置了静态的ip.(详见虚拟机如何配置静态的IP地址的操作步骤) 192.168.75.21192.168.75.22 第一步:为每台服务器配置静态IP地址参见: 虚拟机 ...

  9. ssh-keygen+ssh-copy-id 在linux下实现ssh无密码登录访问(转)

    转自:http://blog.csdn.net/pennyliang/article/details/8556662 ssh-keygen+ssh-copy-id 在linux下实现ssh无密码登录访 ...

随机推荐

  1. Python - 判断list是否为空

    Python中判断list是否为空有以下两种方式: 方式一: list_temp = [] if len(list_temp): # 存在值即为真 else: # list_temp是空的 方式二: ...

  2. 老生常谈:Windows的7类安全漏洞

    这是篇比较老的文章,但是现在翻出来发下,还是会让大家对Windows的安全漏洞有所了解.建议大家阅读<软媒原创:如何从根上保证电脑安全.不中毒>. 目前微软系列产品中,危害计算机安全的漏洞 ...

  3. LeetCode算法题-Valid Anagram(Java实现)

    这是悦乐书的第198次更新,第205篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第61题(顺位题号是242).给定两个字符串s和t,写一个函数来确定t是否是s的anag ...

  4. 类中的 this关键字

    this可用于区分局部变量和成员变量,因为构造函数中如果使用 this.成员变量 = 参数值, 那么可以在new对象时,将初始化值赋值给成员变量,否则成员变量赋值失败, 所以this可以区分成员变量和 ...

  5. 【存储】RAID磁盘阵列选择

    RAID磁盘阵列(Redundant Arrays of Inexpensive Disks) 一个基本思想:将多个容量较小.相对廉价的磁盘进行有机组合,从而以较低的成本获得与昂贵大容量磁盘相当的容量 ...

  6. Jenkins的环境部署

    一.Tomcat环境安装 1.安装JDK(Java环境) JDK下载地址:https://www.oracle.com/technetwork/java/javase/downloads/index. ...

  7. Django-rest-framework 接口实现 分页:(Pagination) 解析器(Parser) 渲染器(renderer)

    分页:(Pagination) rest_framework 中已经定义好了 3 种 分页模式 from rest_framework.pagination import PageNumberPagi ...

  8. Linux 与 Unix 到底有什么不同?区别在哪?

    Linux 与 Unix 到底有什么不同?区别在哪? 如果你是一名20多岁或30多岁的软件开发人员,那么你已成长在一个由Linux主导的世界中.数十年来,它一直是数据中心的重要参与者,尽管很难找到明确 ...

  9. 如何弄清Linux系统运行何种系统管理程序

    如何弄清Linux系统运行何种系统管理程序 虽然我们经常听到系统管理器System Manager这词,但很少有人深究其确切意义.现在我们将向你展示其区别. 我会尽自己所能来解释清楚一切.我们大多都知 ...

  10. Linux配置本地yum源

    最近在配置zabbix时,遇到CentOS 无法连接网络问题,搜索到一种配置本地yum源的方法,特此记录 一.联网安装预处理 配置缓存,修改/etc/yum.conf [main] cachedir= ...