매개변수를 따옴표로 묶어서 전달하세요(예: screen -dm ' ls /home/$dir1 ').

매개변수를 따옴표로 묶어서 전달하세요(예: screen -dm ' ls /home/$dir1 ').

나는 다음 스크립트를 사용합니다

#!/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

관련 정보