通过 sudo 访问 SSH 到服务器 - 脚本引发意外的文件结束错误

通过 sudo 访问 SSH 到服务器 - 脚本引发意外的文件结束错误

我必须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(in echo 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 脚本中提供数据的一种方式。

相关内容