SSH 脚本使用文件

Jas*_*n H 2 bash shell-script

我一直在使用以下脚本远程访问我的系统:

#!/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= 变得很乏味

我想从文本文件中读取主机。我将如何修改此脚本以使其正常工作?

谢谢你。

ter*_*don 6

修改非常简单。假设您有一个每行一个主机名的文件,您只需要:

#!/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 通常是一个坏主意,因为按照惯例,全局环境变量是大写的,这可能会由于名称冲突而导致意外行为。当您使用标准变量名称时,这一点非常重要,例如HOSTNAMEUSERNAME通常已经在环境中定义。

此外,-n此处需要该选项以停止ssh尝试读取文件的其余部分。如果没有-n,则只有第一次迭代会起作用,因为该ssh命令会消耗其标准输入的其余部分,因此最终会读取整个文件。