불필요한 질문이셨다면 죄송합니다만, 인터넷에 여기저기 검색해 봤는데 아쉽게도 저와의 관계에서는 순서가 꽤 복잡합니다.
루트 권한으로 명령을 실행할 수 있도록 sudo 명령에 비밀번호를 연결하려고 합니다.
echo 'PASSWORD' | sudo -S [...]
이것은 나에게 효과적입니다.
그러나 자체 파이프가 포함된 명령에 대한 루트 권한이 필요하면 문제가 발생합니다.
echo 'PASSWORD' | sudo -S printf '%s' "OTHER_PASSWORD" | cryptsetup --batch-mode --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 3000 luksFormat /dev/sd* -
따라서 하위 쉘 명령을 사용해 보았습니다.
echo 'PASSWORD' | sudo -S bash -c 'printf '%s' "OTHER_PASSWORD" | cryptsetup --batch-mode --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 3000 luksFormat /dev/sd* -'
안타깝게도 따옴표는 printf 명령의 따옴표와 충돌하므로 사용할 수 없습니다.
이 문제를 해결하기 위해 여러 가지 괄호를 사용해 보았습니다. 이것은 작동합니다 :
echo 'PASSWORD' | sudo -S bash -c '(printf '%s' "OTHER_PASSWORD" | cryptsetup --batch-mode --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 3000 luksFormat /dev/sd* -)'
그러나 이전에 생성된 변수를 사용하려면 해당 변수를 내보내는 데 어려움을 겪습니다.
export storage="/dev/sda"
echo 'PASSWORD' | sudo -S bash -c '(printf '%s' "OTHER_PASSWORD" | cryptsetup --batch-mode --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 3000 luksFormat $storage -)'
ERROR: Device - doesn't exist or access denied.
이 문제를 해결하는 쉬운 방법이 있나요?
답변1
변수는 작은따옴표로 확장되지 않습니다.
sudo -S bash -c '(printf '%s' "OTHER_PASSWORD" | ... luksFormat $storage -)'
~~~~~~~~
주변 따옴표는 %s
실제로 문자열이 인용되지 않았음을 의미합니다(여기에 강조 표시된 구문에 표시됨). 그러나 다행스럽게도 %s
특별한 의미가 없으므로 이는 중요하지 않습니다.