passformepfm

Guia de comandos

Command guide

Todos os comandos do seu gerenciador de senhas, do uso diário à emergência. O nome de um item pode ser só um pedaço do título: pfm get conta acha contabo.com.

Começar

Uma vez por notebook. O cofre fica em ~/.local/share/passforme, cifrado.

pfm init criar o cofre

Pede a frase mestra (pelo menos 12 caracteres) e mostra o Emergency Kit: a Secret Key, que começa com SB1-. Uma frase de palavras é mais fácil de lembrar que uma senha aleatória, e o gerador sugere uma.

pfm generate --words 7 --lang pt-br # sugestão de frase mestra
pfm init

Anote a frase mestra e a Secret Key em papel e guarde longe do notebook. Sem as duas não há recuperação: o cofre é cifrado no seu aparelho, e ninguém mais tem a chave.

pfm register URL ligar a um servidor (opcional)

Sem servidor, o pfm funciona só neste notebook. Com um passforme-server seu, o cofre sincroniza entre aparelhos, e o servidor só guarda o cofre cifrado. O registro pede um convite de uso único, gerado no servidor.

pfm register https://pfm.example.com

Uso diário

Copiar, consultar e ver. Tudo o que vai para o clipboard se apaga sozinho em 30 segundos.

Tab completa comandos, opções e tipos

Toda opção tem um nome só, por extenso: --username, --generate, --symbols. Para não digitar tudo, use Tab: pfm add x --us + Tab vira --username, e --kind + Tab lista os tipos. Uma forma curta antiga, como -u, responde com o nome novo.

Para ligar, acrescente esta linha ao seu ~/.bashrc:

source <(passforme completions bash)

Também há scripts para zsh, fish, elvish e powershell:

passforme completions zsh > ~/.zfunc/_passforme # zsh

pfm get NOME copiar uma senha

Copia o segredo principal do item: a senha de um login, o número de um cartão, o PIN de um PIN.

OpçãoO que faz
--field usernamecopia o usuário
--field urlcopia o endereço
--field totpcopia o código 2FA de agora
--field cvv, --field pin, --field number…copia um campo pelo nome; um nome errado lista os que existem
--attachment NOMEsalva um anexo no diretório atual, ou onde --output mandar; nunca sobrescreve
pfm get contabo
pfm get contabo --field username # copia o usuário
pfm get contabo --field url # copia o endereço
pfm get github --field totp # copia o código 2FA de agora
pfm get nubank --field cvv
pfm get proton-recovery --attachment proton-recovery.txt --output ~/Desktop # salva o anexo numa pasta

pfm list ver todos os itens

Tabela com título, tipo, usuário, URL e o que mais cada item guarda: campos extras, 2FA, quantos códigos de recuperação restam, quantos arquivos anexados, e se programas podem ler o item. Nunca mostra senhas.

pfm list
pfm list | grep -i kimi # filtrar

pfm show NOME ver um item inteiro

Todos os campos, com os segredos como ********. Com --reveal, mostra os segredos na tela. Os anexos aparecem como Attachment: nome (tamanho): é ali que você vê o nome exato para o get --attachment.

pfm show nubank # segredos escondidos
pfm show nubank --reveal # segredos na tela

pfm totp NOME código 2FA

Mostra o código de 6 dígitos de agora e por quantos segundos ele vale. Para copiar: pfm get NOME --field totp. O segredo do 2FA entra com pfm edit NOME --totp.

pfm totp github # mostra o código
pfm get github --field totp # copia o código

pfm codes NOME código de recuperação

Copia o próximo código ainda não usado e o marca como usado. Avisa quando restam dois ou menos. Com --list, mostra todos e quais já foram usados (na tela, em texto puro). Para cadastrar os códigos, ver códigos de recuperação.

pfm codes openai # copia o próximo e marca como usado
pfm codes openai --list # todos, com (used) nos usados

Não há como desmarcar um código: rode pfm codes só na hora de usar. Marcar ao copiar é o lado seguro do erro: no pior caso sobra um código a menos, e nunca um já gasto volta para a lista. Se precisar refazer a lista, cole os códigos de novo com pfm edit NOME --codes.

Cadastrar

Uma senha nova gerada na hora, uma senha que já existe, ou várias de uma vez.

pfm add NOME cadastrar um item

Sem --generate, pede a senha duas vezes, para conferir. Use assim para guardar uma senha que você não quer trocar.

OpçãoO que faz
--username USUÁRIOusuário ou e-mail da conta
--url ENDEREÇOendereço do site; repita para vários
--generategera uma senha nova, salva e copia
--kind TIPOo tipo do item (ver Tipos); sem ele, é um login
--file ARQUIVOlê o segredo de um arquivo, como uma chave SSH
--agentdeixa programas (scripts, agentes de IA) lerem o item (ver Agente)

Com --generate valem as opções do gerador: --symbols, --length 16, --words 6… Sem --generate, elas dão erro, em vez de serem ignoradas.

pfm add contabo.com --username root --url https://contabo.com --generate # conta nova
pfm add roteador --username admin --url http://192.168.1.1 # senha que já existe
pfm add banco.com --generate --symbols # com símbolos
pfm add app.com --generate --length 16 # site que limita o tamanho

pfm add-many várias de uma vez

Pede label, senha, label, senha… até um Enter vazio. A frase mestra é pedida uma vez e cada item é salvo na hora: parar no meio não perde nada. A senha colada não aparece na tela. Bom para trazer senhas de outro gerenciador; depois complete cada item com pfm edit.

pfm add-many # Label: github.com, a senha, Label: … Enter vazio termina
pfm edit github.com --username voce@exemplo.com --url https://github.com # completar depois

Login sem senha código por SMS, entrar com Google

Para o site que entra pelo celular ou pela conta Google, cadastre sem --generate e, quando ele pedir o segredo, aperte Enter sem digitar nada: o item fica sem senha. Vale cadastrar mesmo assim, porque daqui a um ano o difícil é lembrar como você entrava.

  • --username: o número de celular ou o e-mail usado. No login pelo Google, o e-mail da conta Google, porque com várias contas é fácil esquecer qual foi.
  • Notas: o método ("login com Google", "código por SMS"). O add não tem opção de notas: acrescente com pfm edit NOME --notes e termine o texto com Ctrl-D numa linha vazia.
  • Códigos de recuperação: se o site tiver 2FA e oferecer códigos de backup, guarde-os num item próprio do tipo recovery-codes.
  • Se um dia o site passar a pedir senha, gere uma no item que já existe com pfm edit NOME --generate.
pfm add ifood.com.br --username "+55 51 9xxxx-xxxx" --url https://ifood.com.br # Enter vazio no segredo
pfm edit ifood --notes # escreva o método; Ctrl-D termina
pfm add "ifood codes" --kind recovery-codes # códigos de backup do 2FA
pfm edit ifood --generate # se passar a pedir senha

Tipos de item

pfm add NOME --kind TIPO pergunta os campos do tipo, um por vez; Enter pula o campo. pfm kinds lista os tipos no terminal. --username, --url e --file só valem nos tipos que têm esse campo, e --generate só em login, wifi e bank, cujo segredo é uma senha: um PIN, um cartão ou uma frase de cripto gerados não fariam sentido.

TipoPara quêget copia
login (padrão)site ou app: usuário, senha, URLs, 2FAa senha
notetexto livre—
recovery-codescódigos de backup; um por linha ao colar, linha vazia termina (exemplos)use pfm codes
recovery-phrasefrase de recuperação de uma conta (Proton…); confere o BIP-39 quando for umas palavras
security-questionsperguntas e respostas de segurança--field "a pergunta"
pincelular, alarme, cadeadoo PIN
api-keychave de API ou token: o nome dela no site, a validadea chave
crypto-seedfrase da carteira; confere o checksum do BIP-39as palavras
ssh-keychave SSH ou GPG, lida com --filea chave privada
cardtitular, número (confere o dígito), validade MM/AA, CVV, PINo número
bankagência, conta, senhas do app e de transação, chave Pixa senha do app
wifirede e senhaa senha
licensechave de licença de softwarea chave
documentCPF, RG, passaporte: número, datas, emissoro número
pfm add nubank --kind card
pfm add google-codes --kind recovery-codes
pfm add ledger --kind crypto-seed
pfm add ssh-github --kind ssh-key --file ~/.ssh/id_ed25519
pfm add "celular pin" --kind pin
pfm add "wifi casa" --kind wifi --generate # a senha da rede, gerada
pfm add itau --kind bank
pfm add cpf --kind document
pfm add "gov.br perguntas" --kind security-questions # pergunta → resposta, até uma pergunta vazia
pfm add "anotações servidor" --kind note # texto livre; Ctrl-D numa linha vazia termina
pfm add jetbrains --kind license
pfm kinds # lista os tipos e os campos de cada um

Frase de cripto e número de cartão são conferidos na hora. Se houver palavra trocada ou dígito errado, o pfm avisa e pergunta antes de salvar, enquanto o papel ainda está na sua mão.

pfm add NOME --kind api-key guardar uma chave de API

O add pergunta um campo por vez, nesta ordem, e Enter pula qualquer um. O Key name já é perguntado aqui: não precisa de --set-field. A conta e a URL também podem ir no comando, com --username e --url, e aí ele pergunta só o resto.

CampoO que vai nele
Accounta conta da qual a chave saiu, em geral o e-mail. É o username do item, com outro nome. Se a chave vazar, ele diz em qual conta revogá-la.
Key nameo nome que você deu à chave no site, como meu-notebook: com várias chaves na mesma conta, diz qual revogar
Keya chave, colada; não aparece na tela
URLo painel onde a chave foi criada
Expiresa validade; vazio se não expira

Com --agent, programas (scripts, agentes de IA) podem ler a chave (ver Agente). Use só se um programa vai ler a chave; para copiar e colar você mesmo, deixe sem, e ela nunca passa pelo agente. Na configuração deles, use o título inteiro: deepseek casaria também com o login deepseek.com.

pfm add "deepseek api key" --kind api-key # pergunta conta, Key name, chave, URL, validade
pfm add "deepseek api key" --kind api-key --username voce@exemplo.com --url https://platform.deepseek.com # conta e URL no comando
pfm add "deepseek api key" --kind api-key --agent # chave que um programa vai ler
pfm get "deepseek api key" # copia a chave
pfm get "deepseek api key" --field account # copia o e-mail da conta
pfm edit "deepseek api key" --password # trocar por uma chave nova
pfm edit "deepseek api key" --set-field "Key name" # mudar o nome depois, ou num item criado antes do campo existir
pfm get "deepseek api key" --field "key name" # copia só o nome

Várias chaves na mesma conta: um item por chave, com o nome dela também no título, como deepseek api key notebook e deepseek api key servidor. Assim o get, o list e a configuração dos programas diferenciam uma da outra só pelo título.

Um serviço, vários logins um item para cada login

Alguns serviços têm um login para o app e outro para a API, como o Kimi: o chat em kimi.ai entra pelo telefone, e a plataforma de API em platform.kimi.ai entra por e-mail ou Google. Cadastre um item para cada login, cada um com o seu username, e a chave num terceiro item.

Com vários itens começando por "kimi", pfm get kimi responde "matches several items" e lista os itens. Use o título exato, que sempre ganha, ou um pedaço que só um título tenha.

pfm add kimi.ai --username "+55 47 9xxxx-xxxx" --url https://kimi.ai # chat, código por SMS
pfm add platform.kimi.ai --username seu@email.com --url https://platform.kimi.ai # API, código por e-mail
pfm add "kimi api key" --kind api-key # a chave
pfm show kimi.ai # título exato

Várias contas no mesmo serviço um item por conta

Duas contas no Zoho, no Google ou na AWS são dois itens, cada um com o seu usuário e a sua senha. Ponha no título o que diferencia uma da outra (pessoal, trabalho, o domínio), para o get achar a certa.

pfm add "zoho.com pessoal" --username voce@exemplo.com --url https://www.zoho.com --generate
pfm add "zoho.com empresa" --username admin@empresa.com --url https://www.zoho.com --generate
pfm get "zoho.com empresa" # título exato
pfm get empresa # ou um pedaço que só ele tem

Um login, mais de um e-mail campos extras

Se é o mesmo login, com a mesma senha, e a conta tem outros e-mails (o de cadastro, um alias, o de recuperação), o --username fica com o que você digita para entrar, e os outros vão em campos extras. O nome do campo é livre: Alias, Signup email, Recovery email, o que fizer sentido para você.

Campos extras só existem no edit: cadastre primeiro, acrescente depois. Se o outro e-mail entra com outra senha, é outro login, e vira outro item.

pfm add "zoho.com empresa" --username voce@empresa.com --url https://www.zoho.com --generate # o e-mail com que você entra
pfm edit "zoho.com empresa" --set-field "Signup email" # pergunta o valor, visível
pfm get "zoho.com empresa" --field "signup email" # copia o campo
pfm edit "zoho.com empresa" --rm-field "Signup email" # remove o campo

pfm add NOME --kind recovery-codes códigos de recuperação e o arquivo

Os códigos de backup do 2FA (OpenAI, GitHub, Google…). O tipo pergunta a conta e a URL, que também podem vir no comando, e então os códigos: cole todos, um por linha, e termine com uma linha vazia. Código com espaço no meio vale. Não aparecem na tela.

Se o site deu um arquivo com os códigos, anexe-o com edit --attach, como cópia do original. Mesmo assim os códigos ficam no item, porque o pfm codes usa os do item.

pfm add "openai recovery codes" --kind recovery-codes --username voce@exemplo.com --url https://openai.com # cole, linha vazia termina
pfm edit "openai recovery codes" --attach ~/Downloads/openai-recovery-codes.txt # guarda o arquivo
pfm codes openai # na hora de usar: copia um
pfm codes openai --list # quais restam
pfm get "openai recovery codes" --attachment openai-recovery-codes.txt --output ~/Desktop # devolve o arquivo
pfm edit github --codes # códigos dentro de um login, ou trocar por um lote novo

Gerou códigos novos no site? pfm edit NOME --codes --attach ARQUIVO_NOVO troca os códigos e anexa o arquivo novo; --rm-attachment tira o antigo. Depois apague o arquivo de ~/Downloads.

pfm add NOME --kind recovery-phrase frase e arquivo de recuperação

Serviços como o Proton dão uma frase de recuperação (12 palavras) e às vezes um arquivo de recuperação. O tipo recovery-phrase pergunta a conta, a URL e as palavras. Se a frase tem o tamanho de uma frase BIP-39 (12, 15, 18, 21 ou 24 palavras), o pfm a confere: uma palavra trocada ou digitada errada aparece na hora. Frases de outro formato são guardadas como foram digitadas.

O arquivo vai como anexo, cifrado dentro do item, com edit --attach. Os anexos de um item somam no máximo 512 KiB: o cofre inteiro viaja a cada sincronização, então só cabem arquivos pequenos.

pfm add proton-recovery --kind recovery-phrase # conta, URL e as 12 palavras
pfm edit proton-recovery --attach ~/Downloads/proton-recovery.txt # guarda o arquivo no item
pfm get proton-recovery # copia as palavras
pfm get proton-recovery --attachment proton-recovery.txt --output ~/Downloads # devolve o arquivo
pfm edit proton-recovery --rm-attachment proton-recovery.txt # remove o anexo

O get --attachment nunca sobrescreve um arquivo e grava legível só por você. Depois de guardar o arquivo no pfm, apague a cópia de ~/Downloads.

Alterar e apagar

pfm edit NOME mudar um item

Muda só o que você pedir; a senha continua a mesma, a menos que use --generate ou --password.

OpçãoO que faz
--title NOVOrenomeia
--username USUÁRIOtroca o usuário
--url / --rm-urlacrescenta / remove um endereço
--passworddigita uma senha nova
--generategera uma senha nova e copia; só em itens login, wifi e bank
--totpcola o segredo do 2FA (texto ou link otpauth://)
--notesescreve notas; termina com Ctrl+D
--set-field NOMEcria ou troca um campo visível
--set-secret-field NOMEcria ou troca um campo oculto
--rm-field NOMEremove um campo
--codessubstitui os códigos de recuperação
--attach ARQUIVOguarda um arquivo pequeno no item; um de mesmo nome é substituído
--rm-attachment NOMEremove um anexo
--kind TIPOmuda o tipo, sem perder dados
--agent / --no-agentliga ou desliga o acesso de programas
pfm edit deepseek --url https://chat.deepseek.com --url https://deepseek.com # endereços num item que já existe; a senha fica
pfm edit contabo --generate # trocou a senha no site
pfm edit github --totp # ativou o 2FA
pfm edit alarme --kind pin
pfm edit contabo --title contabo.com # renomeia
pfm edit contabo --username novo@exemplo.com # troca o usuário
pfm edit deepseek --rm-url https://deepseek.com # remove um endereço
pfm edit roteador --password # digita a senha nova, duas vezes
pfm edit contabo --generate --symbols --length 20 # gera com as regras do site
pfm edit ifood --notes # notas; Ctrl-D numa linha vazia termina, vazio apaga
pfm edit nubank --set-secret-field "Senha do app" # campo oculto, digitado sem eco
pfm edit nubank --rm-field "Senha do app" # remove o campo
pfm edit "deepseek api key" --agent # programas podem ler; --no-agent desfaz

Anexos arquivos pequenos dentro de um item

Arquivo de recuperação, códigos em .txt, um PDF com as palavras: edit --attach guarda o arquivo dentro do item, e get --attachment devolve. Até 512 KiB somando os anexos de um item; um anexo com o mesmo nome substitui o anterior.

O anexo é cifrado sempre, junto com o resto do item: no cofre do notebook, no .bak, no servidor e no histórico dele, e na sincronização. Programas (o agente) nunca recebem anexos. Ele só fica em texto puro em dois lugares, os dois por ação sua: o arquivo original, até você apagar, e a cópia que o get --attachment grava (legível só por você, nunca sobrescreve nada). O servidor vê só o tamanho aproximado do item, nunca o conteúdo nem o nome do arquivo.

pfm edit proton-recovery --attach ~/Downloads/proton-recovery.pdf # anexa
pfm edit proton-recovery --attach a.txt --attach b.txt # vários de uma vez
pfm show proton-recovery # lista: Attachment: nome (tamanho)
pfm get proton-recovery --attachment proton-recovery.pdf # salva na pasta atual
pfm get proton-recovery --attachment proton-recovery.pdf --output ~/proton.pdf # salva com outro nome
pfm edit proton-recovery --rm-attachment proton-recovery.pdf # remove
rm ~/Downloads/proton-recovery.pdf # depois de anexar, apague o original

pfm rm NOME apagar um item

Pede para digitar o título de volta, para confirmar. Com o cofre sincronizado, o item some também dos outros aparelhos.

pfm rm roteador # digite o título para confirmar

Gerador

O padrão é o estilo Contabo: 29 letras e números, 173 bits. Nada que quebre num formulário, e um clique duplo seleciona tudo.

pfm generate só gerar, sem salvar

OpçãoO que faz
--symbolscom símbolos
--length Ntamanho, de 4 a 1024
--no-digits, --no-uppercase, --no-lowercasetira números, maiúsculas ou minúsculas
--avoid-ambiguoustira os caracteres que se confundem: l, 1, O, 0
--words Nfrase de N palavras em vez de caracteres
--lang pt-br, --lang enidioma das palavras; só com --words
--separator Xo que vai entre as palavras (padrão -); só com --words
--copycopia em vez de mostrar
pfm generate # Tguod41e8MFOYKBFPF30bSxnxeIkE
pfm generate --words 6 --lang pt-br # pedestre-vareta-enxuto-…
pfm generate --length 6 --no-lowercase --no-uppercase # PIN de 6 dígitos
pfm generate --symbols --length 20 # site que exige símbolo e limita a 20
pfm generate --avoid-ambiguous # para ler e digitar à mão
pfm generate --words 5 --separator " " # palavras separadas por espaço
pfm generate --copy # copia sem mostrar na tela

Nenhuma opção é ignorada: se uma não fizer sentido no comando, o pfm recusa antes de pedir qualquer coisa. Frase e caracteres não se misturam: --words não aceita --length, --symbols, --no-… nem --avoid-ambiguous. No add e no edit, todas as opções do gerador precisam de --generate.

Sessão e segurança

Sessão automática

Digitou a frase mestra uma vez, os próximos comandos não pedem de novo. Trava em 15 minutos sem uso, quando a tela bloqueia, quando o notebook suspende, ou com pfm lock. Só vale para comandos digitados no terminal.

Para mudar o tempo, crie ~/.config/passforme/config com uma linha:

session = 1h # ou 30m; "off" pede a frase sempre

pfm lock travar agora

Fecha a sessão e esvazia o agente. Bom antes de emprestar o notebook ou sair de perto.

pfm lock

pfm status ver o estado

Se a sessão está aberta e por quanto tempo, se o agente está ativo e com quais itens, e o servidor de sincronização. Não recebe nome de item.

pfm status

pfm passwd trocar a frase mestra

Recifra o cofre com uma chave nova. A Secret Key continua a mesma. Anote a frase nova no Emergency Kit. Com servidor, os outros aparelhos pedem a frase nova na próxima sincronização.

pfm passwd # frase atual, depois a nova duas vezes

Agente (programas)

Programas (scripts, agentes de IA) não usam a sessão. Eles só leem os itens que você marcar, e nada mais do cofre.

ComandoO que faz
pfm edit openrouter --agentmarca o item para programas
pfm unlockentrega os itens marcados ao agente por 8 horas
pfm unlock --for foreveraté travar, reiniciar ou sair da sessão
pfm unlock --for 2h geminisó os itens citados, pelo tempo dado
pfm get NOME --stdouto que o programa chama para ler o valor
pfm edit "deepseek api key" --agent # 1. marcar
pfm unlock --for 8h # 2. liberar, com a frase mestra
pfm get "deepseek api key" --stdout # 3. o que o programa roda
DEEPSEEK_API_KEY="$(pfm get 'deepseek api key' --stdout)" ./meu-script # num script
pfm status # o que o agente guarda e por quanto tempo
pfm lock # esvazia o agente agora

Sem agente liberado, o get --stdout fora de um terminal falha na hora, em vez de ficar esperando uma frase que ninguém vai digitar.

Sincronização

Acontece sozinha a cada add, edit, rm e codes. Se o servidor estiver fora do ar, a mudança fica no notebook e sobe na próxima vez. O servidor só guarda o cofre cifrado.

ComandoQuando usar
pfm syncforçar a troca com o servidor
pfm register URLligar o cofre a um servidor vazio
pfm initcriar um cofre novo
pfm sync # depois de mudar algo em outro aparelho
pfm status # mostra a qual servidor está ligado

Item editado nos dois aparelhos ao mesmo tempo: fica a versão do servidor e a sua vira "título (conflict)". Nada digitado se perde.

Emergência

Notebook quebrou, foi roubado ou trocou? O cofre volta inteiro do seu servidor, com o Emergency Kit.

pfm login URL configurar um aparelho novo

Pede a Secret Key (começa com SB1-) e a frase mestra, as duas do Emergency Kit, e baixa o cofre.

pfm login https://pfm.example.com

Sem a Secret Key e a frase não há recuperação: nem o servidor consegue abrir o cofre. Por isso o Emergency Kit fica em papel, guardado longe do notebook.