3

私は高低を検索しましたが、この問題の解決策を見つけることができないようです(おそらくそれは存在しませんか?)。これが私の問題です:

ローカルマシンにmyFile.txtというファイルがあります。同じ名前のファイル(myFile.txt)がリモートマシンにあります。両方のファイル構造は次のようになります。

<tag1>November 22, 2012<tag1>
<tag2>version5.8<tag2>
<tag3>ASDFA23RASDF29ASDJ29DJ2<tag3>

どちらのファイルもまったく同じレイアウトです。<tag3>2つのファイル(ローカルとリモート)の文字列の同期を維持するスクリプトを作成する必要があります。リモートサーバーから文字列を取得<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  

$ remoteStringをエコーアウトすると、変数が割り当てられていることがわかります。私の理解では、これはリモートサーバーで発生していますが、コンソールに正しい文字列が出力され、その後に「コマンドが見つかりません」と表示されます。次の行はechoの「remotestring="」です。したがって、$ xはその値を失っているか、適切に割り当てられていません。$ xが何度も割り当てられるこの行を変更しようとしましたが、うまくいきませんでした。

その他のアイデア:これが不可能な場合は、ファイルのscpを実行し、サーバーに持ってきて比較し、コピーしたファイルを削除する必要があるのではないかと考え始めています。ローカルマシンに移動する前に、コピーの名前を変更する必要があります。そうしないと、ファイルが上書きされます。また、このスクリプトは多くのマシンで実行する必要があり、ファイルは3行よりもはるかに大きくなる可能性があるため、安全なコピーを作成する必要がない方が効率的と思われます。diffを調べましたが、1行だけを比較する方法が見つかりません。

私はbashスクリプトにかなり慣れていないので、明らかな何かが欠けている場合はご容赦ください。大変感謝しておりますので、よろしくお願いします。

4

3 に答える 3

1

sshコマンドにはエスケープの問題があります。パラメーター$内でエスケープする必要があります。ssh

次に、 を だけに置き換えましremoteString=$(awk ....); echo $remoteStringawk ....。そうでない場合は、文字列が一致しない先頭の空白行に問題があり、コマンドの出力をechoing するためだけに保存​​するのはかなり役に立たないようです。

#!/bin/bash

fileName="myFile.txt"
logon="myUserName@remoteServer.com"


localString=$(awk -F "<tag3>" '{print $2}' $fileName)

x=$(ssh $logon "awk -F '<tag3>' '{print \$2}' $fileName")
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
于 2012-11-22T18:11:19.280 に答える
1

次の行に沿って何かを使用できます。

#!/bin/bash 
fileName="myFile.txt"
logon="myUserName@remoteServer.com"

sedcommand='/^<tag3>.*<tag3>$/{s/<tag3>\(.*\)<tag3>/\1/p;q}'

localString=$( sed -n $sedcommand "$fileName" )
remoteString=$( ssh "$logon" "sed -n '$sedcommand' \"$fileName\"" )

if [[ $localString == $remoteString ]]; then
    echo "The 2 auth keys are EQUAL!!!"
else
    echo "The 2 auth keys are NOT equal!!!"
fi

(これはあなたの方法よりも簡単に思えます)。このコマンドは、で始まり、で終わるsed行の最初の出現を検出し、タグを削除して、「認証キー」のみを転送します。存在しないファイルや、タグが見つからないことに対する保護はありません。この詳細は読者に委ねます。しかし、スクリプトはファイル名のスペースに関して安全であり、ネストされた 2 つのサブシェルを使用しません!<tag3><tag3>

于 2012-11-22T18:58:38.330 に答える
0

この行を変更してみてください:

x=$(ssh $logon "remoteString=$(awk -F "<tag3>" '{print $2}' $fileName); echo $remoteString")

x=$(ssh $logon "remoteString=$(awk -F '<tag3>' '{print $2}' $fileName); echo $remoteString")

すなわち:"<tag3>"に変更'<tag3>'

二重引用符の現在の使用は、実際には ssh コマンドの意図された使用法を壊しているように感じます。


[補足として、条件テスト用に単一の場合は、常に変数を二重引用符で囲みます。

if [ $localString == $x ]; then

次のように安全です:

if [ "$localString" == "$x" ]; then

また

# this also works, but less portable
if [[ $localString == $x ]]; then

その理由は、いずれかの変数が null 文字列 (この場合xは空であると仮定) に評価される場合、bash は代わりに次のように表示されるためです。if [ ASDFA23RASDF29ASDJ29DJ2 == ]; then

于 2012-11-22T17:34:58.533 に答える