A gives a key to B, why can A login on B without password?
Você está certo.
Quando o SSH recebe uma conexão de entrada, ele pode autenticar o usuário de várias maneiras. Isso é configurável. Uma maneira típica é verificar se o usuário tem uma chave pública em um arquivo ~ / .ssh / authorized_keys * e aceitar uma chave privada correspondente (supondo que todos os detalhes sejam aceitos, como um arquivo com permissões aceitáveis). Se nenhuma chave estiver configurada ou se o cliente SSH falhar em fornecer detalhes que comprovam que o cliente SSH tem uma chave privada correspondente, o servidor SSH solicitará uma "senha" (ou "senha").
ssh-copy-id é basicamente um comando que faz uma tarefa que não é muito difícil de fazer manualmente. Ele usa o SSH para se conectar ao sistema remoto e obtém a chave pública no arquivo ~ / .ssh / authorized_keys *.
Depois que aprendi a usar o ssh-copy-id, eu rapidamente me esqueci, porque o programa não era muito útil para mim, já que eu já aprendi a fazer manualmente as tarefas equivalentes. Usar ssh-copy-id era, reconhecidamente, um pouco mais fácil / rápido. No entanto, era muito não essencial. Acredito que se a conveniência extra vale o esforço para aprender mais um comando, é questionável.
ssh-copy-id pode exigir que o usuário insira uma senha, da mesma forma que o usuário precisaria fazer (usando qualquer outro cliente SSH) se o usuário estivesse fazendo isso manualmente. Não contorna os requisitos normais de autenticação.
(Obviamente, depois que o ssh-copy-id faz sua parte, a chave SSH é instalada e pode ser usada facilmente.)
It should go like this, login on B, B ssh A without password.
Você pode fazer logon no B (usando uma senha) e, em seguida, usar o SSH (como um shell ou um protocolo que usa SSH, como o SCP / SFTP) para obter uma chave do A. Sim, isso também funciona. Se você precisa de uma senha ou não, isso depende da configuração de A. Se A tiver uma chave pública e B tiver uma chave privada correspondente, B talvez não precise digitar uma senha.
a resposta do cas menciona o ssh-agent (que não foi especificado na pergunta). Isso é basicamente outra abordagem. O agente ssh armazena chaves privadas. Eles podem ser criptografados, portanto, você precisa digitar uma frase secreta para obter acesso às chaves privadas descriptografadas. Quando você executa o SSH, o servidor SSH fará algo que o agente ssh reconhece e, em seguida, o agente ssh poderá fornecer os detalhes necessários ao servidor SSH. A idéia é que, uma vez que o agente ssh esteja configurado, depois de digitar sua senha uma vez (para descriptografar o acesso às chaves), você pode fazer conexões diferentes durante todo o dia e não precisar continuar digitando novamente sua frase longa. como o ssh-agent está em execução. Isto é principalmente sobre a experiência do usuário final que usa o cliente SSH, então não há muito trabalho que você precisa fazer no servidor SSH (além de configurar uma chave pública, assim como qualquer um dos outros métodos que já foram discutidos).