dsh — 并发地将远程 shell 命令发到多台主机和格式结果。
dsh -q
dsh [-a] [-c] [-i ] [-h] [-m] [-q] [-v] [-s] [-z] [-S csh | ksh] [-L] [-l login_name] [-n node_list | -] [-w [node_list] | - ] [-N nodegroups] [-o "remote_shell_options"] [-r remote_shell_path] [-f fanout_value] [-t timeout] [-R | --reports directory] [--log pathname/filename] [-W | --noFileWriting] [command]
dsh 命令在一组节点上并发地调用命令。它为每个指定的节点并发发出远程 shell 命令并从所有节点返回输出,输出经过格式化,这样可以管理来自所有节点的命令结果。/usr/bin/rsh 是语法和安全性的模型。
命令发送到节点的设置可以通过两种方式确定:
首选方法是节点列表。节点列表从以下情况之一的第一个实例获得:
另一种方法叫作工作集体。工作集体从以下情况之一的第一个实例获得:
如果使用此方法时不存在节点列表或工作集体,则发生错误,且不发出任何命令。
如果节点用多于一个的方式指定,那么只使用优先级最高的指定,如下所示:
如果没有指定 command 参数,则 dsh 从命令行或者标准输入读取行,并且在节点列表或工作集体的每个主机上将每个输入作为命令发出。这些命令使用远程 shell 命令的语法。
要退出 dsh 命令行式,在命令行输入 exit,或者在 dsh 提示符处按下 Enter 键。
当命令在远程节点解析时,使用的路径是用用户指定的 DSH_PATH 环境变量确定的。如果没有设置 DSH_PATH,则使用的路径是远程 shell 缺省路径。(例如,设置源节点代码上路径集的 DSH_PATH,请使用 DSH_PATH=$PATH)。
dsh 直接在本地主机上运行命令,而不是使用远程 shell,除非使用了 -l 标志。
并发远程 shell 命令的最大数目可用散发 -f 标志或使用 DSH_FANOUT 环境变量来指定。如果愿意的话,可以通过指定散发值 1 获取连续的调用。散发维持在指定的散发值上。当节点上一个命令完成时,启动另一个命令。如果未用 DSH_FANOUT 环境变量或 -f 标志配置散发值,则将使用缺省散发值 64。dsh 运行的每个远程 shell 命令 都需要一个保留的 TCP/IP 端口,每个节点只有 512 个这样的端口可用。
如果 -s 标志指定了流方式而不是散发方式,则当命令在该节点上完成后从每个节点返回输出,而不是在返回结果前等待命令在所有节点上完成。这可以改善性能,但会造成输出无序。
如果退出值非零,那么远程 shell 命令的退出值显示在来自 dsh 命令的消息中。来自远程 shell 的非零返回码表示远程 shell 遇到了问题。这与远程发出命令的退出代码是不相关的。如果远程 shell 遇到问题,则该节点就从当前节点列表中除去。使用 -z 标志以从在远程节点上发出的最后一个命令获取返回码。注意 OpenSSH 行为不同;它返回远程命令的退出状态作为它的退出状态。这将影响 dsh 的行为且可能需要使用 -c 标志。
如果在 dsh 命令中没有发生错误,并且所有远程 shell 命令都是以退出代码 0 结束那么 dsh 的退出值就是 0。如果发生了内部错误,或者远程 shell 命令没有成功完成,则 dsh 退出值就大于 0。退出值对于每个不成功运行的连续实例加 1。
对于远程主机上命令的错误,未提供专门的错误恢复。应用程序和用户可以检查 dsh 命令的标准错误和标准输出的命令结果,并采取适当的操作。
dsh 命令一直等待,直到所有主机的每个命令的结果都出来,并且在读取更多输入命令前显示那些结果。仅当未在 dsh 命令行上指定 -s 标志时,此值才为真。
dsh 命令不与那些交互式命令一起工作,包括那些从标准输入读取的命令。
dsh 命令输出由远程发出命令的输出(标准错误和标准输出)组成。dsh 标准输出是远程 shell 命令的标准输出。dsh 标准错误是远程 shell 命令的标准错误。每一行前都以产生输出的节点主机名作为前缀。主机名后跟“:”和一行命令输出。
例如,命令发到 host1、host2 和 host3 的节点列表。当命令在每个主机上发出时,远程命令就会写下如下内容:
对于 host1 标准输出: h1out1 h1out2 对于 host2 标准输出: h2out1 h2out2 对于 host3 标准输出: h3out1 对于 host2 标准错误: h3err1 h3err2 dsh 标准输出为 host1: h1out1 host1: h1out2 host2: h2out1 host2: h2out2 host3: h3out1 dsh 标准错误为 host3: h3err1 host3: h3err2
显示由节点分组的相同的输出结果的过滤器是另外提供的。请参阅 dshbak 命令。
如果正在节点关闭时检测到该节点(例如,远程 shell 命令发出非零返回码),则后续命令在 dsh 命令的这次调用时不发送到该节点,除非指定了 -c 标志。
命令行开头的感叹号(!)使该命令直接传递到当前环境中的本地主机上。该命令不会被发送到节点列表。
信号 2(INT),信号 3(QUIT)和信号 15(TERM)都传播到远程命令。
信号 19(CONT),信号 17(STOP)和信号 18(TSTP)都是缺省值。这意味着 dsh 命令对这些信号作出正常的反应,但是这些信号对远程运行命令没有影响。其它信号由 dsh 捕获,并且对 dsh 命令具有缺省的影响。如果出现这些其它信号,终止(SIGTERM)所有当前子进程和通过传播它们远程运行的命令。
可以通过下列方式指定希望使用的远程 shell。此处显示的顺序是优先顺序。
如果未指定以上任何一项,则 dsh 缺省为 /usr/bin/rsh。
注意 dsh 缺省为 ksh 语法,除非使用 -S 标志。
如果指定了 -,则进入标准输入方式。dsh 通过 dsh host>".". 每次在一行内输入主机名。当完成时,按下 <Ctrl+d> 以退出标准输入方式并返回到 dsh 提示符。如果使用 -n -,则当从文件重定向时,无法从标准输入中读取命令。
运行 Kerberos V5 远程命令之前,必须首先运行 kinit 命令来获取凭单授权凭单。
其它安全性注意事项和远程 shell 命令的注意事项相同。
DSH_LIST=./dshhosts dsh ps
dsh -q
dsh -n otherhost1, otherhost2, otherhost3
dsh -n host1,host2,host3 -a cat /etc/passwd | dshbak
dsh -n otherhost cat remotefile '>>' otherremotefile
dsh -if 1 <commands_file >results 2>&1
dsh ps -ef | grep root
dsh 'ps -ef | grep root'或者
dsh ps -ef "|" grep root
dsh -n host1 cat /etc/passwd | cut -d: -f2- | cut -c2- >myetcpasswd
dsh -a -o "-D" /usr/bin/needs_auth_program
dsh -n -完成主机名列表之后,按 <Ctrl+d> 返回到 dsh 提示符。在 dsh 提示符处指定:
日期输出类似于以下内容:
# dsh -n - host1 host2 host3 dsh> date host1: Fri Mar 23 08:46:59 EST 2001 host2: Fri Mar 23 08:46:59 EST 2001 host3: Fri Mar 23 08:46:59 EST 2001 dsh> exit #
/opt/csm/bin/dsh
dshbak 和 rsh 命令。