分布式ssh_使用SSH的分布式管理
关于本系列
典型的UNIX®管理员经常使用一系列重要的实用程序,技巧和系统,以协助管理过程。 有一些关键实用程序,命令行链和脚本可用来简化不同的过程。 这些工具中的一部分随操作系统一起提供,但是大多数技巧来自多年的经验以及减轻系统管理员生活的渴望。 本系列的重点是从各种不同UNIX环境中的可用工具中获取最大收益,包括简化异构环境中管理的方法。
简化远程登录
安全Shell(SSH)工具提供了一种用于登录远程主机并与之交换信息的安全方法。 提供了许多不同的工具,包括通用SSH工具(提供远程终端连接),SCP(安全的主机到主机复制解决方案)和SFTP(可在其中运行的安全文件复制解决方案)与标准FTP工具类似的方式。
所有这些工具都是安全的,因为交换的信息已加密。 另外,使用公钥或私钥机制来保护连接的身份验证。 SSH的主要优点之一是,您可以通过将公钥复制到远程计算机来绕过常规的登录和密码交换。
尽管在使用SSH登录到远程计算机时这很有用(因为这意味着您不必提供密码),但在执行远程管理时它甚至更有用。 必须输入密码也可能使自动远程管理(例如,通过cron运行命令)变得不可能,因为在自动脚本中,您将无法输入密码!
使用SSH在多台计算机上运行命令而不交换公共密钥时,需要为每台计算机输入密码。
一种快速而简单的设置方法是创建一个公共密钥:
$ ssh-keygen -t rsa
按照屏幕上的说明进行操作,但不要在提示时设置密码,因为每次要使用该键时,都需要输入密码。 这将创建一个私钥和一个公钥文件。 现在,您只需要在.ssh / id_rsa.pub中附加公共密钥文件的内容,并将其附加到您要在登录时使用的远程主机和用户的.ssh / authorized_keys文件中。公钥文件的内容自动添加到您要登录的每台计算机上。
运行远程命令
您可以通过多种方式运行远程命令。
您可以通过在登录或主机信息之后将要运行的命令添加到SSH来运行单个远程命令。 例如,要获取远程主机的磁盘信息,可以使用以下命令并获取下面清单1中的输出。
清单1.通过SSH运行一个简单的命令
$ ssh mc@gentoo.vm dfFilesystem 1K-blocks Used Available Use% Mounted on
/dev/hda3 14544820 3611520 10194464 27% /
udev 128044 564 127480 1% /dev
/dev/hdc1 1968872 50340 1818516 3% /var/tmp
/dev/hdc2 1968904 1482220 386668 80% /usr/portage
/dev/hdc3 1968904 35760 1833128 2% /home/build
shm 128044 0 128044 0% /dev/shm
请记住,如果尚未与远程主机交换公钥, 清单1中的序列要求您输入密码。
您还可以执行命令序列,方法是用分号分隔每个命令,然后将整个命令序列放在引号中,以便将其标识为单个参数。
清单2中显示了同时执行磁盘检查和正常运行时间检查的示例。
清单2.执行磁盘和正常运行时间检查
$ ssh mc@gentoo.vm "df;uptime"
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda3 14544820 3611520 10194464 27% /
udev 128044 564 127480 1% /dev
/dev/hdc1 1968872 50340 1818516 3% /var/tmp
/dev/hdc2 1968904 1488100 380788 80% /usr/portage
/dev/hdc3 1968904 35760 1833128 2% /home/build
shm 128044 0 128044 0% /dev/shm14:31:27 up 12 min, 2 users, load average: 0.01, 0.05, 0.06
您可以根据需要在此操作中键入任意数量的命令。 例如,也可以使用grep或其他工具进行过滤,但是您需要确保将整个远程命令表达式嵌入到引号中(请参见清单3 )。
清单3.使用grep进行过滤
$ ssh root@gentoo.vm "cat /var/log/messages|grep 'su\['"
Dec 17 18:05:37 localhost su[19218]: pam_authenticate: Permission denied
Dec 17 18:05:37 localhost su[19218]: FAILED su for root by mc
Dec 17 18:05:37 localhost su[19218]: - pts/1 mc:root
Dec 17 18:06:31 localhost su[19221]: pam_authenticate: Permission denied
Dec 17 18:06:31 localhost su[19221]: FAILED su for root by mc
Dec 17 18:06:31 localhost su[19221]: - pts/1 mc:root
Dec 17 18:06:40 localhost su[19222]: pam_authenticate: Permission denied
Dec 17 18:06:40 localhost su[19222]: FAILED su for root by mc
...
关于清单3的第一项注意事项是您以root用户身份直接登录到远程计算机。 这是因为您要查看的文件只能由超级用户访问。 您必须确保将系统配置为允许远程超级用户登录才能正常工作。
关于此示例的第二个重要说明是您已远程执行了grep操作。 实际上,您不需要这样做。 远程主机的标准输入和输出被复制到本地机器,因此可以在本地过滤命令的输出,如清单4所示。
清单4.在本地过滤的输出
$ ssh root@gentoo.vm "cat /var/log/messages" | grep 'su\['
Dec 17 18:05:37 localhost su[19218]: pam_authenticate: Permission denied
Dec 17 18:05:37 localhost su[19218]: FAILED su for root by mc
Dec 17 18:05:37 localhost su[19218]: - pts/1 mc:root
Dec 17 18:06:31 localhost su[19221]: pam_authenticate: Permission denied
Dec 17 18:06:31 localhost su[19221]: FAILED su for root by mc
Dec 17 18:06:31 localhost su[19221]: - pts/1 mc:root
Dec 17 18:06:40 localhost su[19222]: pam_authenticate: Permission denied
Dec 17 18:06:40 localhost su[19222]: FAILED su for root by mc
Dec 17 18:06:40 localhost su[19222]: - pts/1 mc:root
当然,效果基本上是相同的。
但是,当您希望使用的信息或命令是远程的时,使用远程管道方法将很有用。 例如,可以结合使用ls
和du
来确定清单5中显示的命令对不同目录的磁盘使用情况。
清单5.确定不同命令的磁盘使用情况
ssh root@gentoo.vm "ls -d /usr/local/* |xargs du -sh "
Password:
4.0K /usr/local/bin
4.0K /usr/local/games
4.0K /usr/local/lib
0 /usr/local/man
4.0K /usr/local/sbin
12K /usr/local/share
4.0K /usr/local/src
在继续将这些技术重新分配给多台计算机之前,有一个快速技巧,可以直接运行远程交互式会话,而无需先登录。
直接互动会议
如前所示,您可以直接运行许多不同的命令和命令链。 SSH解决方案的好处之一是,尽管命令本身是远程执行的,但命令的输入和输出均来自调用计算机。 您可以将其用作在两台机器之间交换与您要执行的命令有关的信息的方法。
您执行的命令几乎可以涵盖一系列不同命令中的所有内容。 但是,由于您是直接从命令行运行命令,因此使用此方法可以直接执行的操作受到限制。 例如,尝试使用编辑器使用上面显示的这种方法和技术来编辑远程文件通常会失败(请参见清单6 )。
清单6.编辑远程文件失败
$ ssh root@gentoo.vm "emacs /etc/amavisd.conf"
emacs: standard input is not a tty
您可以通过强制SSH分配伪tty设备来解决此问题,以便您可以直接与远程应用程序进行交互。
在多台机器上运行远程命令
到目前为止,您已经集中精力在单个远程计算机上运行单个命令或命令字符串。 尽管交互式会话技巧在直接使用SSH直接执行远程管理时很有用,但您可能希望自动化该过程,这意味着交互式元素不太可能使用很多。
要在多台计算机上远程运行同一命令,您需要围绕要运行的SSH命令和远程命令构建一个简单的包装程序,以便在每台远程计算机上重复该过程。
您可以使用非常简单的for
循环来执行此操作,如下面的清单7所示。
清单7. for
循环以远程运行命令
for remote in mc@gentoo.vm mc@redhat; do echo $remote; ssh $remote 'df -h'; done
mc@gentoo.vm
Filesystem Size Used Avail Use% Mounted on
/dev/hda3 14G 4.1G 9.2G 31% /
udev 126M 564K 125M 1% /dev
/dev/hdc1 1.9G 56M 1.8G 4% /var/tmp
/dev/hdc2 1.9G 1.3G 558M 70% /usr/portage
/dev/hdc3 1.9G 35M 1.8G 2% /home/build
shm 126M 0 126M 0% /dev/shm
mc@redhat
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol007.1G 5.5G 1.3G 82% /
/dev/hda1 99M 13M 82M 14% /boot
none 125M 0 125M 0% /dev/shm
您可以轻松地将其变成一个简单的脚本,如清单8所示。
清单8.将for
循环简化为简单命令
#!/bin/bash# Script to run a command across multiple machines# Global optionsTIMEOUT=10
ERRLOG=/tmp/remote-err-$$.log
OUTLOG=/tmp/remote-out-$$.log# Extract the command lineMACHINES=$1;shift
COMMAND=$1;shiftfor machine in $MACHINES
doecho $machinessh -oConnectTimeout=$TIMEOUT $machine $COMMAND >>$OUTLOG 2 >>$ERRLOGdonecat $OUTLOG
cat $ERRLOG >&2
rm -f $OUTLOG $ERRLOG
从命令行中提取机器和命令时,它们是“原样”。 使用脚本时,必须将用户或主机组合以及命令置于双引号中,以确保将其标识为单个参数。
唯一的其他增加是TIMEOUT
选项。 这ConnectTimout
选项设置为SSH,以确保在运行命令时您不必不必要地等待连接到可能不可用的主机。 默认值设置在脚本的开头,并应确保您不要等待太久。
运行命令时,将输出发送到几个日志文件,一个用于标准输出,另一个用于标准错误。 然后,将它们分别输出到适当的位置。 这凸显了SSH的优势之一-远程计算机重定向到同一位置(标准输出,标准错误),因此您可以在本地重定向的同时保留输出的含义。
例如,您可以使用以下脚本重复进行df检查:
$ runremote.sh "gentoo redhat" "df -h"
因为您重定向了标准输出和错误,所以您甚至可以生成整个过程的日志:
$ runremote.sh "gentoo redhat" "df -h" 2>/tmp/error.log
使用远程执行进行性能监视
使用runremote.sh时,您可能想使用超时值所使用的确切值,甚至可能要更改此值,具体取决于您正在执行的操作。 例如,如果您正在使用此脚本通过在多台计算机上使用正常运行时间来获取当前状态的快照,则您不想等待太长时间以进行连接和命令,否则快照将不准确。
而且,按原样,该脚本按顺序运行命令。 如果您有大量计算机,这不仅会花费很长时间,而且第一台计算机与最后执行所选命令之间的时间延迟可能会非常长,以至于跨计算机的关联可能无法实现。
清单9中显示了一个稍作调整的脚本runremote2.sh。 这几乎同时(通过在后台运行)执行远程命令,然后还将输出通过管道传输到各个日志文件。
清单9.几乎同时执行远程命令的脚本
#!/bin/bash# Script to run a command across multiple machines# Global optionsTIMEOUT=10
ERRLOG=/tmp/remote-err-$$.log
OUTLOG=/tmp/remote-out-$$.log# Extract the command lineMACHINES=$1;shift
COMMAND=$1;shiftfor machine in $MACHINES
doecho $machine >>$OUTLOG.$machinessh -oConnectTimeout=$TIMEOUT $machine $COMMAND >>$OUTLOG.$machine2>>$ERRLOG.$machine &
done# Wait for children to finishwaitcat $OUTLOG.*
cat $ERRLOG.* >&2
rm -f $OUTLOG.* $ERRLOG.*
在此脚本中,您还将计算机名称回显到命令日志中(对于所提供的每台计算机都是唯一的)。 为了确保在所有远程命令执行之前脚本不会退出,您需要添加一个wait
命令来等待脚本的子级完成。
现在,您可以使用脚本同时检查多台计算机(请参见清单10 )。
清单10.使用脚本同时检查多台机器
$ runremote2.sh "narcissus gentoo.vm droopy@nostromo mcbrown@nautilus" 'uptime'
droopy@nostromo
19:15 up 9 days, 23:42, 1 user, load averages: 0.01 0.03 0.00
gentoo.vm18:10:23 up 1 day, 10:02, 2 users, load average: 1.72, 1.84, 1.79
mcbrown@nautilus
19:15 up 10:08, 4 users, load averages: 0.40 0.37 0.29
narcissus
19:15 up 8 days, 7:04, 4 users, load averages: 0.53 0.54 0.57
当您想获取整个网络图时,这种监视很有用,例如,在运行Web或数据库服务时检查一组计算机或群集的问题,并希望同时识别该组计算机中潜在的峰值或问题。机器。
但是请注意,仍然会有延迟,尤其是在一台机器特别繁忙的情况下-建立连接和执行命令的时间可能会在不同的机器之间留下一些明显的时间延迟。
在多台机器上运行相同的操作
在多台计算机上创建用户可能很痛苦。 显然,有很多解决方案可以尝试解决使用单点登录实用程序带来的困难,例如网络信息服务(NIS)或基于LDAP的解决方案,但是您不必总是在此过程中使用户同步方式。
您可以通过在多台计算机上运行adduser
命令来使用SSH为您执行此操作。 但是在Solaris下,该命令的名称为useradd
。 命令行选项基本相同,因此您可以使用run-remote.sh两次(请参见清单11 )。
清单11.两次运行run-remote.sh
$ runremote.sh "gentoo redhat" "adduser -u 1000 -G sales,marketing mcbrown"
$ runremote.sh "solaris solaris-x86" "useradd -u 1000 -G sales,marketing mcbrown"
现在,您已经在具有相同组和相同用户ID的多台计算机上创建了相同用户,但这几乎不切实际。
更好的方法是使用“系统管理工具包:标准化UNIX命令行工具”一文(请参阅参考资料 )中展示的技巧,以在多台计算机上使用相同的命令:
$ runremote.sh "gentoo solaris" "adduser.sh -u 1000 -G sales,marketing mcbrown"
摘要
在本文中,您研究了一种在远程计算机上运行命令的简单但功能强大的方法。 尽管该过程的基础很简单,但是您也可以创建其他功能来完成一些强大的自动化远程管理任务(例如,将远程本地输入重定向并通过管道传递的功能)。 通过实施一些简单的Shell脚本技巧,您甚至可以使用该系统同时远程管理多台计算机,从而简化了许多重复性任务和性能监视。
翻译自: https://www.ibm.com/developerworks/aix/library/au-satdistadmin/index.html
分布式ssh_使用SSH的分布式管理相关推荐
- 区块链价值不仅是技术层面的创新与颠覆,还要看到分布式信任机制带来的组织管理模式等创新
浙江大学区块链研究中心常务副主任.浙江省区块链技术研究院院长蔡亮近日接受中国证券报记者专访时表示,当下区块链产业应用领域进一步扩展深化,行业应用价值开始凸显.随着区块链初步满足应用需求,软硬件一体化. ...
- 伪分布式集群、完全分布式搭建步骤详情
** 伪分布式集群.完全分布式搭建步骤详情 4.1 伪分布式模式介绍 1.特点- 在一台机器上安装,使用的是分布式思想,即分布式文件系统,非本地文件系统.- Hdfs涉及到的相关守护进程(nameno ...
- zookeeper 分布式锁_关于redis分布式锁,zookeeper分布式锁原理的一些学习与思考
编辑:业余草来源:https://www.xttblog.com/?p=4946 首先分布式锁和我们平常讲到的锁原理基本一样,目的就是确保,在多个线程并发时,只有一个线程在同一刻操作这个业务或者说方法 ...
- 【2016年第4期】分布式协商:建立稳固分布式 大数据系统的基石
陈康1,2,3,黄剑1,刘建楠4 1. 清华信息科学与技术国家实验室(筹),清华大学计算机科学与技术系,北京 100084: 2. 深圳清华大学研究院,广东 深圳 518057:3. 天津大学计算机科 ...
- 分布式事务实践 解决数据一致性 分布式事务实现,模式和技术
分布式事务实现,模式和技术 分布式事务实现,模式和技术 介绍分布式事务的定义.原则和实现原则,介绍使用Spring框架实现分布式事务的几种方式,包括使用JTA.Spring事务同步.链式事务等,并通过 ...
- 《深入理解分布式事务》,初识分布式......
一.初识分布式事务 以往业务开发中,项目架构往往是单体架构,随着时代的进步,业务量的增长,单体架构的项目往往会变得越来越臃肿,难以维护,甚至说一个节点崩了,可能会导致怎么项目的崩溃,为了解决这种问题, ...
- 分布式事务详解【分布式事务的几种解决方案】彻底搞懂分布式事务
文章目录 一.基本概念 什么是事务 本地事务 分布式事务 分布式事务产生的场景 二.分布式事务基础理论 CAP理论 CP - Consistency/Partition Tolerance AP - ...
- RCL0923分布式光伏群调群控终端装置-即光伏协议转换器(完成逆变器数据采集协议规约转换功能)+台区智能融合终端SCU实现分布式光伏群调群控-分布式光伏可观可测可控一键群调,一键群控方案介绍
RCL0923分布式光伏群调群控装置-即光伏协议转换器(完成逆变器数据采集协议规约转换功能)+台区智能融合终端SCU实现分布式光伏群调群控-分布式光伏可观可测可控一键群调,一键群控方案介绍 一.分布式 ...
- 分布式数据库实战第一节 分布式数据库的前世今生
开篇词 吃透分布式数据库,提升职场竞争力 你好,我是高洪涛,前华为云技术专家.前当当网系统架构师和 Oracle DBA,也是 Apache ShardingSphere PMC 成员.作为创始团队核 ...
最新文章
- 关于Linux静态库和动态库的分析
- ubuntu 修改卷标
- 菜鸟学自动化测试(四)----selenium 命令之验证页面元素
- MATLAB实战系列(十二)-如何用人工鱼群算法解决带时间窗车辆路径(CVRP)问题(附MATLAB代码)
- git的使用学习(三)时光机穿梭
- 关于 OData 协议的数据类型 - SAP gateway 框架是如何解析数据类型的?
- javascript:void(0) 含义
- HTTP - PUT 上传文件/Shell
- matlab人民币识别,Matlab图像处理学习笔记(六):基于sift特征点的人民币识别...
- opencv 图像转换(傅里叶变换)
- php数组出栈,php array_pop()数组函数将数组最后一个单元弹出(出栈)
- Java HttpURLConnection示例– Java HTTP请求GET,POST
- effective c++:对象的赋值运算
- 最新Activity与Fragment完全理解
- 【英语语法入门】 第11讲 名词
- 练习3 - 铲雪车(snow)
- Win10 设备管理器一个USB设备描述符请求失败解决方法
- cufflinks之cuffmerge,cuffdiff
- 定时任务crontab/at
- Java多线程系列—多线程带来的问题(05)