2012-07-04 9 views
4

У меня есть файл httpd.conf для общего хостингового сервера, и у меня есть задача перенести каждый виртуальный хост на vps. используя awk, я извлекаю блок записи виртуального хоста для определенного сайта. и сохраните эту запись в переменной. но когда я эхо из положить переменный для добавления httpd.conf на сервере VPS он дает ошибку, какecho несколько строк в файл

Баш: подстановки команды: Строка 1: ошибка синтаксиса около неожиданной лексемы newline' bash: command substitution: line 1: эха "

Может кто-нибудь сказать точный способ добавления простого текстового файла путем эхо-переменной, имеющей несколько строк.

Мой ожидать сценарий выглядит следующим образом:

#!/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" [email protected]$remote_ip `echo $remote_command >> /etc/httpd/conf/httpd.conf` 
expect "*assword: " 
send "redhat\r" 
interact 

и переменная «remote_command» содержит шаблон записи виртуального хоста. used printf, но все же такая же проблема существует. -


мой remote_command содержит следующие значения

<VirtualHost> 
DirectoryIndex index.php 
</VirtualHost> 

он все еще дает такой же error.I используется «» кавычки, но он работал на одной линии, а не для нескольких линий.

Мой главный 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" [email protected]$remote_ip `echo $remote_command >> /etc/httpd/conf/httpd.conf` 
expect "*assword: " 
send "redhat\r" 
interact 

но его не работает. Может быть, какой подход я использую, это совершенно неправильно. Моя главная задача состоит в том, чтобы извлечь все строки виртуального хост-блока, связанные с указанными сайтами на общем сервере httpd, и trnsfer его на httpd conf.sh удаленным vps http. Conf.I по достоинству оценят, если вы предложите любой другой способ.

+0

Какой у вас код? Вероятно, некоторые незакрытые обратные или цитаты ... –

ответ

13

Кажется, что вы пытаетесь написать некоторые символы, которые обрабатываются как специальные символы. Вы должны избегать их с ''. Если вы хотите просто добавить строки line1, line2, line3 seprated с новой строкой попробовать

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

или (более переносимой)

printf 'line1\nline2\nline3\n' 

Если что-то еще, не могли бы вы дать дополнительную информацию?

Благодарим за дополнительную информацию. Вы меняете backticks ` to double quotes "" in the spawn ssh` command. Это подстановка команд здесь, но должна быть нормальной (интерполированной) строкой.

Update

Итак, вы хотите запустить $remote_command и написать свои reuls в файл. ОК.Тогда вы должны сделать это таким образом:

spawn ssh -o "StrictHostKeyChecking no" [email protected]$remote_ip $remote_command >> /etc/httpd/conf/httpd.conf 
+0

Имо он спрашивает о линиях с контентом. –

+2

'echo -e' очень не переносится. Используйте 'printf'. – ormaaj

+0

@ OndraŽižka: Добавлено некоторое содержимое :) –

0

Вы можете сделать это так, что проще

spawn ssh -o "StrictHostKeyChecking no" [email protected]$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 

, если вам не нравится «эхо готова, кот ...», вы можете просто вызовите скрипт, который читает из stdin и выполняет вашу работу. Или напрямую вызовите bash и отправьте скрипт.

Смежные вопросы