我有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
(我修改了值)
答案 0 :(得分:2)
您应该使用while
而不是for
来解析Bash中的文件。使用“重定向”将文件视为标准输入并一次读取一行。
while read server; do
...
done < $fic_serv
您的主要问题是Expect会将您的"
解释为“脚本结尾”。如\"
中那样转义它们,或如{1>中那样使用{}
。
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以使其更明显。
根据错误消息或登录提示,可能会有更多逻辑指示帐户名和/或密码不正确。