我一直在使用以下脚本远程访问我的系统:
#!/bin/bash
USERNAME=someUser
HOSTS="host1 host2 host3"
SCRIPT="pwd; ls"
for HOSTNAME in ${HOSTS} ; do
ssh -l ${USERNAME} ${HOSTNAME} "${SCRIPT}"
done
Run Code Online (Sandbox Code Playgroud)
填写 HOSTS= 变得很乏味
我想从文本文件中读取主机。我将如何修改此脚本以使其正常工作?
谢谢你。
修改非常简单。假设您有一个每行一个主机名的文件,您只需要:
#!/bin/bash
username=someUser
script="pwd; ls"
while read -r hostname; do
ssh -n -l "$username" "$hostname" "$script"
done < "$1"
Run Code Online (Sandbox Code Playgroud)
然后,使用该文件作为参数运行脚本:
script.sh /path/to/hosts/file
Run Code Online (Sandbox Code Playgroud)
请注意,我将您的变量更改为小写。对 shell 变量使用 CAPS 通常是一个坏主意,因为按照惯例,全局环境变量是大写的,这可能会由于名称冲突而导致意外行为。当您使用标准变量名称时,这一点非常重要,例如HOSTNAME和USERNAME通常已经在环境中定义。
此外,-n此处需要该选项以停止ssh尝试读取文件的其余部分。如果没有-n,则只有第一次迭代会起作用,因为该ssh命令会消耗其标准输入的其余部分,因此最终会读取整个文件。