O problema é que o redirecionamento com < está sendo feito localmente quando você executa o ssh sozinho (pelo shell no qual está digitando), mas está sendo executado na máquina remota quando executa a partir de expect , porque spawn simplesmente copia os argumentos fornecidos, portanto, o < é passado para o remoto como parte do comando ssh. É como se você digitasse 'ssh' 'xxxx@yyyy' "sh -" '<' 'test.sh' no shell, o que da mesma forma não funcionará.
Você precisa adicionar um comando shell intermediário para obter o redirecionamento analisado antes do ssh. Use por exemplo,
spawn sh -c "ssh xxxx@yyyy sh - < test.sh"