我必须iptables --flush
在 100 多个服务器中运行命令。我没有 root 凭据,但对我的帐户具有 sudo 访问权限。所以我想出了一个下面的脚本来在所有服务器中运行该命令。
我在flushhosts 文件中添加了服务器名称。
[root@~]# cat testscript.sh
> for i in `cat /flushhosts`
>
> do
>
> sshpass -p 'Mypwd' ssh -t username@$i sudo /sbin/iptables --flush
>
> cat << EOF || "Mypwd"
>
> done
[root@~]# ./testscript.sh
./testscript.sh: line 6: syntax error: unexpected end of file
我找不到剧本中缺少的内容。
答案1
如果您愿意接受不同的方法,我想建议使用expect:
创建一个小的期望脚本ex1.sh
#!/usr/bin/expect -f
set arg1 [lindex $argv 0]
spawn ssh username@$arg1
expect "password: "
send "Mypwd\r"
expect "$ "
send "sudo /sbin/iptables --flush\r"
expect "password "
send "Mypwd\r"
expect "$ "
send "exit\r"
然后你可以在循环中使用它,如下所示:
for i in $(</flushhosts); do ./ex1 $i; done
对于这种情况,你可以更灵活地使用expect。
答案2
尝试
for i in $(</flushhosts)
do
echo "Mypwd" | sshpass -p 'Mypwd' ssh -t username@$i sudo /sbin/iptables --flush
done
- 这可能有效,但尚不清楚
Mypwd
(inecho Mypwd
) 是否会进入 sudo $(</flushhosts)
相当于$(cat /flushhosts)
等价于后面引用的“cat /flushhosts”
关于猫<<“EOF”||我的密码
1)猫<<“EOF”
这将读取行,直到遇到单词 EOF,并将整个文本提供给 cat。这包括这个done
词。
2) ||我的密码
如果 cat 返回非零,则将执行 Mypwd (作为命令)。
由于没有找到 EOF 单词,当 bash 到达文档末尾时,for ... do
不是以 结尾done
,因此存在语法错误。
我希望这不是你想要的。
语法
cat <<EOF
hello world
EOF
称为此处文档,这是在 shell 脚本中提供数据的一种方式。