Eu suponho que as barras invertidas estão lá para escapar dos dois espaços para que eles não separem os valores.
Com read -r line , você obtém toda a linha na variável line , de modo que line contenha user\ name user\ password , com os backspaces. Não é fácil dividir isso sem truques com eval . Um $line sem aspas será dividido em espaços em branco, barras invertidas ou não. Citado, ele se expande em uma palavra, como você viu.
Felizmente, read pode lidar com barras invertidas e dividir sua entrada em duas (ou mais) variáveis. Isso teria as variáveis contendo user name e user password (com as barras invertidas removidas):
while read user pass ; do
echo "user: $user"
echo "pass: $pass"
./connect.sh "$user" "$pass"
done < file
No entanto, se você quiser permitir espaços em branco no nome de usuário e na senha, talvez seja melhor usar algum outro delimitador do que o espaço. Dois pontos são comuns, então você teria uma entrada assim:
user name:user pass word
E depois leia com
while IFS=: read -r user pass ; do
echo "user: $user"
echo "pass: $pass"
done < file
(Isso deve funcionar desde que a senha não termine com dois pontos)