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

38
cat >> /path/to/existingFile.text<< EOF
some text line 1
some text line 2
some text line 3
EOF

切换cat >>cat >创建文件而不是追加

cat > /path/to/newFile.text<< EOF
some text line 1
some text line 2
some text line 3
EOF
于 2018-08-15T19:00:02.310 回答
20

似乎您尝试编写一些被视为特殊字符的字符。你必须用''. 如果您只想添加行line1, line2,line3用换行符分隔,请尝试

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

或(更便携)

printf 'line1\nline2\nline3\n'

如果还有其他问题,您能否提供更多信息?

感谢您提供更多信息。您必须更改反引号` to double quotes“” in thespawn ssh` 命令。那是这里的命令替换,但必须是普通(内插)字符串。

更新

好的,所以您想运行$remote_command并将其 reuls 写入文件。好的。那么你必须这样做:

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 回答