分布式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 df

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   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/shm
 14: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

当然,效果基本上是相同的。

但是,当您希望使用的信息或命令是远程的时,使用远程管道方法将很有用。 例如,可以结合使用lsdu来确定清单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-LogVol00
                      7.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 options

TIMEOUT=10
ERRLOG=/tmp/remote-err-$$.log
OUTLOG=/tmp/remote-out-$$.log

# Extract the command line

MACHINES=$1;shift
COMMAND=$1;shift

for machine in $MACHINES
do
    echo $machine
    ssh -oConnectTimeout=$TIMEOUT $machine $COMMAND >>$OUTLOG 2 >>$ERRLOG

done

cat $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 options

TIMEOUT=10
ERRLOG=/tmp/remote-err-$$.log
OUTLOG=/tmp/remote-out-$$.log

# Extract the command line

MACHINES=$1;shift
COMMAND=$1;shift

for machine in $MACHINES
do
    echo $machine >>$OUTLOG.$machine
    ssh -oConnectTimeout=$TIMEOUT $machine $COMMAND >>$OUTLOG.$machine
	2>>$ERRLOG.$machine &
done

# Wait for children to finish

wait

cat $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.vm
 18: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于Hadoop的伪分布式模式下的SSH配置,您可以按照以下步骤进行操作: 1. 首先,确保您已经正确安装并配置了OpenSSH服务器和客户端。您可以使用命令`sudo apt-get install openssh-server`来安装。 2. 检查SSH服务器是否正在运行。使用命令`sudo service ssh status`来检查SSH服务器的状态。如果未运行,可以使用命令`sudo service ssh start`来启动它。 3. 在Hadoop的配置文件中,找到`etc/hadoop/core-site.xml`文件,添加以下配置项: ```xml <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> ``` 此配置指定了HDFS的默认文件系统以及它的地址和端口。 4. 打开`etc/hadoop/hadoop-env.sh`文件,并找到以下行: ```shell export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/etc/hadoop"} ``` 确保这行中的路径与您的实际Hadoop配置文件的路径相匹配。 5. 打开`etc/hadoop/mapred-site.xml.template`文件,并添加以下配置项: ```xml <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> ``` 这将指定使用YARN作为MapReduce的框架。 6. 在`etc/hadoop/yarn-site.xml`文件中,找到以下行: ```xml <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> ``` 确保该配置项的值设置为`mapreduce_shuffle`,以便正确配置YARN。 7. 最后,在终端中执行以下命令来生成SSH密钥对: ```shell ssh-keygen -t rsa -P "" ``` 这将生成一个私钥文件和一个公钥文件。 8. 将公钥文件复制到`$HOME/.ssh/authorized_keys`文件中,以允许无密码连接。使用以下命令将公钥添加到授权密钥文件中: ```shell cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys ``` 9. 确保`$HOME/.ssh/`目录和`$HOME/.ssh/authorized_keys`文件的权限设置正确。使用以下命令设置权限: ```shell chmod 700 $HOME/.ssh/ chmod 600 $HOME/.ssh/authorized_keys ``` 完成以上步骤后,您就可以在Hadoop的伪分布式模式下使用SSH了。请注意,这些步骤是基于Linux系统的操作,如果您使用的是其他操作系统,请参考相应的文档进行配置。 希望这可以帮助到您!如果您有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值