Pular para o conteúdo

Como eu passo senha e chave SSH pro Claude Code sem colar no chat

Um cofre no meu computador e um script no meio do caminho: o agente entra no servidor, roda o comando e nunca vê a senha. Com o passo a passo pra montar e o que fazer quando ela escapa mesmo assim.

Jefferson Oliveira · autor

AI Engineer · Studio Visual (abre em nova aba)

Publicado em

11 min de leitura

Escrito e revisado por Jefferson Oliveira. Os scripts são versões enxutas: adapte nomes e caminhos ao seu ambiente.

Uma hora o agente precisa entrar num servidor. Ver o disco, rodar um wp plugin list, ler um log. O caminho mais curto é colar a senha no chat, e ele funciona. Esse é o problema.

Eu queria o contrário: pedir “entra no servidor-x e vê o disco” e o Claude Code resolver sozinho, sem a senha passar pela conversa. Deu pra montar com um app no meu computador e um script de vinte linhas.

O que acontece com a senha colada no chat

Tudo o que aparece na conversa vai pro modelo: o que você cola e o que um comando imprime. Um cat .env rodado pelo agente põe o segredo no contexto do mesmo jeito.

Daí em diante ela escapa de quatro jeitos. Fica guardada: sai da sua máquina com a conversa, sujeita à retenção do seu plano, e fica em texto puro em ~/.claude/projects, ao alcance de backup e de qualquer programa que leia a sua home. Se repete: o agente pode usar o valor num script, num arquivo de configuração, num commit ou num PR. Vaza por injeção de prompt: uma página ou issue maliciosa pode pedir pro agente mandar o contexto pra fora. E volta: o claude –resume recarrega a sessão inteira, senha incluída.

A ideia: usar sem ver

O ssh-agent faz isso há décadas: a chave fica carregada nele, o ssh pede a assinatura e a chave nunca passa por quem roda o comando. A ideia é levar isso pra qualquer credencial. O segredo fica num cofre, um script busca e entrega direto pro processo, e o Claude recebe só a saída.

Escolhi o KeePassXC porque é gratuito, open source (GPL) e o cofre é um arquivo .kdbx criptografado no meu disco, sem servidor de terceiro e sem conta pra criar. 1Password e Doppler são pagos e fechados. O Bitwarden tem MCP oficial, mas depende de um servidor, o deles ou um Vaultwarden que eu teria que manter.

E o KeePassXC já traz as duas peças que o fluxo precisa. O SSH agent carrega as chaves quando o cofre destrava e tira quando trava. O Secret Service deixa o secret-tool buscar uma senha pelo D-Bus sem pedir a senha mestra de novo.

Jefferson Oliveira // o detalhe que eu gosto

Travar o KeePassXC vira um interruptor. Cofre travado, o agente perde acesso a tudo na hora, sem mexer em configuração nenhuma.

Passo a passo

Os comandos são do Pop!_OS, que é baseado no Ubuntu. Os menus estão com os nomes em inglês do KeePassXC.

1. Instale o básico. O secret-tool vem no pacote libsecret-tools; o sshpass só serve pra servidor com senha.

terminal
$ sudo apt install keepassxc libsecret-tools sshpass

2. Crie o cofre e um grupo só pro agente. Em Database › New Database, com uma frase-senha (seção 04). Crie um grupo, tipo Agente: só ele vai ficar visível pro sistema.

3. Ligue o Secret Service. Em Tools › Settings › Secret Service Integration, ative a integração. Ali também dá pra exigir confirmação a cada senha buscada. Depois, em Database › Database Settings › Secret Service Integration, exponha só o grupo Agente.

4. Tire o gnome-keyring da frente. No Linux, só um programa responde pelo Secret Service, e no Pop!_OS é o gnome-keyring, onde o Chrome guarda a chave das senhas salvas e dos cookies. Desligue só a parte de segredos dele:

~/.config/systemd/user/gnome-keyring-daemon.service.d/override.conf
[Service]ExecStart=ExecStart=/usr/bin/gnome-keyring-daemon --foreground \  --components=pkcs11 --control-directory=%t/keyring

E faça o D-Bus abrir o KeePassXC quando algum app procurar o Secret Service:

~/.local/share/dbus-1/services/org.freedesktop.secrets.service
[D-BUS Service]Name=org.freedesktop.secretsExec=/usr/bin/keepassxc

Recarregue, saia da sessão, entre de novo e confira quem responde:

terminal
$ systemctl --user daemon-reload# depois de sair e entrar na sessão$ busctl --user status org.freedesktop.secrets | grep CommComm=keepassxc

Antes, ligue a sincronização da Conta Google e conte com refazer o login em alguns sites. Pra voltar atrás, apague o override e reinicie a sessão.

5. Ligue o SSH agent, se você usa chave. Em Tools › Settings › SSH Agent, ative a integração. Na entrada do servidor, anexe a chave privada em Advanced › Attachments e, na aba SSH Agent, marque pra adicionar a chave quando o cofre destravar e remover quando travar. Confira com ssh-add -l.

6. Cadastre os servidores. Uma entrada por servidor no grupo Agente: o título é o nome que você usa na conversa, usuário e senha vão nos campos de sempre e o host no campo URL. Servidor com chave fica com a senha em branco.

7. Instale os scripts em ~/.local/bin, que o Pop!_OS já põe no PATH, e dê permissão com chmod +x ~/.local/bin/cofre-*. O cofre-lista imprime só o título de cada entrada, sem pedir segredo. É assim que o Claude sabe o que existe:

~/.local/bin/cofre-lista
#!/usr/bin/env bash# cofre-lista: só os títulos, nenhum segredoset -euo pipefailsvc=org.freedesktop.secretscol=/org/freedesktop/secrets/aliases/defaultiface=org.freedesktop.Secretitens=$(busctl --user get-property "$svc" "$col" \  "$iface.Collection" Items | cut -d" " -f3- | tr -d '"')for item in $itens; do  busctl --user get-property "$svc" "$item" \    "$iface.Item" Label | cut -d" " -f2- | tr -d '"'done

O cofre-ssh busca a entrada e conecta:

~/.local/bin/cofre-ssh
#!/usr/bin/env bash# cofre-ssh <entrada> "<comando>"set -euo pipefailentrada="$1"; shiftattr() {  # atributos saem no stderr; o stdout traz o segredo  secret-tool search Title "$entrada" 2>&1 >/dev/null \    | sed -n "s/^attribute\.$1 = //p" | head -n1}host=$(attr URL)user=$(attr UserName)senha=$(secret-tool lookup Title "$entrada" || true)opts=(-o StrictHostKeyChecking=accept-new)# sem senha: chave SSH, o agent do KeePassXC assinaif [[ -z "$senha" ]]; then  exec ssh "${opts[@]}" "$user@$host" "$@"fi# com senha: vai pelo ambiente, nunca no argumentoexport SSHPASS="$senha"exec sshpass -e ssh "${opts[@]}" "$user@$host" "$@"

A senha vai pela variável SSHPASS, que o sshpass -e lê do ambiente: não aparece nos argumentos do processo nem na tela. O accept-new grava a chave do servidor na primeira conexão; sem ele, a pergunta de confirmação trava o sshpass. Entrada sem senha vai direto pro ssh, e quem assina é o SSH agent do KeePassXC.

Jefferson Oliveira // onde eu errei

Na primeira versão eu lia os atributos do stdout, e o script dizia que a entrada não existia. O secret-tool manda os atributos pro stderr e o segredo pro stdout. Trocar pra 2>&1 >/dev/null resolveu e ainda deixou melhor: a senha nem passa pelo sed.

8. Feche o acesso direto. Com estas regras no ~/.claude/settings.json, o Claude não lê o cofre, o ~/.ssh nem .env, e não chama o secret-tool por conta própria. O script continua chamando por dentro.

~/.claude/settings.json
{  "permissions": {    "deny": [      "Read(**/*.kdbx)",      "Read(~/.ssh/**)",      "Read(**/.env*)",      "Bash(secret-tool:*)",      "Bash(keepassxc-cli:*)",      "Bash(printenv:*)"    ]  }}

9. Conte pro Claude que o cofre existe. Sem isso ele não sabe dos scripts e acaba pedindo a senha no chat. Vai no ~/.claude/CLAUDE.md, que vale pra todos os projetos:

~/.claude/CLAUDE.md
## Servidores- Acesso a servidor só pelo cofre.- `cofre-lista` mostra os nomes disponíveis.- `cofre-ssh <nome> "<comando>"` roda o comando no servidor.- Nunca peça senha nem chave no chat.

10. Teste. Num terminal comum, rode cofre-lista e cofre-ssh servidor-x “uptime”. Trave o cofre e rode de novo: sem destravar, não pode conectar. Depois peça pro Claude rodar secret-tool lookup Title servidor-x. A regra de deny tem que barrar.

Pronto. Eu peço “entra no servidor-x e vê o disco”, e o Claude roda:

terminal
$ cofre-listaservidor-xservidor-ysite-cliente$ cofre-ssh servidor-x "df -h"Filesystem      Size  Used Avail Use% Mounted on/dev/sda1        80G   41G   36G  54% /

Existe servidor MCP pra KeePassXC também. Preferi os scripts: são poucas linhas que eu leio inteiras, e eles não entregam o valor pro modelo.

Onde guardar a senha do cofre

O cofre cria uma senha nova, a mestra, e não existe “esqueci minha senha”: o KeePassXC criptografa o arquivo com ela e não guarda cópia.

Jefferson Oliveira // onde eu errei

No primeiro teste eu criei o cofre, cadastrei uma entrada, travei pra testar o interruptor e não lembrei mais a senha. Era só teste, então apaguei e criei outro. Com as senhas de verdade lá dentro, não teria volta.

Use uma frase-senha. O gerador do KeePassXC tem uma aba que sorteia palavras de uma lista de 7.776: seis palavras dão cerca de 77 bits de entropia, contra uns 52 de oito caracteres aleatórios. É mais forte e mais fácil de lembrar, desde que seja sorteada. Frase inventada, citação ou letra de música não vale. Com o cofre travando sozinho depois de alguns minutos parado, você digita a frase várias vezes por dia e ela fica.

Guarde uma cópia fora da cabeça e fora do computador. Papel em casa, junto com os documentos, é a opção mais subestimada: ninguém invade um envelope pela internet. Faça duas, em lugares diferentes. Também serve o gerenciador de senhas do celular, se a conta tiver dois fatores. Nunca num arquivo no mesmo computador, num e-mail pra você mesmo, no chat ou dentro do próprio cofre.

O .kdbx pode ir pra nuvem: sem a senha mestra, não serve pra nada. Ligue o backup antes de salvar no KeePassXC e mande uma cópia pro Drive de vez em quando. Por último, feche o KeePassXC e abra o cofre usando só a cópia guardada. Se não abrir, melhor descobrir agora.

Além do SSH

No WordPress, o WP-CLI faz quase tudo que o painel faz, então cofre-ssh servidor-x “wp plugin list” resolve sem senha de admin. Pra API REST, a Application Password fica no cofre e um cofre-curl monta a autenticação. Pra mysql, lftp ou docker login, o cofre-run põe usuário e senha em variável de ambiente só pra aquele comando:

~/.local/bin/cofre-run
#!/usr/bin/env bash# cofre-run <entrada> <comando...>set -euo pipefailentrada="$1"; shiftuser=$(secret-tool search Title "$entrada" 2>&1 >/dev/null \  | sed -n "s/^attribute\.UserName = //p" | head -n1)senha=$(secret-tool lookup Title "$entrada")# as variáveis só existem no ambiente desse comandoCOFRE_USER="$user" COFRE_PASS="$senha" exec "$@"

Painel web é o único caso em que o login fica comigo. Se o Claude digitar a senha num formulário, o valor está no contexto. Então eu entro pelo navegador, com a extensão do KeePassXC preenchendo, e o Claude in Chrome usa a sessão aberta. Se a tarefa só funciona com o agente digitando a senha, quem digita sou eu.

Onde isso não protege

Isso é boa prática, não blindagem. No cofre-run, um echo $COFRE_PASS mostra a senha. E regra de deny bloqueia o comando que ela nomeia: o mesmo arquivo pode ser lido de outro jeito.

A saída também vaza. Um cat wp-config.php no servidor põe a senha do banco na conversa, com cofre ou sem cofre.

Então eu reduzo o estrago pra quando algo escapar. Cofre separado, só com o que o agente pode usar. Usuário próprio pro agente nos servidores e no WordPress, sem admin onde não precisa. Senha fácil de trocar. Garantia de verdade, só com o agente rodando isolado, em container ou sandbox.

Vazou: o que fazer

Se a senha apareceu na conversa, trate como vazada. A ordem importa: primeiro a senha para de funcionar, depois você procura onde ela foi parar.

1. Troque. Senha nova no servidor e no WordPress, chave SSH nova com a antiga fora do authorized_keys, token de API revogado, Application Password apagada.

2. Derrube as sessões. No WordPress, o perfil tem “Sair de todas as outras sessões”. Em API, revogar o token já encerra o acesso.

3. Procure as cópias, num terminal fora do Claude, pra não devolver o valor pra conversa:

terminal, fora do Claude
# digita a senha antiga sem aparecer na tela$ read -rs S# arquivos que contêm o valor, só os nomes$ grep -rlF -- "$S" ~/.claude/projects .# commits que adicionaram ou removeram o valor$ git log --all -S "$S" --oneline$ unset S

Achou, limpe: apague a sessão em ~/.claude/projects e tire o valor dos arquivos. Se ele chegou num commit já enviado, o git filter-repo reduz a exposição, mas quem clonou antes continua com a cópia. Por isso a troca vem primeiro.

4. Confira se alguém usou: last e /var/log/auth.log no servidor, o log de login do WordPress se tiver plugin de auditoria, o painel de uso da API. E a senha nova vai pro cofre, não pro chat.

Jefferson Oliveira // a ordem importa

Apagar a conversa sem trocar a senha só dá a sensação de que resolveu.

Perguntas frequentes

Por que não um servidor MCP de senhas?

Dá pra usar. Mas um MCP que devolve a senha pro modelo põe o segredo no contexto do mesmo jeito que colar. Ele compensa quando injeta o segredo sem mostrar o valor, ou quando a ideia é o agente organizar o cofre.

Funciona no macOS ou no Windows?

Funciona. O KeePassXC roda nos dois, só muda a integração: o Secret Service é do Linux, então os scripts usam o keepassxc-cli no lugar do secret-tool.

O Claude lembra da senha em outra conversa?

Conversa nova começa sem ela. Mas a sessão antiga continua gravada e volta inteira com claude –resume, e o agente pode ter escrito o valor num arquivo. Por isso trocar a senha não é opcional.

Referências

  1. [1] Claude Code Docs: Settings e permissões (abre em nova aba) code.claude.com/docs/en/settings
  2. [2] DEV Community: Stop Claude Code reading your .env with a Read deny rule (abre em nova aba) dev.to/aicoding-guide/stop-claude-code-reading-your-env-with-a-read-deny-rule-5f16
  3. [3] Developers Digest: How to Keep API Keys Away From Your AI Coding Agent (abre em nova aba) developersdigest.tech/blog/keep-secrets-away-from-ai-coding-agents-2026
  4. [4] KeePassXC (abre em nova aba) keepassxc.org
  5. [5] keepassxc-mcp (abre em nova aba) glama.ai/mcp/servers/preginald/keepassxc-mcp
  6. [6] Bitwarden MCP server (abre em nova aba) github.com/bitwarden/mcp-server
  7. [7] 1Password Developer: Secret references (abre em nova aba) 1password.dev/cli/secret-references
  8. [8] GitHub Docs: Removing sensitive data from a repository (abre em nova aba) docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository

Fontes conferidas em nov 2026.

  • IA
  • Segurança
  • Claude Code

Compartilhar:

LinkedIn (abre em nova aba) X (abre em nova aba)

// quem escreveu

Jefferson Oliveira

AI Engineer · Studio Visual (abre em nova aba) · São Paulo, SP

Trabalho há mais de 5 anos com PHP, Laravel e WordPress, construindo e-commerces, integrações e sistemas internos. Hoje lidero a adoção de IA na Studio Visual (abre em nova aba) e curso MBA em Engenharia de Software na FIAP.

  • MBA em Engenharia de Software · FIAP (cursando)
  • Análise e Desenvolvimento de Sistemas · FATEC Zona Leste
  • Liderança e Gestão de Equipes · FGV
  • PHP: Desenvolvimento Web e POO · 4Linux

Conheça minha trajetória LinkedIn (abre em nova aba) GitHub (abre em nova aba)

Contato

Quer trocar uma ideia? Bora conversar.

Gosto de conversar sobre IA aplicada, PHP e arquitetura de software, seja para trocar experiência, falar de um projeto ou de uma proposta.

joliveiracode@gmail.com

// download iniciado

Currículo a caminho.

O PDF está baixando. Se quiser trocar uma ideia sobre IA aplicada, PHP ou arquitetura, é só chamar.