파이프 뒤에 여러 인수를 사용하여 동일한 명령을 여러 번 실행

파이프 뒤에 여러 인수를 사용하여 동일한 명령을 여러 번 실행

에 의해 생성되는 임의의 이진 데이터 키가 있습니다 get_key.

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

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

n파일 이 FILES=file1 file2 file3 file4 file5.

현재로서는 두 가지 해결책이 있습니다.

1) 문자열을 계산 eval하고

2) 배열이 비어 있지 않으면 f해독을 호출하는 재귀 함수로 해독을 대체합니다 (첫 번째 요소를 해독하고 자신을 재귀적으로 호출함).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를 만들고 s decrypt가 다음 위치에 기록될 때까지 기다리게 합니다.

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

관련 정보