O $?
é avaliado antes de o comando ser enviado para a máquina remota. Efetivamente, você está enviando o comando echo 0
. Experimente
ssh server ' <some command >; echo $? '
Como Michael Hampton aponta, as aspas simples impedem a avaliação de variáveis, etc., antes de enviá-las ao comando remoto, enquanto as aspas duplas permitem isso.