MST

星途 面试题库

面试题:Bash脚本复杂加密场景与脚本优化

假设你需要编写一个Bash脚本,实现对一个目录下所有文件的加密,加密密钥需要从一个安全的配置文件中读取,并且加密后要将原文件删除,同时记录加密操作的日志。在加密过程中要处理文件权限、符号链接等特殊情况。请描述你的实现思路,并写出核心代码片段,同时说明如何优化脚本以提高效率。
11.4万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 读取密钥:从安全配置文件中读取加密密钥。
  2. 遍历目录:使用 find 命令遍历指定目录及其子目录下的所有文件。
  3. 处理特殊情况:对于符号链接,只记录日志不进行加密操作;对于文件权限,加密后尽量保持原文件权限。
  4. 加密操作:使用合适的加密工具(如 openssl)对文件进行加密。
  5. 删除原文件:加密成功后删除原文件。
  6. 记录日志:记录加密操作的详细信息,包括文件名、操作时间、是否成功等。

核心代码片段

#!/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

优化脚本以提高效率

  1. 并行处理:可以使用 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 在某些情况下可能有更好的性能表现。