📜  使用 Shell 脚本在目录中自动递归加密

📅  最后修改于: 2022-05-13 01:57:34.596000             🧑  作者: Mango

使用 Shell 脚本在目录中自动递归加密

该脚本将递归加密作为参数或目录及其组成文件和子目录提供的文件。这对于自动加密一个目录中的多个文件非常有用。

这个怎么运作?

  1. 如果没有给出参数,则抛出错误并退出程序。
  2. 读取用于加密变量中文件的密码。
  3. 通过 realpath 查找给定参数的路径。
  4. 创建一个函数来检查提供的参数是目录还是文件。
  5. 如果给定目录,则递归获取该目录下的文件,并通过 ls | 对文件列表中的重复条目进行排序和删除。 uniq 并将其存储在数组中。
  6. 传递 ls 的输出 | uniq 通过循环中创建的数组的索引一一传递给函数,即递归调用相同的函数。
  7. 如果给出了文件 a,则执行步骤 8
  8. 循环遍历每个文件并使用给定的密码使用内置的“gpg”实用程序加密文件。
  9. 如果 'gpg' 实用程序以非零退出代码退出,则抛出错误消息并结束程序。否则删除原始文件并显示加密文件的名称以表明它已成功加密。

源代码:您可以在 Linux 上使用任何编辑器,例如 nano 并将其保存为s1.sh 。在执行此 shell 脚本时,您可能会遇到此文件的权限问题。别着急,用命令sudo chmod 774 s1.sh来解决这个问题。

#!/bin/bash
  
#In this line we check that an
#argument is provided or not
if [ -z "$1" ]; then  
echo "No file provided" >&2
exit 1
fi
  
#reading the password which would
#be used for encryption
read -p "Enter the password" pass 
  
function func() 
{
file_name=$1
  
#checking if the provided
#argument is a directory
if [ -d `realpath $file_name` ]; then 
  
#going to the location
#of the directory
cd `realpath $file_name` 
  
#saving the output of the 
#“ls | uniq” in an array
array=(`ls | uniq `)     
  
#storing the length of the
#array in a variable
len=${#array[*]}    
i=0
  
#looping through all the 
#indices of the array
while [ $i -lt $len ]; do   
  
#displaying the file in 
#the index right now
echo "${array[$i]}" 
  
#recursively calling the function
func ${array[$i]} 
  
#increasing  the counter
let i++ 
  
done 
fi
  
#checking if the argument is a file
if [ -f `realpath $file_name` ]; then 
  
#encrypting the file with the given password 
#and storing the return value of the gpg 
#in a variable
test= echo $pass | gpg -c --batch --yes --passphrase-fd 0 $file_name   
  
#checking if the gpg 
#executed properly or not
if [ "$test" == "1" ]; then 
  
#writing to the standard error
echo "Bad signature: gpg not executed properly" >&2 
exit 1
  
#checking if the gpg 
#executed properly or not
elif [ "$test" == "2" ]; then 
  
#writing to the standard error
echo "unexpected error: gpg not executed properly" >&2 
exit 1
  
else 
  
#deleting the original file
rm $file_name 
  
#displaying the gpg created
echo " $file_name.gpg "     
fi
fi
}
func $1

输出:

使用 Shell 脚本的目录中自动递归加密