2017-03-16 9 views
0

BASH - 私は以下を実行したいと思いますどのようにエコー作品EOFタグ内部

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

をしかし、その代わりにthis is it babeの、私は次のような結果を得る:

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

を私はcat <<'EOF'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を締結しているしようとしているようにも見えます - sudoは最終的なアプリケーションにはstdinだ渡す前に、あなたのパスワードを取得するために、端末をrepoenますので、これは、動作しません。

+0

'sudo -S'はstdinからパスワードを取得します。元の例は、端末に貼り付けるだけで動作します。その間、私は解決策を見つけましたが、本当に感謝しています。 – arcol

+0

ああ、はい。謝罪 – Attie

-1

最終的な解決策は、かなり単純です:

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

そしてevalを経由して、それを実行します。

この明らかな問題の男と自分の時間を盗むため申し訳ありません
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 
) 

あなたは私が起動何のコマンドを見ることができるように がそう、それはスクリプトによって実行されているものdoublecheckしても意味が常にあり、かなり長いです。

コピー&を貼り付けて複数の機能に同じコマンドを貼り付けると、エラーが発生しやすくなります。

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

全体のポイントは、単にコマンドをエコーできるように、何が実行されます。したがって、コマンドを変数にまとめ、それを標準出力にエコーする関数( 'fun_echo_command')を使用し、それを実行する別の関数(' fun_run_command')を使用します。これらの関数は、私のスクリプトに含まれている外部ファイル(私の場合は 'common/variables.sh'です)に十分に一般的です。コマンドを他の関数にコピーせずに、実行する前にエコーを達成する方法がわかりません。 – arcol

+0

この場合、 'eval'のセキュリティの意味はむしろ疑問です。スクリプトは*ユーザー入力*を要求しているので、ユーザーが悪意のあるコードを変数の1つに書きたい場合は、最初にスクリプトなしで端末で実行できます。それでも私は最初に何が実行されるのかをあなたが「エコー」できるかどうかわかりません。 (それは私の目標です) – arcol

関連する問題