1

リモート マシンで ssh 経由でコマンドを実行しようとしていますが、(必要に応じて) ssh パスワードが提供されるまでスクリプトを待機させる必要があります。これは私のコードスニペットです:

ssh -T ${remote} << EOF
if [ ! -d $HOME/.ssh ]; then
    mkdir $HOME/.ssh
    touch $HOME/.ssh/authorized_keys
    chmod 0600 $HOME/.ssh/authorized_keys
fi;
EOF

問題は、パスが提供されるのを待たずに、EOF 間のコマンドがローカル マシンで実行を開始することです。スクリプトを続行する前にパスを待つ方法はありますか?

4

1 に答える 1

3

これは次のように簡単です:

ssh -T ${remote} << 'EOF'
if [ ! -d $HOME/.ssh ]; then
        `mkdir $HOME/.ssh`
        `touch $HOME/.ssh/authorized_keys`
        `chmod 0600 $HOME/.ssh/authorized_keys`
else
EOF

'を囲む一重引用符に注意してくださいEOF

ただし、バッククォートの代わりにフォームを使用することをお勧めします$( ): バッククォート (`)

古いスタイルのコマンド置換で使用されます。

foo=`command`

foo=$(command)

代わりに構文を使用することをお勧めします。$() 内でのバックスラッシュの処理はそれほど驚くことではなく、$() は入れ子にするのが簡単です。http://mywiki.wooledge.org/BashFAQ/082を参照してください。


変数を渡す必要がある場合:

var=42
ssh -T ${remote} << EOF
if [ ! -d \$HOME/.ssh ]; then
        \`mkdir \$HOME/.ssh\`
        \`touch \$HOME/.ssh/authorized_keys\`
        \`chmod 0600 \$HOME/.ssh/authorized_keys\`
else
    echo $var
EOF
于 2013-07-04T20:31:08.227 に答える