我想让这个脚本运行起来。当我在本地执行它时,它工作正常,但它没有通过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
答案 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”选项,以防止它从标准输入中获取列表。