Sorry, was hitting send to early, this version of the script is better, here is the help output:

Usage: ./import1password.sh [--list | --test] [--skip NUM] [--amount NUM] [--importType TYPE] data.1pif
  test: testMode, do not actually store data
  list: just list elements
  skip: skip NUM entries before actually doing anything, 0 is default
  amount: amount of entries to process, 0 means all
  importType: only import this type, e.g. securenotes.SecureNote

it creates sub directories for each type. This might not be everybodys best choice - could be easily changed...


On 20 Aug 2021, at 14:00, Zack wrote:

Hi,

I am really glad I found this tool, all others are moving to subscription models and so I am more than happy to have found pass. So, I wanted to move from 1password7 to pass, but I did not find an import script for it. So I created my own. It is completely written in bash, only json_pp and sed need to be available.

Of course, using python or any other tool would make it a bit easier, but this is working so far so good. So I thought I'd share it, maybe some others need it or have something to share.

to use it, you need to export your 1Password data to a 1pif "directory". On the shell, start the import like this:

./import1password.sh 1PasswordExport.1pif/data.1pif


This should import all Data.

Or is there a better way?

Cheers,

Stephan
#!/bin/bash


function help(){
        cat <<EOF
Usage: $0 [--list | --test] [--skip NUM] [--amount NUM] [--importType TYPE] 
data.1pif
  test: testMode, do not actually store data
  list: just list elements
  skip: skip NUM entries before actually doing anything, 0 is default
  amount: amount of entries to process, 0 means all
  importType: only import this type, e.g. securenotes.SecureNote

EOF
}
if [ "q$1" == "q" ]; then
        help
        exit 1
fi

onlyList=0
onlyTest=0
skip=0
amount=0
importType=""
while [ "q$1" != "q" ]; do
        echo "Checking $1"
        case "$1" in
                "--list")
                        echo "only listing"
                        onlyList=1
                        shift
                        ;;
                "--test")
                        echo "only testing"
                        onlyTest=1
                        shift
                        ;;
                "--skip")
                        echo "skipping $2"
                        skip=$2
                        shift
                        shift
                        ;;
                "--amount")
                        echo "limiting to $2"
                        amount=$2
                        shift
                        shift
                        ;;
                "--importType")
                        echo "Only importing $2"
                        importType=$2
                        shift
                        shift
                        ;;
                "--test")
                        echo "testMode"
                        shift
                        ;;
                "--help")
                        help
                        exit
                        ;;
                *)
                        echo "File to read: $1"
                        fileName=$1
                        shift
                        ;;
        esac
                
done

jsonOpts="-json_opt pretty,utf8,allow_bignum"
function getField {
        echo "$1" | json_pp $jsonOpts | grep "\"$2\" :" | tr -d ' ",' | head -n 
1 | cut -f 2- -d: 
}

function getLastField {
        echo "$1" | json_pp $jsonOpts | grep "\"$2\" :" | tr -d ' ",' | tail -n 
1 | cut -f 2- -d: 

}

trap ctrlc INT

function ctrlc(){
        echo "Exiting..." >&2
        exit 0
}

count=$(grep "**" $fileName | wc -l|tr -d " \t")
echo "Found $count entries" >&2
if [ $skip -gt 0 ]; then
        echo "Skipping to $skip" >&2
fi
c=0
am=0;
while IFS= read -r line; do 
        
        let c=c+1
        if [ $c -lt $skip ]; then
                continue
        fi
        if [ $amount -gt 0 ] && [ $am -ge $amount ]; then
                echo "amount $amount reached" >&2
                exit 0
        fi      
        let am=am+1
        if echo "$line" | egrep '^\*\*' >/dev/null; then 
                echo "id" >/dev/null
        else    
                type=$(getField "$line" "typeName")
                if [ "q$importType" != "q$type" ] && [ "q$importType" != "q" ]; 
then
                        #echo "Skipping $type"
                        continue
                fi
                echo "processing $c/$count" >&2
                #line=$(echo "$line" | tr "\n\t\\" " " | sed -e 's/" "//g' )
                if [ $onlyList == 1 ]; then
                        echo -e "$line\n" | json_pp $jsonOpts | while IFS= read 
l; do
                        echo "$l" | sed -e "s/\$problematicPassword/$pp/g"
                        done
                else
                        #echo -e "$line\n" | json_pp $jsonOpts | grep typeName 
|| ( echo "$line\n"; continue; )
                        #type=$(echo -e "$line\n" | json_pp $jsonOpts | grep 
typeName | tr -d ' ",' | cut -f 2 -d:)
                        echo ">>>>>>>>> ====== Type: $type ======= <<<<<<<<<<<<"
                        path=""
                        content=""
                        if [ "$type" == "system.folder.SavedSearch" ]; then
                                echo -e "ignoring saved search"
                        elif [ "$type" == "passwords.Password" ]; then
                                location=$(getField "$line" "location" | tr -d 
' ' ) 
                                locationKey=$(getField "$line" "locationKey")
                                title=$(getLastField "$line" "title")
                                password=$(getField "$line" "password"| sed -e 
"s/\$problematicPassword/$pp/g")
                                echo "Location >>> $location <<<"
                                path="passwords/$title"
                                content="$password\nLocation: $location"
                        elif [ "$type" == "webforms.WebForm" ]; then
                                url=$(getField "$line" "url")
                                title=$(getLastField "$line" "title")
                                password=$(echo -e "$line\n" | json_pp 
$jsonOpts | grep -A4 '"designation" : "password"' | grep '"value"' | cut -f2 
-d: | tr -d '" '| sed -e "s/\$problematicPassword/$pp/g")
                                username=$(echo -e "$line\n" | json_pp 
$jsonOpts | grep -A4 '"designation" : "username"' | grep '"value"' | cut -f2 
-d: | tr -d '" ')
                                path="passwords/$title"
                                content="$password\nusername: $username"
                        elif [ "$type" == "wallet.financial.CreditCard" ]; then
                                bank=$(getField "$line" "bank")
                                cardholder=$(getField "$line" "cardholder")
                                ccnum=$(getField "$line" "ccnum")
                                expirymm=$(getField "$line" "expiry_mm")
                                expiryyy=$(getField "$line" "expiry_yy")
                                notes=$(getField "$line" "notesPlain")
                                cardtype=$(getLastField "$line" "type")
                                pin=$(getLastField "$line" "pin")
                                cvv=$(getLastField "$line" "cvv")
                                phoneNum=$(getField "$line" "phoneLocal" | tr 
-d ' ')
                                title=$(getLastField "$line" "title")
                                path="ccards/$title"
                                content="$ccnum\nBank: $bank\ncardType: 
$cardtype\nccNumber: $ccnum\nexpires: $expirymm/$expiryyy\nCVV: $cvv\nPIN: 
$pin\nnotes: $notes"
                                
                        elif [ "$type" == "securenotes.SecureNote" ]; then
                                title=$(getField "$line" "title")
                                note=$(getField "$line" "notesPlain" | sed -e 
's/\\n/ >\n  /g')
                                content="\nNote: $note"
                                path="notes/$title"
                        elif [ "$type" == "wallet.financial.BankAccountUS" ]; 
then
                                bankName=$(getField "$line" "bankName")
                                accountType=$(getField "$line" "accountType")
                                iban=$(getField "$line" "iban")
                                owner=$(getField "$line" "owner")
                                title=$(getLastField "$line" "title")
                                path="bank/$title"
                                content="$iban\nBank: $bankName\niban: 
$iban\nKontoinhaber: $owner\nAccountType: $accountType"
                        
                        elif [ "$type" == "wallet.membership.RewardProgram" ]; 
then
                                member_name=$(getField "$line" "member_name")
                                company=$(getField "$line" "company_name")
                                sinceMM=$(getField "$line" "member_since_mm")
                                sinceYY=$(getField "$line" "member_since_yy")
                                membershipNo=$(getField "$line" "membership_no")
                                pin=$(getField "$line" "pin")
                                title=$(getLastField "$line" "title")
                                path="membership/$title"
                                content="$pin\nName: $member_name\nMembership 
No: $membershipNo\nMember since: $sinceMM/$sinceYY\nPin: $pin"
                                
                        elif [ "$type" == "wallet.membership.Membership" ]; then
                                membershipNo=$(getField "$line" "membership_no")
                                memberName=$(getField "$line" "member_name")
                                org_name=$(getField "$line" "org_name")
                                title=$(getLastField "$line" "title")
                                url=$(getField "$line" "website")
                                
                                path="membership/$title"
                                content="$membershipNo\nMemberShipNo: 
$membershipNo\nMembershipName: $membershipName\nOrganisation: $org_name\nUrl: 
$url"
                        elif [ "$type" == "wallet.computer.UnixServer" ]; then
                                note=$(getField "$line" "notesPlain")
                                adminPwd=$(getField "$line" 
"admin_console_password")
                                password=$(getField "$line" "password")
                                title=$(getLastField "$line" "title")
                                username=$(getField "$line" "username")
                                path="passwords/$title"
                                content="$adminPwd\nUsername: 
$username\nPassword: $adminPwd\n Note: $note"
                        elif [ "$type" == "wallet.computer.Router" ]; then
                                dpassword=$(getField "$line" "disk_password")
                                networkName=$(getField "$line" "network_name")
                                password=$(getField "$line" "password")
                                title=$(getLastField "$line" "title")
                                name=$(getField "$line" "name")
                                server=$(getField "$line" "server")
                                wPassword=$(getField "$line" 
"wireless_password")
                                wSecurity=$(getField "$line" 
"wireless_security")
                                path="wifi/$title"
                                content="$password\nDiskPassword: 
$dpassword\nNetworkName: $networkName\nName: $name\nServer: $server\nWireless 
Password: $wPAssword\nWireless Security: $wSecurity"
                                
                        elif [ "$type" == "identities.Identity" ]; then
                                echo "Ignoring identity..."
                                continue
                        elif [ "$type" == "wallet.onlineservices.Email.v2" ]; 
then
                                popAuth=$(getField "$line" "pop_authentication")
                                popPwd=$(getField "$line" "pop_password")
                                popSecurity=$(getField "$line" "pop_security")
                                popServer=$(getField "$line" "pop_server")
                                popType=$(getField "$line" "pop_type")
                                popUser=$(getField "$line" "pop_username")
                                title=$(getLastField "$line" "title")
                                path="email/$title"
                                content="$popPwd\nUsername: $popUser\nServer: 
$popServer\nType: $popType\nSecurity: $popSecurity\nAuth: $popAuth\nPassword: 
$popPwd"
                        elif [ "$type" == "wallet.government.SsnUS" ]; then
                                name=$(getField "$line" "name")
                                number=$(getField "$line" "number")
                                title=$(getLastField "$line" "title")
                                path="id/$title"
                                content="$number\nName: $name\nNumber: $number"
                        elif [ "$type" == "wallet.computer.License" ]; then
                                regCode=$(getField "$line" "reg_code" | sed -e 
's/\\n/ >\n  /g')
                                regEmail=$(getField "$line" "reg_email")
                                regName=$(getField "$line" "reg_name")
                                title=$(getLastField "$line" "title")
                                path="licenses/$title"
                                content="\nRegisteredEmail: 
$regEmail\nRegisteredName: $regName\nCode: $regCode";
                        else    
                                echo "Unhandeled: '$type'"
                                echo -e "$line\n" | json_pt $jsonOpts
                        fi
                        if [ "q$content" == "q" ]; then
                                continue
                        fi
                        if [ $onlyTest -eq 1 ]; then
                                echo -e "would insert to $path:\n$content"
                        else 
                                echo -e "$content" | pass insert -m -f "$path"
                        fi
                fi
                #sleep 1
        fi
done  < $fileName

Reply via email to