Bash

使用加密歸檔任意文件的功能

  • December 3, 2015

我在 bash 方面沒有那麼先進,因此無法使我的功能正常工作。這是程式碼:

archive()
{
for f in $PWD
do 
   for ((i=1; i++;))
   do
       7za a "$1".7z $f -pSECRET -mhe 
   done
done
}

為了這個函式應該接受任意數量的參數,比如

archive foo file1.txt file2.jpg file3.asc ...

不幸的是,我自己還沒有想出如何解決這個問題。

還有一件事情。對我來說,在函式內部創建函式仍然很困難,但如果有人告訴我如何使用動態密碼而不是常量密碼,那就完美了:

gpg --gen-random 1 "$1" | perl -ne'
   s/[\x00-\x20]/chr(ord($^N)+50)/ge;
   s/([\x7E-\xDB])/chr(ord($^N)-93)/ge;
   s/([\xDC-\xFF])/chr(ord($^N)-129)/ge;
   print $_, "\n"'

命令的最終所需輸出archive foo file1.txt file2.png

7-Zip (A) [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=ru_RU.UTF-8,Utf16=on,HugeFiles=on,8 CPUs)
Scanning

Creating archive .7z

Compressing  file1.txt      
Compressing  file2.png      

Everything is Ok

Password for file foo.7z is X;~2\$82uZx@^22nFd}!jrn2]`[GceWx 

為什麼要迭代 $PWD?那不是一個清單。

要遍歷腳本或函式的所有參數,請使用

for ARG in "$@"; do

或縮寫形式

for ARG;

您可以使用“shift”將第一個參數保存到變數中,然後使用上述循環遍歷其餘參數。

對於 GPG 部分,您只需要使用您的 GPG 程式碼定義另一個函式,然後在您的“歸檔”函式中呼叫它,就像它是一個普通的 shell 命令一樣:

gen_password () {
   gpg --gen-random 1 "$1" | perl -ne'
       s/[\x00-\x20]/chr(ord($^N)+50)/ge;
       s/([\x7E-\xDB])/chr(ord($^N)-93)/ge;
       s/([\xDC-\xFF])/chr(ord($^N)-129)/ge;
       print $_, "\n"'
}

archive () {
   ARCHIVE_NAME="$1"
   PASSWORD=$(gen_password 32)
   shift
   for ARG; do
       7za a "$ARCHIVE_NAME" "$ARG" -p"$PASSWORD" -mhe
   done
   echo "Created 7z archive with password '$PASSWORD'"
}

引用自:https://unix.stackexchange.com/questions/246955