web-dev-qa-db-ja.com

暗号化して任意のファイルをアーカイブする機能

私は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 
1
im_infamous

なぜ$ PWDを繰り返しているのですか?それはリストではありません。

スクリプトまたは関数へのすべての引数を反復処理するには、次を使用します。

for ARG in "$@"; do

または短縮形

for ARG;

「shift」を使用して最初のパラメーターを変数に保存してから、上記のループを使用して残りのパラメーターを反復処理できます。

GPG部分については、GPGコードを使用して別の関数を定義し、それを通常のシェルコマンドであるかのように「アーカイブ」関数内で呼び出す必要があります。

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'"
}
1
AlvaroGMJ