Como converter meus arquivos de texto (cada um contendo um par nome de usuário + senha) em CSV para importá-los para o KeePass via bash (cygwin)

1

Eu gostaria de usar o Keepass (win10x64).

O problema é que, eu tenho minhas senhas reunidas todos esses anos assim:
cada par nome de usuário / senha em um arquivo de texto separado,
tendo como nome de arquivo o nome de domínio da senha relevante,
e dentro de cada arquivo .txt, a primeira linha é o nome de usuário e a segunda a senha (ambas sem prefixo).

Por exemplo:

Nome do arquivo: reddit.com (também possui a extensão .txt, mas pode ser omitida) Conteúdos:

my_username  
my_Password


Para que o acima se torne um CSV, ele deve ser convertido em:

"Account","Login Name","Password","Web Site", "Notes"
"Entry 1","my_username","my_password","http://reddit.com", ""

ou seja,

"Account","Login Name",  "Password",    "Web Site",          "Notes"
"Entry 1","my_username", "my_password", "http://reddit.com", ""

Observação: se houver uma vírgula ( , ), aspas duplas ( " ) ou barra invertida ( \ ) na senha, será necessário escapar com uma barra invertida.

Como isso pode ser feito através de um script bash (cygwin)?

Os trechos de código que encontrei até agora:

  1. Como posso adicionar uma string ao início de cada linha em um arquivo? ( source )

    awk '{print "prefix" $0}' file
    
  2. Imprimir a linha nth Do arquivo.txt ( source )

    awk "NR==2{print;exit}" file.txt                // for printing the 2nd line
    
  3. executa um comando para todos os arquivos encontrados recursivamente

    find . -name "*.txt" -execdir *command*
    

    ou alternativamente

    for file in /cygdrive/c/folder/*; do 
         *command*                    // command example:   mv "$file" "${file}/.."   
    done
    


Então, meu script deve começar com:

find . -name "*.txt" -execdir        awk '{print '"Account","Account","Login Name","Password","Web Site", "Notes"' $0}' "$file"

Estou preso neste ponto.

    
por darkred 28.10.2015 / 11:34

2 respostas

4

Arquivos de entrada:

  1. yahoo.net.txt
  2. gougle.com.txt
  3. reddit.com.txt

Conteúdo de yahoo.net.txt :

user1-yaho0
pas,,

Conteúdo de gougle.com.txt :

user1-google
pas"wor,d

Conteúdo de reddit.com.txt :

user1-reddit
pas\wor\d

Com esta entrada, o seguinte script rápido e sujo faz o trabalho:

#!/bin/bash

echo "\"Account\",\"Login Name\",\"Password\",\"Web Site\",\"Notes\"" > output.csv
num=0
for f in 'find . -type f -name '*.txt'' ; do

num=$((num + 1))
user='head -1 "$f"'
password='sed 1d "$f" | sed -r 's/([\,"])/\\/g''
domain='basename "$f" | sed 's/\.txt$//''

echo "\"$num\",\"$user\",\"$password\",\"$domain\",\"\"" >> output.csv

done

Conteúdo de output.csv :

"Account","Login Name","Password","Web Site","Notes"
"1","user1-reddit","pas\wor\d","reddit.com",""
"2","user1-yaho","pas\,\,","yahoo.net",""
"3","user1-google","pas\"wor\,d","gougle.com",""
    
por 28.10.2015 / 11:52
0

com awk

 awk 'BEGIN{print "\"Account\",\"Login Name\",\"Password\",\"Web Site\",\"Notes\""}
{ if (FNR==1){
         user=$0;a+=1};
  if(FNR==2){
         print "\""a"\",\""user"\",\""$0"\",\""gensub(/\.txt/,"","",FILENAME)"\","}}' *.txt

Use a variável especial FNR do awk para obter a 1ª e a 2ª linha de cada arquivo *.txt e a função de manipulação de string gensub para remover .txt de FILENAME (uma variável especial awk ) para coluna URL .

    
por 28.10.2015 / 14:12

Tags