区块链分类的第一篇文章,今天就分享一个可以创建N个以太坊私钥的脚本吧。
这个脚本依赖以太坊生成私钥文件的工具:ethkey(我上传了一个编译好的在这里,仅供测试使用,为了安全要自己从源码编译),需要把ethkey与脚本放在当前文件夹下,如果放在其他路径可以修改脚本中ethkey的路径。
功能:
1. 创建私钥,使用-n指定数字N,创建N个私钥文件,所有私钥放在当前以”keystore-日期”命名的目录下,可以使用-p参数指定一个密码,默认密码为空。
2. 验证某个路径下所有私钥文件的密码是否正确,正确输出绿色的Success,错误输出红色的Fail。最后会统计验证结果,并打印出所有没有通过验证的私钥文件名。
用法:
Usage: ./newkeys [options]
-n <number> number of new keys to generate
-p <passphrase> password of new keys, the default is blank
-t <path> test password of key file(s) in path
-h display this help and exit
#!/bin/bash
# help
help() {
echo "Usage: $0 [options]"
echo ""
echo " -n <number> number of new keys to generate"
echo " -p <passphrase> password of new keys, the default is blank"
echo " -t <path> test password of key file(s) in path"
echo " -h display this help and exit"
echo ""
}
#args:
# $1 number
# $2 password
generateKeys() {
keysNumber=$1
password=$2
if [ -z "$keysNumber" ]; then
echo "$0 need 1 parameters"
return
fi
date=`date +"%FT%H-%M-%S"`
dirname=keystore-$date
accountFile=accounts-$date.txt
defaultKeyFile=keyfile.json
# mkdir
echo "Create directory: $dirname"
mkdir $dirname
# generate key
I=1
while [ $I -le $keysNumber ]; do
echo "Progress: $I/$keysNumber"
if [ -f $defaultKeyFile ]; then
rm -rf $defaultKeyFile
fi
## generate one key
ret=`./ethkey generate <<-EOF
$password
$password
EOF`
address=`echo $ret | grep -E -o "0x[[:digit:]a-f,A-F]{40,40}"`
if [ "$address" = "" ]; then
echo "Error address, ethkey generate return: \n\n $ret"
exit 1
fi
## rename the new key file
mv keyfile.json $dirname/$address.key
## append this new address to address file
echo $address >> $dirname/$accountFile
let I=$I+1
done
echo "Finished."
echo "Keys are stored in $dirname"
}
#args: $1 directory
testKeys() {
testDir=$1
if [ -z "$testDir" ]; then
echo "$0 need 1 parameters"
return
fi
read -s -p "Password: " password
echo ""
if [ -f "$testDir" ]; then
testOneKey $testDir $password
elif [ -d "$testDir" ]; then
testKeyDir $testDir $password
fi
}
#args:
# $1 directory path
# $2 password
testKeyDir() {
allFiles=`find $testDir -type f`
allFilesArray=($allFiles)
keysNumber=${#allFilesArray[@]}
failedFiles=""
failedNumber=0
I=0
for file in ${allFilesArray[@]}
do
let I++
echo -n "Progress: $I/$keysNumber "
testOneKey $file $password
done
let successNumber=I-failedNumber
echo "Finished."
echo "Test $I files, Success number: $successNumber, Failed number: $failedNumber"
echo "Failed Files: $failedFiles"
}
#args:
# $1 file path
# $2 password
testOneKey() {
file=$1
password=$2
if [ ! -f "$file" ]; then
echo "$0 need 1 parameter"
return
fi
echo -n "$file"
./ethkey inspect $file >/dev/null 2>&1 <<-EOF
$password
EOF
if [ $? -eq 0 ]; then
echo -e "\033[32m Success\033[0m"
else
echo -e "\033[31m Fail\033[0m"
failedFiles+=" $file"
let failedNumber++
fi
return
}
#
# main
#
# parse arguments
while getopts n:p:t:h OPT; do
case $OPT in
n)
keysNumber=$OPTARG
;;
p)
password=$OPTARG
;;
t)
testDir=$OPTARG
;;
h)
help
exit 0
;;
esac
done
if [ -n "$testDir" ]; then
testKeys $testDir
exit 0
elif [ -z "$keysNumber" ]; then
help
exit 0
elif [ $keysNumber -le 0 ]; then
help
exit 0
fi
generateKeys $keysNumber $password