20

共有ホスティング サーバーの httpd.conf ファイルがあり、すべての仮想ホストを vps に移行するタスクがあります。awk を使用して、特定のサイトの仮想ホスト エントリのブロックを抽出します。そのエントリを変数に格納します。しかし、変数の出力をエコーし​​てvpsサーバーのhttpd.confを追加すると、次のようなエラーが発生します

bash: コマンド置換: 1 行目: 予期しないトークン付近で構文エラーが発生しましたnewline' bash: command substitution: line 1:echo '

複数の行を持つ変数をエコーすることにより、単純なテキストファイルを追加する正確な方法を誰かが教えてくれますか?

私の予想スクリプトは次のとおりです。

#!/usr/bin/expect 
set remote_ip [lindex $argv 0] 
set username [lindex $argv 1] 
set remote_command [lindex $argv 2] 
foreach {remote_ip username remote_command} $argv {break} 
spawn ssh -o "StrictHostKeyChecking no" root@$remote_ip `echo $remote_command >> /etc/httpd/conf/httpd.conf`
expect "*assword: " 
send "redhat\r" 
interact 

変数「remote_command」には、仮想ホスト エントリのパターンが含まれます。printf を使用しましたが、それでも同じ問題が存在します。–</p>


私の remote_command には次の値が含まれています

<VirtualHost>
DirectoryIndex index.php
</VirtualHost>

それでも同じエラーが発生します。引用符 "" を使用しましたが、複数行ではなく単一行で機能しました。

私のメインスクリプトscript.shには行が含まれています

#!/bin/bash
some code .....
some code......
some code ......
echo "<VirtualHost $D_IPADDRESS>" > /opt/remotehttpd_conf
awk "p && /\/VirtualHost/{exit} /$SITENAME/{p=1}p" /opt/httpd.conf >> /opt/remotehttpd_conf
echo "</VirtualHost>" >> /opt/remotehttpd_conf
REMOTE_COMMANDS4=`cat /opt/remotehttpd_conf`
echo $REMOTE_COMMANDS4
./expect_remote_command_httpd.exp  "$D_IPADDRESS" "$USERNAME" "$REMOTE_COMMANDS4"
some code .....
some code .....

REMOTE_COMMANDS4 をエコーすると正常に動作し、出力が得られるので、expect_remote_command_httpd.exp を使用して出力をリモート マシンに転送します

私のexpect_remote_command_httpd.expには含まれています

#!/usr/bin/expect 
set remote_ip [lindex $argv 0] 
set username [lindex $argv 1] 
set remote_command [lindex $argv 2] 
foreach {remote_ip username remote_command} $argv {break} 
spawn ssh -o "StrictHostKeyChecking no" root@$remote_ip `echo $remote_command >>   /etc/httpd/conf/httpd.conf`
expect "*assword: " 
send "redhat\r" 
interact 

しかし、それは機能していません。私が使用しているアプローチは完全に間違っている可能性があります。私の主な関心事は、共有 httpd サーバー内の特定のサイトに関連する仮想ホスト ブロックのすべての行を抽出し、それをリモート vps の httpd conf ファイルに転送することです。他の方法を提案していただければ幸いです。

4

3 に答える 3

20

特殊文字のように扱われるいくつかの文字を書こうとしているようです。でエスケープする必要があります''。改行で区切られた行line1を追加するだけの場合は、試してくださいline2line3

echo -e 'line1\nline2\nline3\n'

または(よりポータブル)

printf 'line1\nline2\nline3\n'

他に何かあれば、追加情報を教えていただけますか?

追加情報ありがとうございます。backticks ` to double quotes"" in thespawn ssh` コマンドを変更する必要があります。ここではコマンド置換ですが、通常の (補間された) 文字列でなければなりません。

アップデート

$remote_commandでは、実行してその reuls をファイルに書き込みたいと思います。Ok。次に、次のようにする必要があります。

spawn ssh -o "StrictHostKeyChecking no" root@$remote_ip $remote_command >> /etc/httpd/conf/httpd.conf
于 2012-07-04T05:20:30.987 に答える
0

あなたはこのようにすることができます、それはより簡単です

spawn ssh -o "StrictHostKeyChecking no" root@$remote_ip "echo ready;cat >> /etc/httpd/conf/httpd.conf"
expect "assword:"
send "redhat\n"
expect "ready"
send "line 1 of file\n"
send "line 2 of file\n"
send "line 3 of file\n"
# send control-D to end
send "\04"
interact

「echo ready; cat ...」が気に入らない場合は、標準入力から読み取るスクリプトを呼び出して、作業を行うことができます。または、bash を直接呼び出して、スクリプトを送信します。

于 2012-07-04T19:44:18.767 に答える