我已经寻遍天涯海角,但似乎找不到解决这个问题的方法(也许不存在?)。这就是我的问题:
我本地机器上有一个名为 myFile.txt 的文件。远程机器上也有一个同名文件(myFile.txt)。两个文件结构都是这样的:
<tag1>November 22, 2012<tag1>
<tag2>version5.8<tag2>
<tag3>ASDFA23RASDF29ASDJ29DJ2<tag3>
两个文件拥有完全相同的布局。我需要编写一个脚本来保持两个文件(本地和远程)
<tag3>
之间的字符串同步。我需要从远程服务器获取<tag3>
中的字符串,并将其与本地机器上的相同字符串进行比较。如果存在差异,我需要更改本地字符串以反映远程字符串。到目前为止,我的尝试: 我使用awk抓取了本地字符串,并将其分配给变量。很容易。我通过ssh登录到远程服务器,并尝试使用相同的方法将远程字符串分配给变量。据我所知,这似乎是有效的。问题是该变量没有带回本地机器的值(如果这有意义的话)。这是我尝试这样做的方式:
#!/bin/bash
fileName="myFile.txt"
logon="myUserName@remoteServer.com"
localString=$(awk -F "<tag3>" '{print $2}' $fileName)
x=$(ssh $logon "remoteString=$(awk -F "<tag3>" '{print $2}' $fileName); echo $remoteString")
echo "remote string = $x"
if [ $localString == $x ]; then
echo "The 2 auth keys are EQUAL!!!"
else
echo "The 2 auth keys are NOT equal!!!"
fi
我可以看到在echo $remoteString时变量被赋值,根据我的理解,这是在远程服务器上发生的,因为我正确地将字符串打印到控制台后跟着"command not found"。下一行输出"remote string = "。所以$x要么失去了它的值,要么从未得到正确的赋值。我已经尝试过多次变化$x被赋值的那一行,但都没有成功。
其他想法: 如果这不可能实现,我开始认为也许我需要通过scp命令将文件复制到我的服务器上,进行比较,然后删除复制的文件。在将其移动到我的本地机器之前,需要更改副本的名称,否则我将覆盖我的文件。此外,似乎更有效率的方法是不必创建一个安全的拷贝,因为此脚本将在许多机器上运行,且该文件的大小可能会很大,超过3行。我已经研究了diff命令,但无法找到一种只比较单行的方法。
我对bash编程相对较新,如果我漏掉了明显的东西,请谅解。感谢您的任何帮助,十分感激。
fileName
和logon
。我正在对localhost
运行它,所以两个awk
都是使用相同的文件执行的。文件内容是你在问题中发布的那3行。我不知道你的系统是否有任何差异。可能会有什么问题吗? - mgarciaisaiassh
连接到localhost
。如果可以连接成功,那么问题可能出在远程文件、awk
或者是 shell 上?看起来很奇怪... - mgarciaisaia