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.
Preparando o cofre
No Pop!_OS (base Ubuntu), são quatro ajustes depois de instalar:
$ 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:
#!/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.
Falta fechar o acesso direto. O Claude não lê o cofre nem chama o secret-tool; o script continua chamando por dentro:
{ "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:
## 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:
$ 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:
# 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?
Funciona no macOS ou no Windows?
O Claude lembra da senha em outra conversa?
Referências
- [1] Claude Code Docs: Settings e permissões (abre em nova aba) code.claude.com/docs/en/settings
- [2] KeePassXC (abre em nova aba) keepassxc.org
- [3] keepassxc-mcp (abre em nova aba) glama.ai/mcp/servers/preginald/keepassxc-mcp
- [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.