导入前必须先用 pass init 初始化密码库,否则无法导入;格式无法自动识别时需显式指定密码管理器名,如 pass import keepass file.xml;pimport 导出到其他管理器需用 --out 指定目标路径
pass-import
roddhjavGPL-3.0更新放缓把 KeePass、1Password 等主流密码管理器里的数据迁移到 pass 密码库的命令行扩展,省去手动逐条搬运的麻烦。
A pass extension for importing data from most existing password managers
pass init <gpg-id>
pass import path/to/passwordsREADME 未说明
pass 扩展,把 63 种密码管理器的数据一键导入 pass 密码库
把 KeePass、1Password 等主流密码管理器里的数据迁移到 pass 密码库的命令行扩展,省去手动逐条搬运的麻烦。
核心能力
- 原生支持 63 种密码管理器格式导入
- 自动识别导出文件格式,识别失败可手动指定来源
- 处理重复条目,OTP 密钥兼容 pass-otp
- 附带 pimport 脚本,可导出到其他密码管理器
- 支持 dry-run 预览、子目录导入与 haveibeenpwned 泄露检查
容易踩的坑
- v3.5最新正式版2024-02-25 · 2024-02-25 12:54 UTC
What's Changed
- Readme change: fix macos py3 pip install command by @louisraetz in https://github.com/roddhjav/pass-import/pull/195
- Update Python code for new clean signature by @ctrueden in https://github.com/roddhjav/pass-import/pull/194
- Fix: Support 1PIF file format for 1Password v7.9.11 (macOS) by @davidandreoletti in https://github.com/roddhjav/pass-import/pull/207
- feat: Filter would be exported entries based on JSONPath filter expression by @davidandreoletti in https://github.com/roddhjav/pass-import/pull/208
- fix: improperly quoted tags values in 1password.1pif test asset by @davidandreoletti in https://github.com/roddhjav/pass-import/pull/209
- Add a unified way to generate otpauth url.
- Set a timeout to the audit api.
New Contributors
- @louisraetz made their first contribution in https://github.com/roddhjav/pass-import/pull/195
- @ctrueden made their first contribution in https://github.com/roddhjav/pass-import/pull/194
- @davidandreoletti made their first contribution in https://github.com/roddhjav/pass-import/pull/207
Full Changelog: https://github.com/roddhjav/pass-import/compare/v3.4...v3.5
- v3.42022-12-10 · 2022-12-10 15:06 UTC
- v3.32022-09-10 · 2022-09-10 22:27 UTC
查看更新说明
Added
- Added password audit support.
- Added haveibeenpwned.com audit integration (require the
--pwnedoption). - Add support for pwdsphinx #183
- Add support for nordpass #178
- Add support for 1Password8 #169
- Add support for SafeInCloud #168
- Add support for Lastpass CLI (with
lpass) import & export. - Read OTP from 1Password's 1pif format #157
- Add support fot Bitwarden Organisation export in CSV & JSON.
Changed
- Support for python 3.10, dropped support for python 3.6
- Remove Travis CI in favor of Github Action.
- The man pages are now generated from markdown with pandoc.
- Various refractor, style and linter improvments.
Fixed
- Fix KDBX export group creation #185
- Fix pykeepass use of find_groups path parameter #182
- Honor sroot in passwordstore exports #181
- As safety measure, terminate the GnuPG commandline #165
- Raise an exception upon invalid LastPass CSV data. #156
- Fix possible path corruption in deduplication. #154 #155
- Other various fixed on multiple password managers.
- v3.22021-05-16 · 2021-05-16 15:19 UTC
查看更新说明
Added
- Keepass: initial support for TOTP #137
- Add support for modern firefox import. #134
- Keepass: enable reference substitution #132
- Add gopass support #130
Changed
- Fully deprecate Makefile in favor of setup.py
- Make pimport a setuptools script #138
- Support for
pykeepass4.0.0 #136 - Support for python 3.9
Fixed
- v3.12020-10-25 · 2020-10-25 23:22 UTC
查看更新说明
Added
- Support for direct classname selection.
- Support for
pyhton-magic#115 - Support for the
--rootoption in keepass. #112 - Support for custom fields in Bitwarden. #111
Changed
- Use setup.py to manage the full installation.
- Support for
pykeepass3.2.1
Fixed
- Ensure each pass entry has a name. #118
- Rewrite PasswordStore.list() with Pathlib. #109
- New Chrome documentation. #106
- Ensure the password manager action is a capability. #105
- Fix import.bash path in local make target #104
- Ensure the magic module is
file-magic. #103 - Update Buttercup CSV format. #102
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
pass import
A pass extension for importing data from most existing password managers
Description
pass import is a password store extension allowing you to import your password database to a password store repository conveniently. It natively supports import from 63 different password managers. More manager support can easily be added.
Passwords are imported into the existing default password store, therefore the password store must have been initialized before with pass init.
By default, pass imports entries at the root of the password store and only keeps the main data (password, login, email, URL, group). This behaviour can be changed using the provided options.
Pass import handles duplicates and is compatible with browserpass. It imports OTP secret in a way that is compatible with pass-otp.
pass-import also provides a pimport script that allows importing passwords to other password managers. For instance, you can import passwords from Lastpass to a Keepass database. It currently supports password export from 8 managers.
The following password managers are supported:
The following destination password managers are supported:
| Exporters Password Manager | Format | Command line |
|---|---|---|
| csv | csv | pimport csv src [src] |
| gopass | gopass | pimport gopass src [src] |
| keepass | kdbx | pimport keepass src [src] |
| keepassx2 | kdbx | pimport keepassx2 src [src] |
| keepassxc | kdbx | pimport keepassxc src [src] |
| lastpass | cli | pimport lastpass src [src] |
| pass | pass | pimport pass src [src] |
| sphinx | pimport sphinx src [src] |
Usage
Basic use
To import password from any supported password manager simply run:
pass import path/to/passwords
If pass-import is not able to detect the format, you need to provide the password manager <pm> you want to import data from:
pass import <pm> path/to/passwords
If you want to import data to a password manager other than pass, run:
pimport <new_pm> <former_pm> path/to/passwords --out path/to/destination/pm
Help
usage: pass import [-r path] [-p path] [-k KEY] [-a] [-f] [-c] [-C] [-P] [-d]
[--sep CHAR] [--del CHAR] [--cols COLS] [--filter FILTER]
[--config CONFIG] [-l] [-h] [-V] [-v | -q]
[src ...]
Import data from most of the password manager. Passwords are imported into
the existing default password store; therefore, the password store must have
been initialised before with 'pass init'.
Password managers:
src Path to the data to import. Can also be the password
manager name followed by the path to the data to
import. The password manager name can be: 1password,
aegis, andotp, apple-keychain, bitwarden, blur,
buttercup, chrome, clipperz, csv, dashlane, encryptr,
enpass, firefox, fpm, freeotp+, gnome, gnome-auth,
gopass, gorilla, kedpm, keepass, keepassx, keepassx2,
keepassxc, keeper, lastpass, myki, network-manager,
nordpass, padlock, pass, passman, passpack, passpie,
pwsafe, revelation, roboform, safeincloud, saferpass,
synology, upm, zoho.
Common optional arguments:
-r path, --root path Only import the password from a specific subfolder.
-p path, --path path Import the passwords to a specific subfolder.
-k KEY, --key KEY Path to a keyfile if required by a manager.
-a, --all Also import all the extra data present.
-f, --force Overwrite existing passwords.
-c, --clean Make the paths more command line friendly.
-C, --convert Convert invalid characters present in the paths.
-P, --pwned Check imported passwords against haveibeenpwned.com.
-d, --dry-run Do not import passwords, only show what would be
imported.
Extra optional arguments:
--sep CHAR Provide a characters of replacement for the path
separator. Default: '-'
--del CHAR Provide an alternative CSV delimiter character.
Default: ','
--cols COLS CSV expected columns to map columns to credential
attributes. Only used by the csv importer.
--filter FILTER Export whole entries matching a JSONPath filter
expression. Default: (none) This field can be: - a
string JSONPath expression - an absolute path to a
file containing a JSONPath filter expression. List of
supported filter: https://github.com/h2non/jsonpath-ng
Example: - '$.entries[*].tags[?@="Defaults"]' : Export
only entries with a tag matching 'Defaults'
--config CONFIG Set a config file. Default: '.import'
Help related optional arguments:
-l, --list List the supported password managers.
-h, --help Show this help message and exit.
-V, --version Show the program version and exit.
-v, --verbose Set verbosity level, can be used more than once.
-q, --quiet Be quiet.
More information may be found in the pass-import(1) man page.
Usage for pimport can been seen with pimport -h or man pimport.
Examples
Import password from KeePass
pass import keepass.xml
(*) Importing passwords from keepass to pass
. Passwords imported from: keepass.xml
. Passwords exported to: ~/.password-store
. Number of password imported: 6
. Passwords imported:
Social/mastodon.social
Social/twitter.com
Social/news.ycombinator.com
Servers/ovh.com/bynbyjhqjz
Servers/ovh.com/jsdkyvbwjn
Bank/aib
This is the same than: pimport pass keepass.xml --out ~/.password-store
Import password to a different password store
export PASSWORD_STORE_DIR="~/.mypassword-store"
pass init <gpg-id>
pass import keepass.kdbx
Import password to a subfolder
pass import bitwarden.json -p Import/
(*) Importing passwords from bitwarden to pass
. Passwords imported from: bitwarden.json
. Passwords exported to: ~/.password-store
. Root path: Import
. Number of password imported: 6
. Passwords imported:
Import/Social/mastodon.social
Import/Social/twitter.com
Import/Social/news.ycombinator.com
Import/Servers/ovh.com/bynbyjhqjz
Import/Servers/ovh.com/jsdkyvbwjn
Import/Bank/aib
Other examples:
- If the manager is not correctly detected, you can pass it at source argument:
pass import dashlane dashlane.csv - Import NetworkManager password on default dir:
pass import networkmanager - Import a NetworkManager INI file:
pass import nm.ini - Import a One password 1PIF:
pass import 1password.1pif - Import a One password CSV:
pass import 1password.csv - Import a Passman JSON file:
pass import passman.json - Import Lastpass file to a keepass db:
pimport keepass lastpass.csv --out keepass.kdbx - Import a password store to a CSV file:
pimport csv ~/.password-store --out file.csv - Export Bitwarden to SPHINX: pimport sphinx bitwarden.json -o sphinx.cfg
GPG keyring
Before importing data to pass, your password-store repository must exist and your GPG keyring must be usable. In other words, you need to ensure that:
- All the public gpgids are present in the keyring.
- All the public gpgids are trusted enough (
ultimate). - At least one private key is present in the keyring.
Otherwise, you will get the following error:
invalid credentials, password encryption/decryption aborted.
To set the trust on a GPG key, one can run gpg --edit-key <gpgid>. Next type trust and select 5 = I trust ultimately.
Security consideration
Direct import
Passwords should not be written in plain text form on the drive. Therefore, when possible, you should import it directly from the encrypted data. For instance, with an encrypted keepass database:
pass import keepass file.kdbx
Secure erasure
Otherwise, if your password manager does not support it, you should take care of securely removing the plain text password database:
pass import lastpass data.csv
shred -u data.csv
Encrypted file
Alternatively, pass-import can decrypt gpg encrypted file before importing it. For example:
pass import lastpass lastpass.csv.gpg
Mandatory Access Control (MAC)
AppArmor profiles for pass and pass-import are available in apparmor.d. If your distribution support AppArmor, you can clone the apparmor.d and run: make && sudo make install pass pass-import to only install these apparmor security profiles.
Network
pass-import only needs to establish network connection to support cloud based password manager. If you do not use these importers you can ensure pass-import is not using the network by removing the network rules in the apparmor profile of pass-import.
Password Update
You might also want to update the passwords imported using pass-update.
Configuration file
Some configurations can be read from a configuration file called .import if it is present at the root of the password repository. The configuration read from this file will be overwritten by their corresponding command-line option if present.
Example of the .import configuration file for the default password repository in ~/.password-store/.import:
---
# Separator string
separator: '-'
# The list of string that should be replaced by other string. Only activated
# if the `clean` option is enabled.
cleans:
' ': '-'
'&': 'and'
'@': At
"'": ''
'[': ''
']': ''
# The list of protocols. To be removed from the title.
protocols:
- http://
- https://
# The list of invalid characters. Replaced by the separator.
invalids:
- '<'
- '>'
- ':'
- '"'
- '/'
- '\\'
- '|'
- '?'
- '*'
- '\0'
Installation
Requirements
pass 1.7.0or greater.- Python 3.8+
python3-setuptoolsto build and install it.python3-yaml(apt install python3-yamlorpip3 install pyaml, orpython3 -m pip install pyamlif on MacOS running python installed viabrew)
Optional Requirements
| Dependency | Required for | apt | pip |
|---|---|---|---|
| pass | Password Store import/export | apt install pass | N/A |
| lpass | Lastpass cli based import/export | apt install lpass | N/A |
| defusedxml | Recommended XML library | apt install python3-defusedxml | pip3 install defusedxml |
| pykeepass | Keepass import from KDBX file | N/A | pip3 install pykeepass |
| secretstorage | Gnome Keyring import | apt install python3-secretstorage | pip3 install secretstorage |
| cryptography | AndOTP or Aegis encrypted import | apt install python3-cryptography | pip3 install cryptography |
| file-magic | Detection of file decryption | apt install python-magic | pip3 install file-magic |
| pwdsphinx | Export to SPHINX | N/A(coming soon) | pip3 install pwdsphinx |
| filter | Filter exports | N/A | pip3 install jsonpath-ng |
ArchLinux
pass-import is available in the Arch User Repository.
yay -S pass-import # or your preferred AUR install method
Debian/Ubuntu
pass-import is available under my own debian repository with the package name pass-extension-import. Both the repository and the package are signed with my GPG key: 06A26D531D56C42D66805049C5469996F0DF68EC.
wget -qO - https://pkg.pujol.io/debian/gpgkey | gpg --dearmor | sudo tee /usr/share/keyrings/pujol.io.gpg >/dev/null
echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/pujol.io.gpg] https://pkg.pujol.io/debian/repo all main' | sudo tee /etc/apt/sources.list.d/pkg.pujol.io.list
sudo apt-get update
sudo apt-get install pass-extension-import
NixOS
nix-env -iA nixos.passExtensions.pass-import
Using pip
pip install pass-import
From git
git clone https://github.com/roddhjav/pass-import/
cd pass-import
python3 setup.py install
Stable version
wget https://github.com/roddhjav/pass-import/releases/download/v3.5/pass-import-3.5.tar.gz
tar xzf pass-import-3.5.tar.gz
cd pass-import-3.5
python3 setup.py install
Releases and commits are signed using 06A26D531D56C42D66805049C5469996F0DF68EC.
You should check the key's fingerprint and verify the signature:
wget https://github.com/roddhjav/pass-import/releases/download/v3.5/pass-import-3.5.tar.gz.asc
gpg --recv-keys 06A26D531D56C42D66805049C5469996F0DF68EC
gpg --verify pass-import-3.5.tar.gz.asc
Local install
Alternatively, from git or from a stable version you can do a local install with:
cd pass-import
python3 setup.py install --user
[!IMPORTANT]
For local install you need to:
- Set
PASSWORD_STORE_ENABLE_EXTENSIONStotruefor the local extension to be enabled.- Set
PASSWORD_STORE_EXTENSIONS_DIRto local the install path of pythonExample:
export PASSWORD_STORE_ENABLE_EXTENSIONS=true export PASSWORD_STORE_EXTENSIONS_DIR="$(python -m site --user-site)/usr/lib/password-store/extensions/"
The import Library
One can use pass-import as a python library. Simply import the classes of the password manager you want to import and export. Then use them in a context manager. For instance, to import password from a cvs Lastpass exported file to password-store:
from pass_import.managers.lastpass import LastpassCSV
from pass_import.managers.passwordstore import PasswordStore
with LastpassCSV('lastpass-export.csv') as importer:
importer.parse()
with PasswordStore('~/.password-store') as exporter:
exporter.data = importer.data
exporter.clean(True, True)
for entry in exporter.data:
exporter.insert(entry)
Alternatively, you can import the same Lastpass file to a Keepass database:
from pass_import.managers.keepass import Keepass
from pass_import.managers.lastpass import LastpassCSV
with LastpassCSV('lastpass-export.csv') as importer:
importer.parse()
with Keepass('keepass.kdbx') as exporter:
exporter.data = importer.data
exporter.clean(True, True)
for entry in exporter.data:
exporter.insert(entry)
Contribution
Feedback, contributors, pull requests are all very welcome. Please read the CONTRIBUTING.rst file for more details on the contribution process.