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

5 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 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.

Por que não colar a senha

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í ela fica em texto puro em ~/.claude/projects, pode parar num commit, sair por injeção de prompt e volta inteira com claude –resume.

Usar sem ver

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

Escolhi o KeePassXC: gratuito, open source (GPL) e o cofre é um arquivo .kdbx no meu disco, sem servidor de terceiro. Ele já traz um SSH agent e o Secret Service, que deixa o secret-tool buscar uma senha 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.

Preparando o cofre

No Pop!_OS (base Ubuntu), são quatro ajustes depois de instalar:

terminal
$ sudo apt install keepassxc libsecret-tools sshpass

1. Crie o cofre e um grupo só pro agente. Cada servidor vira uma entrada: o título é o nome que você usa na conversa, o host vai no campo URL.

2. Ative o Secret Service em Tools › Settings e exponha só esse grupo.

3. Tire o gnome-keyring da frente: só um programa responde pelo Secret Service, e no Pop!_OS é ele. Um override no systemd desliga a parte de segredos dele e o D-Bus passa a abrir o KeePassXC. Ele guarda a chave das senhas salvas do Chrome, então sincronize a Conta Google antes.

4. Se usa chave, ative o SSH Agent e anexe a chave na entrada, com a senha em branco.

O script no meio do caminho

O cofre-ssh, em ~/.local/bin, 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 e não aparece nos argumentos do processo. Um irmão dele, o cofre-lista, imprime só os títulos das entradas: é assim que o Claude sabe o que existe.

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.

Falta fechar o acesso direto. O Claude não lê o cofre nem chama o secret-tool; 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:*)"    ]  }}

E contar pro Claude que o cofre existe. Sem isso, ele acaba pedindo a senha no chat:

~/.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.

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% /

Com o WP-CLI, cofre-ssh servidor-x “wp plugin list” resolve o WordPress sem senha de admin. Painel web é o único caso em que o login fica comigo: eu entro pelo navegador e o Claude in Chrome usa a sessão aberta.

Onde isso não protege

Isso é boa prática, não blindagem. Regra de deny bloqueia o comando que ela nomeia, e o mesmo arquivo pode ser lido de outro jeito. E 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: cofre só com o que o agente pode usar, usuário próprio pra ele, sem admin onde não precisa. Garantia de verdade, só com o agente isolado em container ou sandbox.

Se vazar mesmo assim

Senha que apareceu na conversa está vazada. Primeiro ela para de funcionar: troque a senha, tire a chave antiga do authorized_keys, revogue o token e derrube as sessões. Depois procure as cópias, num terminal fora do Claude:

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, apague a sessão e tire o valor dos arquivos. Commit já enviado o git filter-repo limpa, mas quem clonou antes continua com a cópia. Por isso a troca vem primeiro.

Perguntas frequentes

Por que não um servidor MCP de senhas?

Dá pra usar, mas se ele devolve a senha pro modelo, é igual colar: o README do keepassxc-mcp avisa que o agente vê toda senha que busca.

Funciona no macOS ou no Windows?

Funciona. O KeePassXC roda nos dois; sem Secret Service, 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 antiga volta inteira com claude –resume. 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] KeePassXC (abre em nova aba) keepassxc.org
  3. [3] keepassxc-mcp (abre em nova aba) glama.ai/mcp/servers/preginald/keepassxc-mcp
  4. [4] 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.