나는 다음 스크립트를 사용합니다
#!/bin/bash
echo 'Please enter the password of your XXXX:'
read -sp 'Password:' password
screen -dm bash -c ' BLABLA '
문제는 BLABLA의 명령에 매개변수 비밀번호( $password
)가 포함되어 있고 $password
따옴표 안에 전달되지 않는다는 것 입니다.''
화면에서 조건문을 실행하려면 따옴표가 필요합니다...' if ... then ...; fi
'
베스트, 뷔
답변1
$password
매개변수를 에 올바르게 전달하려면 bash -c
,
screen -dm bash -c 'if [ "$1" = "somestring" ]; then echo ok; fi' bash "$password"
지침:
쉘 옵션에 대한 옵션 인수는
-c
작은따옴표로 묶인 문자열이어야 합니다. 그렇지 않은 경우 변수를 삽입하면 코드 삽입 취약점이 발생합니다.옵션이 아닌 첫 번째 매개변수는 임의의 문자열입니다
bash
. 이는 스크립트$0
내부에 제공되는 값bash -c
이며 셸에서 생성된 모든 오류 메시지에 사용됩니다. 일반적으로 쉘의 이름이 이 문자열로 사용됩니다.$1
나머지 매개변수는 위치 매개변수 목록(예: in 등) 에 배치됩니다 .$2
이 경우 인용된 비밀번호 문자열인 하나의 매개변수를 전달합니다. 이것은 스크립트$1
내부에서 끝납니다bash -c
.
이 질문에 대한 Stéphane의 의견에 주목하세요. 명령줄에서 비밀번호를 전달하는 것은 본질적으로 안전하지 않습니다. 이는 명령의 인수가 프로세스 목록에 표시되고 경우에 따라 감사 로그 및 셸 기록 파일에 저장될 수 있기 때문입니다. 자격 증명은 때때로 권한이 제한된 파일에 저장되며 에서 사용할 수 있습니다 bash -c
. 난 모르니까정확히나는 당신이하고 싶은 일에 대한 유용한 예를 보여줄 수 없습니다.
또한 임의의 문자열을 올바르게 읽으려면 IFS
변수의 값이 빈 문자열이어야 합니다. 그렇지 않으면 입력에서 일부 공백 문자가 제거됩니다. 또한 백슬래시 문자를 올바르게 입력할 수 있도록 허용해야 합니다 read -r
.
IFS= read -s -p 'password: ' -r password
사용하는 이니셜은 echo
사용자에게 힌트를 주기 위해 표준 오류 스트림에 기록되어야 합니다.
echo 'Please enter the password of your XXXX:' >&2