[PYTHON] Procédure pour obtenir la clé KeePassX avec une ligne de commande sous OSX

Je voulais obtenir la clé KeePass X dans un environnement où l'interface graphique ne peut pas être utilisée, alors je l'ai essayé.

Introduction de kptool

Si vous recherchez, Résumé des outils utilisés dans la ligne de commande vol.2 apparaîtra immédiatement. Préparez l'environnement pour exécuter kptool avec Python.

GitHub shirou/kptool

$ git clone https://github.com/shirou/kptool.git
$ python kptool/kptool/kptool.py path/to/kdbfile
Traceback (most recent call last):
  File "kptool/kptool/kptool.py", line 9, in <module>
    from keepassdb import keepassdb
  File "/Users/east/git/kptool/kptool/keepassdb/keepassdb.py", line 6, in <module>
    from Crypto.Cipher import AES
ImportError: No module named Crypto.Cipher

On m'a immédiatement dit qu'il n'y avait pas de Crypto. Installez avec pip.

$ pip install pycrypto 
-bash: pip: command not found

On m'a dit qu'il n'y avait pas de pip. Installez pip.

$ sudo easy_install pip
Searching for pip
Reading http://pypi.python.org/simple/pip/
Best match: pip 1.5.4
Downloading https://pypi.python.org/packages/source/p/pip/pip-1.5.4.tar.gz#md5=834b2904f92d46aaa333267fb1c922bb
Processing pip-1.5.4.tar.gz
Running pip-1.5.4/setup.py -q bdist_egg --dist-dir /tmp/easy_install-8UYX4X/pip-1.5.4/egg-dist-tmp-HXMDdl
warning: no files found matching 'pip/cacert.pem'
warning: no files found matching '*.html' under directory 'docs'
warning: no previously-included files matching '*.rst' found under directory 'docs/_build'
no previously-included directories found matching 'docs/_build/_sources'
Adding pip 1.5.4 to easy-install.pth file
Installing pip script to /usr/local/bin
Installing pip2.7 script to /usr/local/bin
Installing pip2 script to /usr/local/bin
 
Installed /Library/Python/2.7/site-packages/pip-1.5.4-py2.7.egg
Processing dependencies for pip
Finished processing dependencies for pip

L'installation de pip est terminée.

$ pip install pycrypto
Command /usr/bin/python -c "import setuptools, tokenize;__file__='/private/var/folders/47/lrzh0xp935z2ppgpth8cx44w0000gn/T/pip_build_east/pycrypto/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /var/folders/47/lrzh0xp935z2ppgpth8cx44w0000gn/T/pip-4slDJi-record/install-record.txt --single-version-externally-managed --compile failed with error code 1 in /private/var/folders/47/lrzh0xp935z2ppgpth8cx44w0000gn/T/pip_build_east/pycrypto
Storing debug log for failure in /Users/east/Library/Logs/pip.log

D'une manière ou d'une autre, une erreur s'est produite dans les lettres rouges. Exécutez avec sudo.

$ sudo pip install pycrypto
 
Successfully installed pycrypto
Cleaning up...

Cela semble avoir fonctionné.

$ python kptool/kptool/kptool.py path/to/kdbfile
Enter password ['path/to/kdbfile']
Password: 
kptool> list

Si la liste des titres des entrées enregistrées dans le kdb correspondant apparaît dans la liste, cela réussit.

Modifier kptool

Je voulais l'obtenir en une seule fois, j'ai donc modifié kptool en copiant.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import argparse
import getpass
import datetime
import readline
 
from keepassdb import keepassdb
 
if __name__ == '__main__':
 
  parser = argparse.ArgumentParser(description='search entry from keepass DB')
  parser.add_argument('kdb_file',
                      nargs=1,
                      help = 'keepass DB file path')
  parser.add_argument('title',
                      nargs=1,
                      help = 'entry title')
  parser.add_argument('-p', '--password')
 
  args = parser.parse_args()
 
  if (not args.password):
    password = getpass.getpass()
  else:
    password = args.password
 
  try:
    k = keepassdb.KeepassDBv1(args.kdb_file[0], password)
  except ValueError:
    print("Invalid password.")
    exit(1)
 
  for e in k.get_entries():
    title = e['title'].encode('utf-8')
    if (title == args.title[0]):
      print("id:%s" % e['id'].encode('utf-8'))
      print("title:%s" % title)
      print("url:%s" % e['url'].encode('utf-8'))
      print("username:%s" % e['username'].encode('utf-8'))
      print("password:%s" % e['password'].encode('utf-8'))

l'a fait! !!

Si vous donnez un mot de passe avec l'option -p, ce mot de passe sera utilisé. S'il n'y a pas d'option -p, vous serez invité à entrer le mot de passe. J'imprime des données qui me semblent nécessaires.

Récupérez la clé depuis la ligne de commande

#!/bin/sh

KEEPASS_SCRIPT=~/git/kptool/kptool/getentry.py
LOCAL_KDB_FILE=path/to/kdbfile
LOCAL_KDB_ENTRY=Titre de la clé souhaitée

HOGE_PASSWORD=`python ${KEEPASS_SCRIPT} ${LOCAL_KDB_FILE} ${LOCAL_KDB_ENTRY} | grep password | cut -d ':' -f 2`
echo $KEEPASS_SCRIPT

Si vous écrivez un script shell comme celui-ci, vous pouvez facilement l'obtenir en entrant simplement le mot de passe. Je fais écho ici, mais veuillez noter que faire écho au mot de passe n'est pas une opération très correcte. Cela fait du bien de l'incorporer dans un programme approprié et de l'utiliser.

plus loin...

Par exemple, si le fichier kdb est une liaison secondaire d'un autre fichier kdb, L'option -p fonctionne.

#!/bin/sh

KEEPASS_SCRIPT=~/git/kptool/kptool/test.py
LOCAL_KDB_FILE=path/to/kdbfile
LOCAL_KDB_ENTRY=Titre de la clé primaire souhaitée
APP_KDB_FILE="$1"
APP_KDB_ENTRY='HogeApp (hoge) hogehoge'

if [ -z $APP_KDB_FILE ]
then
  echo "Usage: $0 path/to/app.kdb"
  exit 1
fi

APP_KDB_PASSWORD=`python ${KEEPASS_SCRIPT} ${LOCAL_KDB_FILE} ${LOCAL_KDB_ENTRY} | grep password | cut -d ':' -f 2`
APP_URL=`python ${KEEPASS_SCRIPT} ${APP_KDB_FILE} "${APP_KDB_ENTRY}" -p ${APP_KDB_PASSWORD} | grep url | head -n 1 |cut -d ':' -f 2`
APP_PASSWORD=`python ${KEEPASS_SCRIPT} ${APP_KDB_FILE} "${APP_KDB_ENTRY}" -p ${APP_KDB_PASSWORD} | grep password | head -n 1 |cut -d ':' -f 2`

Les données peuvent être facilement acquises en entrant simplement la clé primaire, ce qui améliore l'efficacité! Nous avons pu créer un environnement qui fonctionne en entrant simplement le mot de passe minimum requis.

Le sentiment est exactement Kachakachakacha ...

La fin

Recommended Posts

Procédure pour obtenir la clé KeePassX avec une ligne de commande sous OSX
Instructions d'utilisation de l'interface de ligne de commande AWS (Python / awscli) sous Mac OS X
Comment installer Caffe sur OS X avec macports
Comment installer Theano sur Mac OS X avec homebrew
Premiers pas avec le framework Python Django sur Mac OS X
Étapes pour mettre Caffe dans Mac OS X 10.10 en mode CPU
Comment obtenir la clé sur Amazon S3 avec Boto 3, exemple de mise en œuvre, notes
Convertir XLSX en CSV sur la ligne de commande
Préparation à l'utilisation de aws cli sur Mac OS X
Comment faire du zéro-padding sur une ligne avec OpenCV
Très facile à installer SciPy sur Mac OS X
Commande Yum pour accéder à MySQL avec Python 3 sous Linux
Étapes pour mesurer la couverture et obtenir des badges sur codecov.io
Installez PyQt5 avec homebrew sur Mac OS X Marvericks (10.9.2)
Étapes pour installer la dernière version d'OpenCV sur OS X El Capitan sans Homebrew
Mémo pour obtenir la valeur côté html-javascript avec jupyter
Utilisez Python 3 introduit par l'outil de ligne de commande sur macOS Catalina
Je veux démarrer un environnement Jupyter avec une seule commande
Tester Python avec Miniconda dans un environnement OS X et Linux avec travis-ci
Mémo sur Mac OS X
Créer une autre version de l'environnement Python conda avec une seule ligne de commande
Comment obtenir une chaîne à partir d'un argument de ligne de commande en python
Comment obtenir tout le trafic via VPN avec OpenVPN sous Linux
J'ai essayé de démarrer avec Bitcoin Systre le week-end
J'ai essayé d'afficher l'interface graphique sur Mac avec le système X Window
[Python] Comment obtenir une valeur avec une clé autre que value avec Enum
Installez lp_solve sur Mac OSX et appelez-le avec python.
Conversion GSI_DEM en geotiff → conversion UTM → conversion ascii uniquement sur la ligne de commande Ubuntu
Comment installer Theano sur Mac OS X 10.10 (en utilisant pyenv, anaconda)