GnuPG, bash 스크립트에서 비밀번호 프롬프트

GnuPG, bash 스크립트에서 비밀번호 프롬프트

bash 스크립트에서 비밀번호를 묻는 방법은 무엇입니까?

다음 오류 메시지가 나타납니다: problem with the agent: Inappropriate ioctl for device.

#!/bin/bash

fname="/home/user/elist.txt"
while IFS= read -r file
do
    tar czf "$file".tar.gz "$file"
    gpg --passphrase-fd 0 --no-symkey-cache --symmetric --cipher-algo AES256 "$file".tar.gz
done < "$fname"

답변1

주어진 은 --passphrase-fd 0파일 gpg에서 비밀번호를 읽으려고 합니다 "$fname". 왜냐하면 while루프 내부에서 파일 설명자 0리디렉션이 시작되는 곳이기 때문입니다.
이를 작동시키는 몇 가지 옵션이 있습니다.

  • 전체 루프를 중괄호로 묶고 표준 입력을 새 파일 설명자로 복사하여 --passphrase-fd인수로 사용합니다.

    fname="/home/user/elist.txt"
    {
      while IFS= read -r file
      do
          tar czf "$file".tar.gz -- "$file"
          gpg --passphrase-fd 3 --no-symkey-cache --symmetric --batch \
            --cipher-algo AES256 --pinentry-mode loopback -- "$file".tar.gz
      done < "$fname"
    } 3<&0
    
  • 명시적으로 새 파일 설명자를 열고 elist.txt여기 read에서 표준 입력을 리디렉션합니다(전체 루프의 표준 입력을 리디렉션하는 대신).

    exec 3<"/home/user/elist.txt"
    while <&3 IFS= read -r file
    do
        tar czf "$file".tar.gz -- "$file"
        gpg --passphrase-fd 0 --no-symkey-cache --symmetric --batch \
          --cipher-algo AES256 --pinentry-mode loopback -- "$file".tar.gz
    done
    exec 3<&-
    
  • 명시적으로 새 파일 설명자를 열고 옵션에 대한 인수 /dev/tty대신 사용합니다 (스크립트가 터미널에서 대화형으로 실행되는 경우 괜찮습니다. 암호가 다른 것에서 나온 경우 예상대로 작동하지 않을 수 있습니다).0--passphrase-fd

    fname="/home/user/elist.txt"
    exec 3</dev/tty
    while IFS= read -r file
    do
        tar czf "$file".tar.gz -- "$file"
        gpg --passphrase-fd 3 --no-symkey-cache --symmetric --batch \
          --cipher-algo AES256 --pinentry-mode loopback -- "$file".tar.gz
    done < "$fname"
    exec 3<&-
    

    더 깔끔한 대안으로 /dev/ttyfor 에서 표준 입력을 리디렉션하여 명령을 피할 수 gpg있습니다 .0</dev/tty gpg --passphrase-fd 0 ...exec

  • 올바르게 구성했다고 가정하면 gpg-agent(예를 들어 일부 Linux 배포판에서 프록시는 pinentry사용자와 상호 작용하는 데 사용되는 소켓 활성화 시스템 서비스이며 가상 터미널 및 그래픽 세션에서 기본적으로 작동합니다) 다음을 사용하지 마세요 --passphrase-fd.

    fname="/home/user/elist.txt"
    while IFS= read -r file
    do
        tar czf "$file".tar.gz -- "$file"
        gpg --no-symkey-cache --symmetric \
          --cipher-algo AES256 -- "$file".tar.gz
    done < "$fname"
    

인용 이후 --batch명령줄에 및 를 추가했습니다 .--pinentry-mode loopbackgpg--passphrase-fd수동,

--batch...버전 2.0부터는 이 옵션도 함께 지정한 경우에만 이 비밀번호를 사용합니다. 버전 2.1부터는 --pinentry-mode이 항목도 로 설정해야 합니다 loopback.

관련 정보