Ubuntu SSH
O SSH (Secure Shell, "shell seguro") abre um terminal em outra máquina, pela rede, com tudo criptografado. É assim que se administra praticamente todo servidor Linux do mundo. Nesta aula, a Ana vai acessar a máquina servidor (192.168.0.50) a partir do notebook.
- A diferença entre cliente e servidor SSH, e como instalar o servidor.
- O que acontece na primeira conexão (a pergunta do fingerprint).
- Criar uma chave e entrar sem senha, passo a passo.
- Criar apelidos no
~/.ssh/configpara digitar sóssh servidor. - Resolver os erros mais comuns: Permission denied, Connection refused, timed out e o aviso de identificação alterada.
Cliente e servidor
Toda conexão SSH tem dois lados:
| Lado | Programa | Onde roda | Já vem instalado? |
|---|---|---|---|
| Cliente | ssh | Na máquina de onde você digita (o notebook) | Sim, no Desktop e no Server |
| Servidor | sshd, pacote openssh-server | Na máquina que você quer acessar | Só se for escolhido na instalação do Server |
Pense numa ligação telefônica: o cliente liga, o servidor atende. Se ninguém atende do outro lado (servidor não instalado ou desligado), a ligação não completa.
Instalar o servidor SSH
Na máquina que vai receber conexões (aqui, o servidor), instale o pacote e confira o serviço:
$ sudo apt install openssh-server
$ systemctl status ssh
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/usr/lib/systemd/system/ssh.service; disabled; preset: enabled)
Active: active (running) since Thu 2026-10-15 10:12:04 -03; 3s ago « rodando
TriggeredBy: ● ssh.socket « ligado pelo socket
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 1102 (sshd)
No Ubuntu atual, o SSH é ativado pelo ssh.socket: o serviço só "acorda" quando chega a primeira conexão. Por isso o ssh.service pode aparecer como disabled e mesmo assim funcionar. Se o firewall estiver ligado, libere a porta: sudo ufw allow ssh (veja Firewall (ufw)).
Descubra o IP do servidor com hostname -I, rodado nele:
$ hostname -I 192.168.0.50
Primeira conexão
- ssh
- O cliente SSH.
- ana
- O usuário no servidor. Pode ser diferente do seu usuário local.
- @
- "em".
- 192.168.0.50
- O endereço do servidor: IP ou nome.
$ ssh ana@192.168.0.50 The authenticity of host '192.168.0.50 (192.168.0.50)' can't be established. « "não conheço esta máquina" ED25519 key fingerprint is SHA256:Xk3v9Qm1d7Y2pLwZ0aTnR5cB8eHfJ4uVgK6sNoP1qEw. « a "impressão digital" dela This key is not known by any other names. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes « digite yes por extenso Warning: Permanently added '192.168.0.50' (ED25519) to the list of known hosts. ana@192.168.0.50's password: « a senha da ana NO SERVIDOR Welcome to Ubuntu 26.04.1 LTS (GNU/Linux 7.0.0-38-generic x86_64) … Last login: Wed Oct 14 18:02:11 2026 from 192.168.0.15
Depois do login, o prompt muda para ana@servidor:~$. Tudo que você digitar agora roda no servidor:
$ hostname servidor $ exit logout Connection to 192.168.0.50 closed. « de volta ao notebook
O que é o fingerprint?
Cada servidor SSH tem uma chave própria, e o fingerprint é um resumo dela, como uma impressão digital. Na primeira conexão, o cliente não tem como saber se está falando com o servidor certo, então pergunta. Ao responder yes, o fingerprint fica guardado em ~/.ssh/known_hosts. Nas próximas vezes, o cliente compara: se mudar, ele bloqueia a conexão e avisa (veja "Quando não funciona").
No próprio servidor, rode ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub e compare com o que apareceu na pergunta. Em rede de casa isso é exagero; em servidores na internet é uma boa prática.
O que o ssh devolve
O ssh devolve o código de saída do último comando que rodou no servidor, ou 255 se a própria conexão falhou. Isso permite usá-lo em scripts.
Login por chave, passo a passo
Digitar senha toda vez é chato e menos seguro: senhas podem ser adivinhadas. Com chaves, você gera um par de arquivos no notebook:
- Chave privada (
id_ed25519): fica só com você, como a chave de casa. Nunca envie a ninguém. - Chave pública (
id_ed25519.pub): vai para os servidores, como uma fechadura que só a sua chave abre.
-
Gere o par de chaves no notebook.
- ssh-keygen
- O gerador de chaves (key generator).
- -t ed25519
- O tipo de chave.
ed25519é moderno, curto e seguro. - -C "ana@notebook"
- Um comentário para você reconhecer a chave depois.
$ ssh-keygen -t ed25519 -C "ana@notebook" Generating public/private ed25519 key pair. Enter file in which to save the key (/home/ana/.ssh/id_ed25519): « Enter: aceita o local padrão Enter passphrase for "/home/ana/.ssh/id_ed25519" (empty for no passphrase): « uma senha para a própria chave Enter same passphrase again: Your identification has been saved in /home/ana/.ssh/id_ed25519 Your public key has been saved in /home/ana/.ssh/id_ed25519.pub The key fingerprint is: SHA256:340Q2bS3q4f7lphkel3CsHIQWTSxonOlsBO63qO9i+U ana@notebook The key's randomart image is: …
A passphrase protege a chave privada caso alguém copie o arquivo. É opcional, mas recomendada. Com ela, o Ubuntu Desktop guarda a senha no chaveiro e só pergunta uma vez por sessão.
-
Confira os arquivos criados.
$ ls -l ~/.ssh total 12 -rw------- 1 ana ana 411 Oct 15 10:20 id_ed25519 « privada: só a ana lê (600) -rw-r--r-- 1 ana ana 94 Oct 15 10:20 id_ed25519.pub « pública: pode ser lida -rw-r--r-- 1 ana ana 142 Oct 15 10:05 known_hosts « servidores conhecidos $ cat ~/.ssh/id_ed25519.pub ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICj2vrEjdlmZi0bfdTh/Kentfu4XhboCrcKe4h+fmwSu ana@notebook
-
Copie a chave pública para o servidor com o
ssh-copy-id. Ele pede a senha uma última vez e coloca a chave no arquivo~/.ssh/authorized_keysdo servidor:$ ssh-copy-id ana@192.168.0.50 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/ana/.ssh/id_ed25519.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys ana@192.168.0.50's password: Number of key(s) added: 1 « deu certo Now try logging into the machine, with: "ssh 'ana@192.168.0.50'" and check to make sure that only the key(s) you wanted were added.
-
Teste. Agora o servidor não pede mais a senha do usuário (só a passphrase da chave, se você criou uma):
$ ssh ana@192.168.0.50 Welcome to Ubuntu 26.04.1 LTS (GNU/Linux 7.0.0-38-generic x86_64) …
Outra forma de copiar a chave
Se o ssh-copy-id não estiver disponível (por exemplo, vindo do Windows), dá para fazer o mesmo com um pipe: o conteúdo da chave vai pela conexão e é acrescentado ao authorized_keys:
$ cat ~/.ssh/id_ed25519.pub | ssh ana@192.168.0.50 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
Uma terceira opção é colar a linha do .pub no arquivo ~/.ssh/authorized_keys do servidor com o nano. O >> (e não >) é importante: ele acrescenta, sem apagar as chaves que já estavam lá.
O servidor SSH recusa as chaves se as pastas estiverem abertas demais. No servidor, ~/.ssh deve ser 700 e authorized_keys deve ser 600. No cliente, a chave privada deve ser 600. Veja chmod.
Apelidos: ~/.ssh/config
Em vez de lembrar usuário, IP e porta, crie apelidos no arquivo ~/.ssh/config do notebook:
Host servidor
HostName 192.168.0.50
User ana
Host vps
HostName 203.0.113.10
User deploy
Port 2222
IdentityFile ~/.ssh/id_ed25519_vps
| Chave | Significado |
|---|---|
Host | O apelido que você vai digitar. |
HostName | O IP ou nome real. |
User | O usuário no servidor. |
Port | A porta, se não for a 22. |
IdentityFile | Qual chave usar, se você tiver mais de uma. |
$ ssh servidor « o mesmo que ssh ana@192.168.0.50 $ ssh vps « o mesmo que ssh -p 2222 -i ~/.ssh/id_ed25519_vps deploy@203.0.113.10
Os apelidos valem também para scp e rsync (veja scp e rsync).
Formas diferentes de usar o ssh
Rodar um comando só, sem abrir sessão
Coloque o comando depois do endereço. O ssh conecta, roda, mostra o resultado e fecha:
$ ssh servidor uptime 10:35:12 up 3 days, 4:21, 1 user, load average: 0,08, 0,05, 0,01 $ ssh servidor "df -h /" Sist. Arq. Tam. Usado Disp. Uso% Montado em /dev/sda2 98G 21G 72G 23% /
Use aspas quando o comando tiver espaços, pipes ou opções, para que eles sejam interpretados no servidor.
Opções do dia a dia
| Opção | Faz | Exemplo |
|---|---|---|
-p PORTA | Usa outra porta | ssh -p 2222 ana@servidor |
-i CHAVE | Usa uma chave específica | ssh -i ~/.ssh/id_vps deploy@vps |
-v | Mostra cada etapa da conexão; ótimo para depurar (-vvv mostra ainda mais) | ssh -v servidor |
-t | Força um terminal, para comandos interativos | ssh -t servidor htop |
-L | Túnel: traz uma porta do servidor para o seu computador | ssh -L 8080:localhost:80 servidor |
-J | Passa por uma máquina intermediária (jump) | ssh -J portaria ana@interno |
Túnel: acessar uma porta do servidor como se fosse local
Imagine um painel web que roda no servidor na porta 80, mas que só aceita conexões do próprio servidor. Com -L, você cria um túnel:
- ssh
- O cliente.
- -L
- Cria um túnel local.
- 8080
- A porta que vai abrir no seu notebook.
- :localhost:80
- Para onde levar, visto a partir do servidor: a porta 80 dele mesmo.
- servidor
- Por qual máquina o túnel passa.
Enquanto a sessão estiver aberta, abrir http://localhost:8080 no navegador do notebook mostra o painel do servidor, tudo criptografado.
ssh-agent: digitar a passphrase uma vez só
No Ubuntu Desktop, o chaveiro do GNOME já faz isso sozinho. Num servidor ou num TTY, o ssh-agent guarda a chave destravada na memória:
$ eval "$(ssh-agent -s)" Agent pid 4821 $ ssh-add Enter passphrase for /home/ana/.ssh/id_ed25519: Identity added: /home/ana/.ssh/id_ed25519 (ana@notebook)
Quando não funciona
$ ssh ana@192.168.0.50 ssh: connect to host 192.168.0.50 port 22: Connection refused
O que aconteceu: a máquina existe e respondeu, mas ninguém está escutando na porta 22: o servidor SSH não está instalado, está parado ou usa outra porta.
Como confirmar: no servidor, rode systemctl status ssh e sudo ss -tlpn | grep ssh.
Como resolver: instale (sudo apt install openssh-server) ou informe a porta certa com -p.
$ ssh ana@192.168.0.50 ssh: connect to host 192.168.0.50 port 22: Connection timed out
O que aconteceu: nenhuma resposta chegou. A máquina está desligada, o IP está errado, ou um firewall está descartando os pacotes em silêncio.
Como confirmar: ping -c 3 192.168.0.50 e nc -zv 192.168.0.50 22. No servidor, sudo ufw status mostra se a porta 22 está liberada.
$ ssh ana@servidro ssh: Could not resolve hostname servidro: Name or service not known
O que aconteceu: o nome não existe no DNS, no /etc/hosts nem no ~/.ssh/config. Aqui foi erro de digitação. O ssh mostra essa mensagem em inglês.
$ ssh ana@192.168.0.50 ana@192.168.0.50: Permission denied (publickey).
O que aconteceu: o servidor só aceita chaves (a senha foi desligada), e nenhuma das suas chaves está no authorized_keys dele. Também acontece com o usuário errado: root em vez de ana, por exemplo.
Como confirmar: rode ssh -v ana@192.168.0.50 e procure as linhas Offering public key, que mostram quais chaves foram tentadas. No servidor, confira as permissões: ls -ld ~/.ssh (700) e ls -l ~/.ssh/authorized_keys (600).
Como resolver: use a chave certa (-i), confira o usuário, ou peça a quem tem acesso para colocar a sua chave pública no servidor.
$ ssh ana@192.168.0.50 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. … Offending ED25519 key in /home/ana/.ssh/known_hosts:3 « a linha 3 guarda o fingerprint antigo Host key verification failed.
O que aconteceu: o fingerprint guardado não bate com o atual. Na maioria das vezes é inofensivo: você reinstalou o servidor, ou o IP passou a ser de outra máquina. Mas pode ser alguém se passando pelo servidor.
Como resolver: se você sabe por que mudou, apague o registro antigo e conecte de novo, respondendo yes:
$ ssh-keygen -R 192.168.0.50 # Host 192.168.0.50 found: line 3 /home/ana/.ssh/known_hosts updated. Original contents retained as /home/ana/.ssh/known_hosts.old
Se você não sabe por que mudou, não conecte e confira com quem administra o servidor.
O que aconteceu: quase sempre são permissões no servidor (a home, o ~/.ssh ou o authorized_keys com escrita para outros), ou a chave foi copiada para outro usuário.
Como resolver: no servidor, rode chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys e veja o motivo no log: sudo journalctl -u ssh -n 20 (veja Logs (journalctl)).
Referência
| Comando | Faz |
|---|---|
ssh usuario@host | Abre uma sessão remota |
ssh host comando | Roda um comando e volta |
ssh-keygen -t ed25519 -C "texto" | Gera um par de chaves |
ssh-copy-id usuario@host | Instala a chave pública no servidor |
ssh-keygen -R host | Apaga um servidor do known_hosts |
ssh-keygen -lf arquivo.pub | Mostra o fingerprint de uma chave |
ssh-add | Carrega a chave no agente |
sudo apt install openssh-server | Instala o servidor |
systemctl status ssh | Estado do servidor SSH |
| Arquivo | Onde | Para quê |
|---|---|---|
~/.ssh/id_ed25519 | Cliente | Chave privada (600, nunca compartilhe) |
~/.ssh/id_ed25519.pub | Cliente | Chave pública |
~/.ssh/known_hosts | Cliente | Fingerprints dos servidores conhecidos |
~/.ssh/config | Cliente | Apelidos e opções |
~/.ssh/authorized_keys | Servidor | Chaves públicas autorizadas a entrar (600) |
/etc/ssh/sshd_config.d/*.conf | Servidor | Configuração do servidor (veja Segurança do Servidor) |
Exercícios
1. Conectar em outra porta
Complete para conectar como ana no 192.168.0.50, que usa a porta 2222:
2. Gerar a chave
Complete para gerar uma chave do tipo ed25519:
3. Instalar a chave no servidor
Complete com o comando que copia a sua chave pública para o servidor:
4. ssh: connect to host … port 22: Connection refused significa que…
5. Qual arquivo você nunca deve enviar a ninguém?
Resumo
- Cliente
sshjá vem instalado; o servidor é o pacoteopenssh-server. - Na primeira conexão, o fingerprint é guardado no
known_hosts; se mudar, o SSH bloqueia e avisa. - Chaves:
ssh-keygen -t ed25519→ssh-copy-id usuario@host→ entrar sem senha. ~/.ssh/configcria apelidos;ssh host comandoroda um comando remoto.- Refused = nada escutando; timed out = sem resposta ou firewall; Permission denied (publickey) = chave ou usuário errados.