Depois de seguir algumas dicas das outras respostas, criei este script confuso:
firefox -no-remote -p c-portal &
ffpid='ps aux | grep firefox | sed '2q;d' | tr -s ' ' | cut -d ' ' -f 2'
echo "firefox pid: $ffpid"
sleep 4
kill $ffpid
Eu também precisava entrar em about: config e alterar browser.sessionstore.resume_from_crash
para false.
Explicação de cada comando: ps aux obtém a lista completa de processos no sistema, o grep encontra todos os que contêm o firefox, o sed recebe a segunda linha (que parece ser sempre a mais recente do firefox), tr remove o extra espaços, corte obtém a segunda coluna (-d significa delimitador, que é um espaço).
Depois dessa confusão de processamento de string, há uma coisa de depuração que imprime o PID do firefox, dorme por 4 segundos, para que ele possa fazer o login e depois mata o firefox. A configuração about: config impede que ele tente restaurar a sessão.