명령줄 프롬프트가 포함된 쉘 스크립트

명령줄 프롬프트가 포함된 쉘 스크립트

배경

저는 Linux를 처음 접했기 때문에 주제에서 벗어나거나 잘못된 용어를 사용하고 있다면 미리 사과드립니다..

node.js 프로젝트에서 Powershell을 호출하여 Ubuntu/WSL에서 실행할 셸 스크립트를 작성 중입니다. wsl아래와 같이 PowerShell 모듈에서 실행하려는 셸 스크립트에 대한 경로와 명령이 포함된 문자열을 전달합니다.

새로운 파워셸("wsl ./lpass.sh")

질문

쉘 스크립트는 완벽하게 실행되지만 코드 줄이 있습니다.필요실행 시 명령 프롬프트에 입력을 전달합니다. 이 코드 줄은 로그인 요청을 서버에 보내고, 서버는 사용자에게 비밀번호를 묻는 메시지로 응답합니다. 이 코드 줄만 사용하여 스크립트를 호출할 때 메시지가 표시되면 명령에 사용자 입력을 전달하여 이 코드 줄이 제대로 작동하도록 할 수 있었습니다. 이것이 lpass.sh내가 원하는 방식으로 작동하도록 명령을 받았을 때 파일의 모습입니다.

#!/bin/sh
echo 'Password' | LPASS_DISABLE_PINENTRY=1 lpass login --force [email protected]

이런 방식으로 파일을 구성하면 PowerShell 명령줄에서 스크립트를 호출하여 원하는 LastPass 계정에 로그인할 수 있습니다. 파이프를 사용하면 내 비밀번호가 전달되어 권한 상승 시 명령 프롬프트에 대한 입력으로 입력됩니다. 그러나 저는 분명히 LastPass의 CLI를 통해 내 계정에 로그인하는 것 이상의 일을 하고 싶습니다.

제가 할 수 있기를 원하는 것은 내 LastPass 계정에 로그인한 다음 로그인한 후 LastPass CLI를 통해 더 많은 작업을 수행하는 것입니다. lpass.sh파일에 한 줄보다 더 많은 명령과 코드가 포함되기를 원합니다 .

#!/bin/sh
echo 'Test' | LPASS_DISABLE_PINENTRY=1 lpass login --force [email protected]
lpass show -G -x --json poopy | jq '.' > poopy.json 

문제는 위에 표시된 파일을 실행하면 명령 프롬프트가 파이핑하기 전에 내 입력을 받아들이지 않으므로 내 LastPass 계정에 로그인되지 않는다는 것입니다. 그 이후의 명령은 제대로 작동하는 것 같지만 LastPass에 로그인하지 않고는 명령을 실행할 수 없기 때문에 결과를 확신할 수 없습니다.

질문

echo "password" | lpass login첫 번째 줄이 파이프 이전의 입력을 허용하면서 여러 줄의 코드도 포함 하도록 셸 스크립트를 어떻게 작성합니까 ? 명령 프롬프트가 나머지 스크립트와 상호 작용하는 방식/셸 스크립트가 실행되는 방식을 설명하는 어딘가가 있습니까? 쉘 스크립트에 관한 문서를 찾았습니다여기그리고 다른 곳에서도 몇 가지 문제가 있지만 제가 겪고 있는 정확한 문제를 찾는 데 어려움을 겪고 있습니다. 또는 더 나은 점은 명령 프롬프트가 스크립트를 통해 셸과 상호 작용하는 방법과 더 많은 코드 줄이 있으면 명령이 제대로 실행되지 않게 하는 스크립트를 셸이 실행/실행/디버깅하는 방법입니다.

답변1

실수로 github에 제출되거나 법적 조사 프로세스의 일부로 다른 곳으로 전송되거나 일부 bloatenschlaag 브라우저에서 실행되는 JavaScript에 의해 캡처될 수 있는 임의의 스크립트에 lasspass 마스터 비밀번호를 포함시키는 것은 일반적으로 좋지 않은 생각입니다. 이를 염두에 두고...

lpass(1)매뉴얼 페이지 에 따르면 표준 입력에서는 비밀번호가 허용됩니다.

pinentry 프로그램을 사용할 수 없거나 LPASS_DISABLE_PINENTRY 환경 변수가 1로 설정된 경우 표준 입력에서 비밀번호를 읽고 표준 오류에 프롬프트가 표시됩니다.

실제로는 약간 까다로워 보이지만 결국에는 다음과 같은 것을 얻을 수 있었습니다.

printf 'Hunter2' |
LPASS_DISABLE_PINENTRY=1 lpass login [email protected]

명령줄에서 작업하세요. 종료 상태 단어(껍질에 물린변수 로 $?) 명령이 실제로 작동하는지 확인하고 0이 아닌 종료 시 스크립트가 실패하도록 합니다.

또 다른 옵션은 표준 출력에 대한 암호를 생성해야 하는 프로그램을 설정하는 것입니다 LPASS_ASKPASS. 그러나 이는 위와 거의 동일합니다.

lpass기본적으로 작은 데몬을 실행하는 것이 가능하며 이로 인해 상황이 복잡해질 수 있습니다. LPASS_AGENT_DISABLE=1명령이 실행되는 환경 으로 내보내어 비활성화할 수 있습니다 . 또는 다음을 사용하여 비밀번호를 입력해야 하는지 확인하세요.lpasslpass status

$ lpass status
Not logged in.
$ echo $?
1

다른 암호화 프로그램이 이를 읽을 수 있으며, 이 경우 에는 표준 입력이 사용되지 않으므로 /dev/tty일반적으로 프로그램이나 이와 유사한 것과 상호 작용해야 합니다 . expect관련 절차에서는 이 사실을 기록할 수도 있고 기록하지 않을 수도 있습니다.

어쨌든, 완전한 Lastpass 쉘 스크립트는 다음과 같을 수 있으며 필요할 때만 로그인합니다. 로그인 또는 상태 명령의 결과를 캡처하고 문제가 발생할 때 기본적으로 정보를 숨기지 않고 표시하는 등 더 많은 오류 검사를 수행할 수 있습니다.

#!/bin/sh

lpasslogin() {
   printf 'Hunter2' |
   LPASS_DISABLE_PINENTRY=1 lpass login --force [email protected] >/dev/null 2>&1
}

lpassup() {
   lpass status >/dev/null || lpasslogin
   status=$?
   if [ $status -ne 0 ]; then
      printf >&2 "lpass login failed\n"
      exit $status
   fi
}

lpassup

# account creation for testing
printf "Username: test\nPassword: Hunter2" |
lpass add test --non-interactive

# and now testing (`jq` might not be doing much here?)
#lpass show -G -x --json test | jq . > test.json

관련 정보