У thrig есть отличный ответ. Если вы хотите придерживаться bash (, даже несмотря на то, что цикл чтения while -чрезвычайно медленный и утомительный для получения правильного синтаксиса -мудрого ), используйте другой файловый дескриптор для чтения из файла и разрешите ожидать держаться за стандартный ввод:
while IFS= read -r -u3 ip; do
#.................^^^
/usr/bin/expect << EOF
spawn ssh "root@$ip" dmidecode
expect "Password:"
send "xxxx\r";
interact
EOF
done 3< iplist
#...^^
Если команда dmidecode не требует участия человека, измените interact
наexpect eof