面试题答案
一键面试实现思路
- 读取密钥:从安全配置文件中读取加密密钥。
- 遍历目录:使用
find
命令遍历指定目录及其子目录下的所有文件。 - 处理特殊情况:对于符号链接,只记录日志不进行加密操作;对于文件权限,加密后尽量保持原文件权限。
- 加密操作:使用合适的加密工具(如
openssl
)对文件进行加密。 - 删除原文件:加密成功后删除原文件。
- 记录日志:记录加密操作的详细信息,包括文件名、操作时间、是否成功等。
核心代码片段
#!/bin/bash
# 读取密钥
KEY=$(cat /path/to/secure/keyfile)
# 日志文件路径
LOG_FILE="/path/to/encryption.log"
# 遍历目录
find /path/to/directory -type f -print0 | while read -d $'\0' file
do
# 处理符号链接
if [ -L "$file" ]; then
echo "$(date): Skipping symbolic link: $file" >> $LOG_FILE
continue
fi
# 保存文件权限
FILE_PERMISSIONS=$(stat -c "%a" "$file")
# 加密文件
ENCRYPTED_FILE="${file}.enc"
openssl enc -aes-256-cbc -in "$file" -out "$ENCRYPTED_FILE" -pass pass:"$KEY"
# 检查加密是否成功
if [ $? -eq 0 ]; then
# 删除原文件
rm "$file"
# 设置加密后文件权限
chmod $FILE_PERMISSIONS "$ENCRYPTED_FILE"
echo "$(date): Encrypted and deleted: $file" >> $LOG_FILE
else
echo "$(date): Encryption failed: $file" >> $LOG_FILE
fi
done
优化脚本以提高效率
- 并行处理:可以使用
xargs -P
选项并行执行加密操作,提高整体效率。例如:
find /path/to/directory -type f -print0 | xargs -0 -P 4 -I {} bash -c '
if [ -L "$0" ]; then
echo "$(date): Skipping symbolic link: $0" >> /path/to/encryption.log
else
FILE_PERMISSIONS=$(stat -c "%a" "$0")
ENCRYPTED_FILE="${0}.enc"
openssl enc -aes-256-cbc -in "$0" -out "$ENCRYPTED_FILE" -pass pass:"$KEY"
if [ $? -eq 0 ]; then
rm "$0"
chmod $FILE_PERMISSIONS "$ENCRYPTED_FILE"
echo "$(date): Encrypted and deleted: $0" >> /path/to/encryption.log
else
echo "$(date): Encryption failed: $0" >> /path/to/encryption.log
fi
fi' {}
这里 -P 4
表示使用4个并行进程进行加密操作。
2. 批量读取密钥:如果密钥读取操作开销较大,可以考虑在脚本启动时一次性读取密钥并缓存,避免每次加密都读取密钥文件。
3. 使用更高效的加密工具:根据实际情况,如果有更高效的加密工具适合你的场景,可以替换 openssl
。例如,mbedtls
在某些情况下可能有更好的性能表现。