Você está esperando que todos os comandos após ssh "$server" sejam executados dentro do ssh? Não é assim que funciona. ssh com um nome de host e nenhum outro argumento inicia uma sessão interativa. Depois que ele sair, o script continuará com o próximo comando ( exec < filelist.txt ). Isso não é um comando remoto dentro do ssh; o ssh é feito e desaparece quando o comando é alcançado. Isso é apenas uma execução sequencial normal do script que contém.
Sessões ssh interativas com stdin redirecionado são um tanto incomuns. É por isso que você recebe um aviso. (Para eliminar o aviso, você pode usar -t ou -T )
Se você deseja passar um script grande por uma conexão ssh e executá-lo remotamente, pode fazê-lo com um documento , assim:
ssh "$server" sh <<EOF
your big script here...
EOF
Certifique-se de considerar cuidadosamente quais variáveis devem ser expandidas pelo script local e quais devem ser expandidas durante a execução do script remoto. Um $ desprotegido no heredoc será expandido localmente. Para protegê-lo para que o shell remoto veja um $ , use \$ . Se você quiser que todos sejam protegidos, altere <<EOF para <<'EOF' .