迭代不起作用

时间:2014-04-04 19:28:36

标签: bash

我想让这个脚本运行起来。当我在本地执行它时,它工作正常,但它没有通过IP文件迭代文件中的远程服务器列表。

#!/bin/bash
entry=$(cat IPfile)
for i in $entry
do
  ssh -q "$entry"
  if [[ -n $(egrep "Red Hat Enterprise Linux Server release 5" /etc/redhat-release) ]]; then
    sed -i 's/#includedir/##includedir/' /etc/sudoers
  fi
done

2 个答案:

答案 0 :(得分:1)

您确定不是ssh -q "$i"吗? $entry可能会扩展到许多价值观。

修改

我假设你想要在ip列表中的每个服务器上发生grep / sed。你的脚本做的是ssh到每个服务器,然后等待指令。这应该有所帮助。

#!/bin/bash

for ip in $(<IPfile); do
    # Tell the remote server to start bash, but since its
    # standard input is not a TTY it will start bash in 
    # noninteractive mode.
    ssh -q "$ip" bash <<-SSH
        if [ ! -r /etc/redhat-release ]; then
            printf 'ip "%s" did not have a redhat-release file.\n' "$ip"
        elif fgrep -q 'Red Hat Enterprise Linux Server release 5' /etc/redhat-release; then
            sed -i 's/#includedir/##includedir/' /etc/sudoers
        else
            printf 'ip "%s" was not rhel server 5.\n' "$ip"
        fi
    SSH
done

某些发行版不会删除/ etc / redhat-release文件并将其作为自己的发行包的一部分。如果脚本打算严格在RHEL5上运行,请检查redhat-release软件包的版本。

条件语句将是:

if version=$(rpm -q --qf "%{version}" redhat-release); then
    # it is RHEL
    if [ ${version:0:1} == 5 ]; then
       # it is RHEL 5
    fi
fi

答案 1 :(得分:0)

这是因为ssh -q命令正在“吃掉”你的清单。您应该在ssh中添加“-n”选项,以防止它从标准输入中获取列表。