使用Expect测试帐户的存在

时间:2019-04-10 11:24:59

标签: bash expect send

我有400台服务器的列表,我想检查unix帐户是否存在并希望将其循环

我写了一个使用Expect命令的bash脚本,但它返回了我不理解含义的错误消息

#!/bin/bash
fic_serv="test.txt"
echo "Passwd"
stty -echo
read -s passwd
stty echo
suffix="suffix"
account="acc"


for server in `cat $fic_serv`
do
        prompt="[$acc@$server ~]$ "
        expect -c "
        spawn ssh -o StrictHostKeyChecking=no $account@$server.$suffix
        expect  "Password: "
        send "$passwd\r"
        expect $prompt
        send "logout\r"
        "
done


[acc@serv ~]$ couldn't read file "
        send "passwd\r"
        expect [acc@server ~]$
        send "logout\r"
        ": no such file or directory

(我修改了值)

3 个答案:

答案 0 :(得分:2)

您应该使用while而不是for来解析Bash中的文件。使用“重定向”将文件视为标准输入并一次读取一行。

while read server; do
  ...
done < $fic_serv

您的主要问题是Expect会将您的"解释为“脚本结尾”。如\"中那样转义它们,或如{中那样使用{}

 expect -c "
        spawn ssh -o StrictHostKeyChecking=no $account@$server.$suffix
        expect {Password: }
        send {$passwd\r}
        expect $prompt
        send {logout\r}
        "

答案 1 :(得分:1)

如果您要管理400台服务器,强烈建议您使用ansible

您可以将主机列表放入文件中,将其命名为inventory,然后运行以下命令:

ansible -i inventory -m shell -a "id acc" all

答案 2 :(得分:0)

在外壳中使用here-docs嵌入另一种语言的代码通常比引用地狱更好,并且在环境中共享变量比参数扩展更容易,更安全:

export account passwd
while IFS= read -r server; do
    export prompt="[$acc@$server ~]$ "
    export host="$server.$suffix"
    expect << 'END_EXPECT'
        spawn ssh -o StrictHostKeyChecking=no $env(account)@$env(host)
        expect  "Password: "
        send "$env(passwd)\r"
        expect $env(prompt)
        send "logout\r"
        expect eof
END_EXPECT
done < "$fic_serv"

如图所示,我希望缩进Heredoc以使其更明显。

根据错误消息或登录提示,可能会有更多逻辑指示帐户名和/或密码不正确。