You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
520 lines
14 KiB
520 lines
14 KiB
# |
|
# Bash script |
|
# author: Rodgger Bruno |
|
# |
|
# Sinopse: |
|
# $ g_password [OPTION] ... -f=FILE |
|
# $ g_password help |
|
# $ g_password show_files |
|
# |
|
# -u=USER ( não funcional ainda ) |
|
# Qual pasta do usuário. Por default será usuário atual |
|
# -e |
|
# Editar o arquivo das senhas e os segundos que ficará aberto para editar |
|
# -m=MODE |
|
# O modo que irá parecer as senhas. O tipo 'term' (esse será por default) aparecerá |
|
# pelo terminal e dialog aparecerá pelo programa dialog |
|
# -s=segundos |
|
# Quantos segundos as senhas ficará disponível.O padrão é 10 segundos |
|
# -f=file |
|
# Nome do arquivo que será descriptografado. |
|
# help |
|
# Aparecerá esse menu. Deve ser o primeiro parâmetro |
|
# show_files |
|
# Mostra os arquivos que podem ser descriptografado com a senha. Essa opção pode ser |
|
# usada apenas com -u para mostrar os arquivos. Qual arquivo vai descriptografar. |
|
# -c |
|
# Essa opção apenas vai encriptar caso algo algum arquivo não criptografado de senhas. |
|
# Essa opção poderá ser usada com -f para criptografar um arquivos com senha especifica. Essa opção vai |
|
# pedir senha duas vezes confirmar a senha que será criptografada |
|
# -n |
|
# Novo arquivo de senhas. Essa opção vai aoenas mistrar um texto como deve proceder para encriptar |
|
# arquivos com senhas |
|
# |
|
# $ g_password -u=user -e=15 -f=senhas_ssh.enc |
|
# |
|
# |
|
|
|
|
|
re_number='^[0-9]+$' #regex verificar se é apenas número |
|
re_file='^[a-zA-z0-9]+$' #regex verificar nome de arquivos |
|
bin_install=$0 |
|
[[ $0 =~ .*install_g_password.* ]] && install=true || install=false |
|
path_g_password="${HOME}/.g_password/" |
|
|
|
verify_password=false |
|
|
|
count_line= |
|
|
|
|
|
######################### |
|
## lista de argumentos ## |
|
## será preenchido com ## |
|
## com afunção ## |
|
## verify_parameter ## |
|
######################### |
|
set_user= |
|
set_edit= |
|
set_edit_seconds= |
|
set_seconds_plan= |
|
set_plan= |
|
set_file= |
|
set_mode= |
|
set_enc= |
|
set_show_files= |
|
set_help= |
|
|
|
|
|
|
|
#código deste bloco https://stackoverflow.com/a/60132582 |
|
|
|
# Clears the entire current line regardless of terminal size. |
|
# See the magic by running: |
|
# { sleep 1; clear_this_line ; }& |
|
clear_this_line(){ |
|
printf '\r' |
|
cols="$(tput cols)" |
|
for i in $(seq "$cols"); do |
|
printf ' ' |
|
done |
|
printf '\r' |
|
} |
|
|
|
# Erases the amount of lines specified. |
|
# Usage: erase_lines [AMOUNT] |
|
# See the magic by running: |
|
# { sleep 1; erase_lines 2; }& |
|
erase_lines(){ |
|
# Default line count to 1. |
|
test -z "$1" && lines="1" || lines="$1" |
|
|
|
# This is what we use to move the cursor to previous lines. |
|
UP='\033[1A' |
|
|
|
# Exit if erase count is zero. |
|
[ "$lines" = 0 ] && return |
|
|
|
# Erase. |
|
if [ "$lines" = 1 ]; then |
|
clear_this_line |
|
else |
|
lines=$((lines-1)) |
|
clear_this_line |
|
for i in $(seq "$lines"); do |
|
printf "$UP" |
|
clear_this_line |
|
done |
|
fi |
|
} |
|
#---------------- |
|
|
|
function decrypt(){ |
|
|
|
if [[ ! -z $1 ]] |
|
then |
|
for to_encrypt in $1 |
|
do |
|
if [[ $to_encrypt =~ .*".enc" ]] |
|
then |
|
openssl aes-256-cbc -d -iter 1000 -a -pass pass:$password -in "${to_encrypt}" -out "${to_encrypt}.dec" 2> /dev/null |
|
if [[ $? -ne 0 ]] |
|
then |
|
rm -f "${to_encrypt}.dec" |
|
echo "Senha incorreta para descriptografar" |
|
exit |
|
fi |
|
count_line=$(wc -l < $to_encrypt.dec) |
|
read_content=`cat $to_encrypt.dec` |
|
rm $to_encrypt.dec |
|
fi |
|
done |
|
else |
|
return 1 |
|
fi |
|
|
|
return 0 |
|
} |
|
|
|
function verify_files(){ |
|
for to_encrypt in $1 |
|
do |
|
point_extension=${#to_encrypt} |
|
if [[ ${to_encrypt:$(($point_extension - 4)):$point_extension} != ".enc" ]] |
|
then |
|
echo "Encriptar arquivo $to_encrypt" |
|
openssl aes-256-cbc -iter 1000 -a -pass pass:$password -in "$to_encrypt" -out "$to_encrypt.enc" 2> /dev/null |
|
if [[ $? -ne 0 ]] |
|
then |
|
echo "Não foi possível encriptar $to_encrypt" |
|
else |
|
echo "encriptado" |
|
fi |
|
rm -f "$to_encrypt" |
|
fi |
|
|
|
done |
|
} |
|
|
|
|
|
function verify_installation(){ |
|
|
|
if [[ ! -d $path_g_password ]] |
|
then |
|
input_boolean "Instalar g_password 1 (s/n): " 1 echo s |
|
if [[ $? -eq 0 ]] |
|
then |
|
intall_g_password |
|
#echo "+ $?" |
|
[[ $? -eq 0 ]] && echo "Instalação terminada.\n /usr/bin/g_password $?" && exit |
|
echo "não foi possível instalar g_password - $?" && exit |
|
fi |
|
fi |
|
|
|
if [[ ! -d ${path_g_password}/enc ]] |
|
then |
|
input_boolean "Instalar g_password 2 (s/n): " 1 echo s |
|
if [[ $? -eq 0 ]] |
|
then |
|
intall_g_password |
|
[[ $? -eq 0 ]] && echo "Instalação terminada.\n /usr/bin/g_password" && exit |
|
echo "não foi possível instalar g_password" && exit |
|
fi |
|
fi |
|
if [[ ! -f "/usr/bin/g_password" ]] |
|
then |
|
input_boolean "Instalar g_password (s/n): " 1 echo s |
|
if [[ $? -eq 0 ]] |
|
then |
|
intall_g_password |
|
[[ $? -eq 0 ]] && echo "Instalação terminada.\n /usr/bin/g_password" && exit |
|
echo "não foi possível instalar g_password" && exit |
|
fi |
|
fi |
|
} |
|
|
|
|
|
## $1 (string) text para echo ou read -p |
|
## $2 (integer) limitar o número de caracteres, -1 não limitar |
|
## $3 () dar echo depois do input| Geralmente usado password noecho |
|
## $4 valor true |
|
## $5 valor false - sem valor no $5 se não for true sempre será false |
|
function input_boolean(){ |
|
|
|
local boolean |
|
|
|
while [ 1 ] |
|
do |
|
read -p "${1}" $( [[ $2 -ne -1 ]] && echo " -N $2 " || echo " ") $( [[ $3 == "noecho" ]] && echo " -s " || echo) boolean |
|
|
|
echo |
|
if [[ $4 =~ .*$boolean.* && ! -z $boolean ]] |
|
then |
|
return 0; |
|
elif [[ ( $5 =~ .*$boolean.* && ! -z $boolean ) || -z $5 ]] |
|
then |
|
return 1; |
|
fi |
|
done |
|
|
|
} |
|
|
|
|
|
function intall_g_password(){ |
|
|
|
if [[ ! -d ~/.g_password/ ]] |
|
then |
|
[[ $(mkdir -p ~/.g_password/) -eq 0 ]] && : || return 1 |
|
fi |
|
|
|
if [[ ! -d ~/.g_password/enc ]] |
|
then |
|
[[ $(mkdir -p ~/.g_password/enc) -eq 0 ]] && : || return 1 |
|
fi |
|
|
|
if [[ ! -d ~/.g_password/dec ]] |
|
then |
|
[[ $(mkdir -p ~/.g_password/dec) -eq 0 ]] && : || return 1 |
|
fi |
|
|
|
if [[ $install == "true" ]] |
|
then |
|
[[ $(cp "$bin_install" "/usr/bin/g_password") -eq 0 ]] && : || return 3 |
|
fi |
|
|
|
return 0 |
|
} |
|
|
|
|
|
function verify_parameter(){ |
|
|
|
# user definido. Atualmente não está válido |
|
local bool_u=false |
|
|
|
# editar |
|
local bool_e=false |
|
|
|
#modo |
|
local bool_m=false |
|
|
|
#segundo plan |
|
local bool_s=false |
|
|
|
# file decriptar |
|
local bool_f=false |
|
|
|
# help |
|
local bool_h=false |
|
|
|
# arquivos criptografados |
|
local bool_sf=false |
|
|
|
#encriptar arquivos |
|
local bool_c=false |
|
|
|
|
|
for option in $@ |
|
do |
|
[[ $option == $0 ]] && continue |
|
|
|
if [[ $option =~ ^-u=.* ]] |
|
then |
|
echo "Essa opção -u não é definida ainda." && exit |
|
|
|
elif [[ $option =~ ^-e$ ]] ########## -e editar |
|
then |
|
bool_e=true |
|
set_edit=true |
|
set_edit_seconds=${option:3} |
|
|
|
[[ $bool_u == true ]] && echo "Não é permitido usar o parâmetro -u com -e" && exit |
|
[[ $bool_m == true ]] && echo "Não é permitido usar o parâmetro -m com -e" && exit |
|
[[ $bool_s == true ]] && echo "Não é permitido usar o parâmetro -s com -e" && exit |
|
[[ $bool_h == true ]] && echo "Não é permitido usar o parâmetro help com -e" && exit |
|
[[ $bool_sf == true ]] && echo "Não é permitido usar o parâmetro show_files com -e" && exit |
|
[[ $bool_c == true ]] && echo "Não é permitido usar o parâmetro -c com -e" && exit |
|
|
|
elif [[ $option =~ ^-m=.* ]] ########## -m modo (term|dialog) |
|
then |
|
if [[ ${option:3} == "term" || ${option:3} == "dialog" ]] |
|
then |
|
bool_m=true |
|
set_mode=${option:3} |
|
else |
|
echo -e "erro neste lugar \"${option}\" aceita apenas term e dialog.\nUse opção help para informação" |
|
exit |
|
fi |
|
|
|
[[ $bool_u == true ]] && echo "Não é permitido usar o parâmetro -u com -m" && exit |
|
[[ $bool_e == true ]] && echo "Não é permitido usar o parâmetro -e com -m" && exit |
|
[[ $bool_s == true ]] && echo "Não é permitido usar o parâmetro -s com -m" && exit |
|
[[ $bool_c == true ]] && echo "Não é permitido usar o parâmetro -c com -m" && exit |
|
|
|
elif [[ $option =~ ^-s=.* ]] ########## -s segundos |
|
then |
|
if [[ ${option:3} =~ $re_number ]] |
|
then |
|
bool_s=true |
|
set_plan=true |
|
set_seconds_plan=${option:3} |
|
else |
|
echo -e "erro neste lugar \"${option}\" aceita apenas número.\nUse opção help para informação" |
|
exit |
|
fi |
|
|
|
[[ $bool_e == true ]] && echo "Não é permitido usar o parâmetro -e com -s" && exit |
|
[[ $bool_u == true ]] && echo "Não é permitido usar o parâmetro -u com -s" && exit |
|
[[ $bool_h == true ]] && echo "Não é permitido usar o parâmetro help com -s" && exit |
|
[[ $bool_sf == true ]] && echo "Não é permitido usar o parâmetro show_files com -s" && exit |
|
|
|
elif [[ $option =~ ^-f=.* ]] |
|
then |
|
if [[ ${option:3} =~ $re_file ]] ########## -f arquivo |
|
then |
|
bool_f=true |
|
set_file=${option:3} |
|
else |
|
echo -e "erro neste lugar \"${option}\" deve ser apenas um nome e apenas a-z A-Z 0-9.\nUse opção help para informação" |
|
fi |
|
|
|
[[ $bool_u == true ]] && echo "Não é permitido usar o parâmetro -u com -f" && exit |
|
[[ $bool_h == true ]] && echo "Não é permitido usar o parâmetro help com -f" && exit |
|
[[ $bool_sf == true ]] && echo "Não é permitido usar o parâmetro show_files com -f" && exit |
|
[[ $bool_c == true ]] && echo "Não é permitido usar o parâmetro -c com -f" && exit |
|
|
|
elif [[ $option == "show_files" ]] ########## show_files mostrar os arquivos |
|
then |
|
bool_sf=true |
|
set_show_files=true |
|
|
|
[[ $bool_u == true ]] && echo "Não é permitido usar o parâmetro -u com show_files" && exit |
|
[[ $bool_m == true ]] && echo "Não é permitido usar o parâmetro -m com show_files" && exit |
|
[[ $bool_s == true ]] && echo "Não é permitido usar o parâmetro -s com show_files" && exit |
|
[[ $bool_h == true ]] && echo "Não é permitido usar o parâmetro help com show_files" && exit |
|
[[ $bool_c == true ]] && echo "Não é permitido usar o parâmetro -c com show_files" && exit |
|
|
|
elif [[ $option == "help" ]] ########## help texto de ajuda |
|
then |
|
bool_h=true |
|
set_show_files=true |
|
|
|
[[ $bool_u == true ]] && echo "Não é permitido usar o parâmetro -u com help" && exit |
|
[[ $bool_m == true ]] && echo "Não é permitido usar o parâmetro -m com help" && exit |
|
[[ $bool_s == true ]] && echo "Não é permitido usar o parâmetro -s com help" && exit |
|
[[ $bool_sf == true ]] && echo "Não é permitido usar o parâmetro show_files com help" && exit |
|
[[ $bool_c == true ]] && echo "Não é permitido usar o parâmetro -c com help" && exit |
|
|
|
elif [[ $option =~ ^-c ]] ########## encriptar arquivos |
|
then |
|
bool_c=true |
|
set_enc=true |
|
|
|
[[ $bool_u == true ]] && echo "Não é permitido usar o parâmetro -u com -c" && exit |
|
[[ $bool_m == true ]] && echo "Não é permitido usar o parâmetro -m com -c" && exit |
|
[[ $bool_s == true ]] && echo "Não é permitido usar o parâmetro -s com -c" && exit |
|
[[ $bool_h == true ]] && echo "Não é permitido usar o parâmetro help com -c" && exit |
|
[[ $bool_sf == true ]] && echo "Não é permitido usar o parâmetro show_files com -c" && exit |
|
|
|
else |
|
echo -e "opção: \"${option}\" não reconhecida \n";exit |
|
fi |
|
|
|
done |
|
|
|
if [[ $bool_e == false && $bool_sf == false && $bool_c == false ]] |
|
then |
|
[[ bool_f == false ]] && echo "Precisa definir qual arquivo (-f=) deve visualizar. Use show_files para ve-los" && exit |
|
set_plan=true |
|
fi |
|
|
|
if [[ $bool_e == true && $bool_f == false ]] |
|
then |
|
echo "Falta -f para definir qual arquivo é necessário para editar" && exit |
|
fi |
|
if [[ $bool_c == true && $bool_f == false ]] |
|
then |
|
echo "Falta -f para definir qual arquivo é necessário para encriptar" && exit |
|
fi |
|
} |
|
|
|
function show_option_new_file(){ |
|
|
|
echo "Esse opção está sendo mostra pois a opção -n foi ativada."; |
|
echo "Deve colocar o arquivo com a senhas em texto plano em ~/.g_passowrd/dec/new_file"; |
|
echo "Depois ativar o programa \"g_password -c -f=new_file\" (sem -f vai encriptar todos com a mesma senha que estiver na pasta dec)"; |
|
echo "Depois esse arquivo vai estar na pasta enc com a extensão \".enc\" isso indica que o arquivo está criptografado"; |
|
echo "Terminado"; |
|
} |
|
|
|
|
|
# return 1 editar arquivo de senhas |
|
# return 2 show_files |
|
# return 3 encriptar arquivos |
|
# return 4 mostrar senha |
|
function redirect(){ |
|
|
|
# Como o script vai executar |
|
|
|
if [[ $set_edit == true ]] |
|
then |
|
return 1 #editar arquivo de senhas |
|
|
|
elif [[ $set_enc == true ]] |
|
then |
|
return 2 #encriptar arquivos |
|
|
|
else |
|
return 3 #mostrar senha |
|
fi |
|
|
|
} |
|
|
|
function show_files(){ |
|
|
|
list_file_enc=$(ls enc) |
|
count_file_enc=$(ls enc |wc -l) |
|
if [[ ${#list_file_enc} -gt 0 ]] |
|
then |
|
echo "Existe $count_file_enc arquivos encriptado:"; |
|
for file in enc/* |
|
do |
|
echo -e "\t${file:4}"; |
|
done |
|
else |
|
echo "Não existe arquivo com senhas criptografado" |
|
fi |
|
|
|
list_file_dec=$(ls dec) |
|
count_file_dec=$(ls dec |wc -l) |
|
if [[ ${#list_file_dec} -gt 0 ]] |
|
then |
|
echo "Existe $count_file_dec arquivos não encriptado:"; |
|
for file in dec/* |
|
do |
|
echo -e "\t${file:4}"; |
|
done |
|
echo -e "\nUse opção \"-c -f=file\" para encriptar" |
|
else |
|
echo "Não existe arquivo com senhas sem criptografia" |
|
fi |
|
|
|
} |
|
|
|
function encrypt(){ |
|
echo |
|
} |
|
|
|
verify_installation |
|
verify_parameter $@ |
|
|
|
|
|
echo "Script básico em shell para não deixar as senhas em texto plano" |
|
|
|
cd $path_g_password 2>> /dev/null |
|
[[ $? -ne 0 ]] && echo "erro de acessar pastado software" && exit |
|
|
|
#apenas mostrar files |
|
[[ $set_show_files == true ]] && show_files && exit |
|
|
|
echo -n "Password: " |
|
read -s password |
|
echo |
|
if [[ $set_enc == true ]] |
|
then |
|
echo -n "Reescreve Password: " |
|
read -s password2 |
|
[[ $password2 != $password ]] && echo "Não são iguais password" && exit |
|
echo |
|
fi |
|
|
|
redirect #função e obtém o retorno |
|
direct=$? |
|
|
|
[[ $direct -eq 1 ]] && decrypt 1 #editar |
|
[[ $direct -eq 2 ]] && encrypt 3 #encriptar |
|
[[ $direct -eq 3 ]] && decrypt 4 #show_password |
|
|
|
|
|
decrypt "$list_file" |
|
verify_files "$list_file" |
|
|
|
if [[ $1 != "term" ]] |
|
then |
|
dialog \ |
|
--keep-tite \ |
|
--title 'g_password' \ |
|
--msgbox "${read_content}" \ |
|
0 0 |
|
erase_lines 3 |
|
else |
|
erase_lines 3 |
|
erase_line=$((${count_line}+1)) |
|
echo -e "${read_content}" |
|
for pc in $(seq 0 1 10); do |
|
echo -ne "\r\033[0K${pc}s" #contagem apagando linha atual e reescrevendo |
|
sleep 1 |
|
done |
|
|
|
erase_lines erase_line |
|
fi |
|
|
|
|
|
|