BASH -

2017-03-16 1 views
0

내가 다음 실행하고자하는 방법 에코 작품 EOF 태그 내부 :BASH -

PASSWORD="mypassword" 
RUNCOMMAND=$(cat <<EOF 
echo $PASSWORD | sudo -S sudo echo "this is it babe" 
EOF 
) 

그러나 대신 this is it babe, 나는 다음과 같은 결과를 얻을 : 나는 cat <<\EOF과 노력

mypassword | sudo -S sudo echo "this is it babe" 

cat <<'EOF'을 여전히 운이 없다.

아이디어가 있으십니까?

+0

여기에서 나무를 찾는 동안 숲을 잃어 버렸을 수 있습니까? 실제 문제는 다소 단순한 것 같습니다. 어쨌든 heredoc 블록 안의 코드는 실행되지 않습니다. 그것이 요점입니다. 실행을 원하면 일반 코드로 작성하십시오. – 5gon12eder

답변

2

heredocpipeline과 혼동하고 있습니다. 변수 확장과

히어 닥 : 변수 확장없이

cat <<EOF 
some text, possibly with variables: ${HOME}/$(whoami) 
EOF 
some text, possibly with variables: /home/attie/attie 

히어 닥은 :

: 변수 확장과
cat <<"EOF" 
some text, possibly with variables: ${HOME}/$(whoami) 
EOF 
some text, possibly with variables: ${HOME}/$(whoami) 

파이프 라인

(따옴표, "주의) 변수 확장없이
some text, possibly with variables: /home/attie/attie 

파이프 라인 (따옴표, ' 주) :

echo 'some text, possibly with variables: ${HOME}/$(whoami)' | cat 
some text, possibly with variables: ${HOME}/$(whoami) 

${...} 것은

$(...)이 명령을 실행하는 환경 변수를 확장, 그 stdout을 대체

sudo는 비밀번호를 취득 할 수있는 터미널을 다시 열립니다로 최종 응용 프로그램에 stdin의 전달하기 전에,이 작동하지 않습니다 - 당신은 당신의 암호를 sudo을 체결하려는처럼

는 또한 보인다.

PASSWORD="mypassword" 
RUNCOMMAND=$(cat <<EOF 
echo $PASSWORD | sudo -S sudo echo "this is it babe" 
EOF 
) 

그리고 eval를 통해 그것을 실행 :

+0

'sudo -S'는 stdin으로부터 패스워드를 얻습니다. 원래 예제는 터미널에 붙여 넣기 만하면 작동합니다. 그동안 나는 해결책을 찾았습니다. 시간 내 주셔서 감사합니다. 정말로 감사드립니다. – arcol

+0

아, 네. 사과 – Attie

-1

는 최종 솔루션은 오히려 간단하다이 명백한 문제들 :

유스 케이스에 대한 당신의 시간을 훔친

eval $RUNCOMMAND 

죄송합니다 위의 명령은 실제로 실행하기 전에 주어진 명령을 echo에게 넘깁니다. 이처럼

:

fun_run_command(){ 
# execute the final command 
echo `eval $RUNCOMMAND` 
} 

fun_echo_command(){ 
# echo the command which will be launched (fun_run_command()) 
echo ${RUNCOMMAND//$PASSWORD/PASSWORD} 
} 

RUNCOMMAND=$(cat <<EOF 
echo $PASSWORD | sudo -S sudo docker run --restart=always \ 
--name ${USER_NAME}_`date +%Y%m%d-%H%M%S` \ 
-d \ 
-e "VIRTUAL_HOST=$USER_VIRTUAL_HOST" \ 
-e "VIRTUAL_PORT=$USER_VIRTUAL_PORT" \ 
-e "PORT=$USER_VIRTUAL_PORT" \ 
-p $USER_VIRTUAL_PORT:$USER_VIRTUAL_PORT \ 
$USER_IMAGE 
EOF 
) 

당신은 내가 시작 어떤 명령을 볼 수 있듯이이 그래서 항상 의미가 스크립트에 의해 실행되는 것을 번 확인 할 수 있도록되어 매우 깁니다.

복사 & 동일한 기능을 여러 명령에 붙여 넣으면 오류가 발생하기 쉽습니다.

1

허위 전제에서 시작하고 있습니다. eval $RUNCOMMAND은해야 할 일입니다. 그렇지 않습니다. 변수는 데이터 용이고 함수는이며 코드 용입니다.

run_command() { 
    docker_run_options=(
     --restart=always 
     --name "${USER_NAME}_$(date +%Y%m%d-%H%M%S)" 
     -d 
     -e "VIRTUAL_HOST=$USER_VIRTUAL_HOST" 
     -e "VIRTUAL_PORT=$USER_VIRTUAL_PORT" 
     -e "PORT=$USER_VIRTUAL_PORT" 
     -p "$USER_VIRTUAL_PORT:$USER_VIRTUAL_PORT" 
    ) 

    echo "$1" | sudo -S sudo docker run "${docker_run_options[@]}" "$USER_IMAGE" 
} 

fun_run_command() { 
    run_command "PASSWORD" 
} 
+0

전체 요점은, 단순히 명령을 에코 수 있도록, 무엇이 실행됩니다. 따라서 명령을 변수에 넣고 stdout으로 반향하는 함수 ('fun_echo_command')를 사용하고 그것을 실행하는 또 다른 함수 ('fun_run_command')를 사용하십시오. 이 함수는 필자의 스크립트에 포함 된 외부 파일 (내 경우에는'common/variables.sh')에 살 정도로 일반적입니다. 명령을 다른 기능으로 복사하지 않고 어떻게 실행하기 전에 에코를 달성 할 수 있는지 모르겠습니다. – arcol

+0

이 경우에는 'eval'의 보안 관련 의미가 다소 중요합니다. 스크립트는 * 사용자 입력 *을 요구하기 때문에 사용자가 악의적 인 코드를 변수 중 하나에 쓰고 싶다면 처음에는 터미널에서 (스크립트없이) 그렇게 할 수 있습니다. 그래도 내가 먼저 실행될 명령을 '에코'할 수있는 방법을 모르겠다. (내 목표) – arcol