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/tty
for 에서 표준 입력을 리디렉션하여 명령을 피할 수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 loopback
gpg
--passphrase-fd
수동,
--batch
...버전 2.0부터는 이 옵션도 함께 지정한 경우에만 이 비밀번호를 사용합니다. 버전 2.1부터는--pinentry-mode
이 항목도 로 설정해야 합니다loopback
.