[security] 변수 값을 명령의 stdin에 전달하는 방법은 무엇입니까?

나는 다소 안전해야하는 쉘 스크립트를 작성 중입니다. 즉, 명령 매개 변수를 통해 보안 데이터를 전달하지 않고 임시 파일을 사용하지 않는 것이 좋습니다. 명령의 stdin에 변수를 어떻게 전달할 수 있습니까? 또는 가능하지 않은 경우 이러한 작업에 임시 파일을 올바르게 사용하는 방법은 무엇입니까?



답변

다음과 같이 간단합니다.

echo "$blah" | my_cmd


답변

bashstdin 에서 값을 전달하는 것은 다음과 같이 간단합니다.

your-command <<< "$your_variable"

항상 변수 표현식 주위에 따옴표를 넣으십시오!

이것은 아마도에서만 bash작동하고에서는 작동하지 않을 것이라는 점에주의하십시오 sh.


답변

echo "$var" | command연산은 표준 입력이 에코 된 라인으로 제한됨을 의미합니다. 터미널도 연결하려면 더 멋져 야합니다.

{ echo "$var"; cat - ; } | command

( echo "$var"; cat -   ) | command

즉, 첫 번째 줄은 내용이 $var되고 나머지는 cat표준 입력 을 읽음으로써 나옵니다 . 명령이 너무 멋진 작업을 수행하지 않으면 (명령 줄 편집을 켜거나 실행하는 것처럼 실행 vim) 문제가 없습니다. 그렇지 않으면 정말 멋져 expect보일 필요가 있습니다. 또는 그 파생물 중 하나가 적절할 것 같습니다.

명령 줄 표기법은 실질적으로 동일하지만 두 번째 세미콜론은 중괄호와 함께 필요하지만 괄호는 사용하지 않습니다.


답변

나는 Martin의 대답을 좋아했지만 변수에 무엇이 있는지에 따라 몇 가지 문제가 있습니다. 이

your-command <<< """$your_variable"""

변수에 “또는!


답변

(cat <<END
$passwd
END
) | command

cat정말 필요하지 않지만 더 나은 코드를 구성하는 데 도움이 당신이 당신의 명령에 입력으로 괄호에 더 많은 명령을 사용할 수 있습니다.


답변

Martin의 답변에 따라 Here Strings 라는 bash 기능 이 있습니다 (자체가 더 널리 지원되는 Here Documents 기능 의 변형입니다 ).

http://www.gnu.org/software/bash/manual/bashref.html#Here-Strings

3.6.7 여기 문자열

여기 문서의 변형 형식은 다음과 같습니다.

<<< word

단어가 확장되어 표준 입력의 명령에 제공됩니다.

Here Strings는 bash 전용으로 표시되므로 이식성을 높이려면 PoltoS의 답변에 따라 원래 Here Documents 기능을 사용하는 것이 좋습니다.

( cat <<EOF
$variable
EOF
) | cmd

또는 위의 더 간단한 변형 :

(cmd <<EOF
$variable
EOF
)

다른 명령으로 추가로 리디렉션하지 않으려면 (및 을 생략 할 수 있습니다 ).


답변

이 강력하고 이식 가능한 방법은 이미 의견에 나타났습니다. 독립형 답변이어야합니다.

printf '%s' "$var" | my_cmd

또는

printf '%s\n' "$var" | my_cmd

노트:

  • 그것은보다 낫다 echo: 이유가 여기 printf보다 더 echo?
  • printf "$var"잘못되었습니다. 첫 번째 인수는 %s또는 같은 다양한 시퀀스 \n해석 되는 형식 입니다. 변수를 오른쪽으로 전달하려면 형식으로 해석되지 않아야합니다.
  • 일반적으로 변수에는 후행 줄 바꿈이 포함되지 않습니다. 이전 명령 (와 함께 %s)은 변수를 그대로 전달합니다. 그러나 텍스트로 작동하는 도구는 불완전한 줄을 무시하거나 불평 할 수 있습니다 ( 텍스트 파일이 줄 바꿈으로 끝나는 이유 참조 ). 따라서 %s\n변수 내용에 개행 문자를 추가하는 후자의 명령 (와 함께 )을 원할 수 있습니다 . 분명하지 않은 사실 :

    • 여기서 Bash ( <<<"$var" my_cmd)의 문자열은 개행을 추가합니다.
    • 줄 바꿈을 추가하는 모든 메서드 my_cmd는 변수가 비어 있거나 정의되지 않은 경우에도 비어 있지 않은 stdin of 를 생성합니다.