파이프라인 이후 여러 매개변수를 사용하여 동일한 명령을 여러 번 실행

파이프라인 이후 여러 매개변수를 사용하여 동일한 명령을 여러 번 실행

에서 생성한 키(임의의 이진 데이터)가 있습니다 get_key.

이 키를 사용하면 암호화된 파일로 몇 가지 작업을 수행할 수 있습니다. 예를 들어, 암호를 해독할 수 있습니다.

get_key | tee >(decrypt file1) >(decrypt file2)

n이것을 파일 로 일반화하는 방법을 알고 싶습니다 FILES=file1 file2 file3 file4 file5.

현재 두 가지 솔루션을 볼 수 있습니다.

eval1) 문자열 계산

f2) 배열이 비어 있지 않으면 tee >(decrypt A[0]) | f ("${A[@]:1}")(첫 번째 요소를 해독하고 자신을 재귀적으로 호출함) 해독을 호출하는 재귀 함수로 해독을 대체하고, 배열이 비어 있지 않으면 아무것도 호출하지 않습니다.

이 작업을 수행하는 더 좋은 방법이 있는지 궁금합니다. 파일이나 변수에 키를 쓰고 싶지 않으므로 루핑은 옵션이 아닙니다.


편집: 나는 이것을 사용할 것이다https://github.com/xavierm02/combine-keys

답변1

사용 사례에 따라 키가 완전히 생성되기 전에 암호 해독 실행을 시작하는 것은 의미가 없으므로 완료되기 decrypt전에 프로세스를 시작할 필요가 없습니다 . get_key따라서 파이핑에는 이점이 없습니다. 출력을 get_key어딘가에 저장하고 나중에 사용할 수도 있습니다.

출력을 변수에 저장하는 것이 가장 쉬운 방법입니다. 하지만 이는 null byte를 포함할 수 있는 바이너리 데이터이기 때문에이것은 다른 쉘이 아닌 zsh에서만 작동합니다.. 보안이 걱정된다면 걱정하지 마세요. 변수의 내용을 관찰할 수 있는 공격자는 변수를 실행 get_key하고 출력도 관찰할 수 있습니다.

key=$(get_key)
for file in $FILES; do
  print -rn -- $key | decrypt $file
done

다른 셸에서는 임시 파일을 사용할 수 있습니다. 반드시 본인만 읽을 수 있도록 설정하세요. 임시 파일이 디스크 파일 시스템에 있는 경우 서버의 하드 드라이브를 잘못된 시점에 도난당할 경우 키가 손상될 위험이 약간 있습니다. 파일이 메모리 내 파일 시스템에 있는 경우에는 그러한 위험이 없습니다.

key_file=$(umask 077; mktemp)
get_key >"$key_file"
for file; do
  decrypt "$file" <"$key_file"
done
rm "$key_file"

임시 파일을 사용하고 싶지 않고 zsh가 없는 경우 Perl 또는 Python과 같은 다른 언어를 사용할 수 있습니다.

perl -e '
    $key = `get_key`;
    foreach (@ARGV) {
        open KEY, "|-", "decrypt", $_ or die $!;
        print KEY $key or die $!;
        close KEY or die $!;
    }'

POSIX 셸, ksh 또는 bash보다 더 나은 언어가 없고 임시 파일을 사용할 수 없는 경우 파이프로 대체해야 합니다 tee(또는 지루한 인코딩 및 디코딩을 수행해야 합니다). 다양한 출력 수에 대처하기 위해 다음을 수행할 수 있습니다.각 출력에 대한 FIFO 생성, 또는 eval필요한 문자열을 작성하고 포함합니다 <(…)(까다로운 인용에 주의하세요).

답변2

루프에서 FIFO를 생성하고 decrypts가 작성될 때까지 기다리도록 합니다.

for i in "${A[@]}";do
    mkfifo /tmp/"$i"_fifo
    decrypt "$i" </tmp/"$i"_fifo &
done
getkey | tee >/dev/null /tmp/*_fifo
rm -f /tmp/*_fifo

관련 정보