2016-04-01 14 views
0

リモートサーバ(Box1)の1つにログインし、リモートサーバ(Box1)で1つのファイルを読み込もうとしています。 これは、別のサーバー(Box2)の詳細を含み、その詳細に基づいて、私はローカルサーバーに戻り、別のサーバー(Box2)にsshを送信してデータを処理しなければなりません。ように.....Unixサーバで変数を宣言する

ssh box1.com << EOF 
    if [[ ! -f /home/rakesh/tomar.log ]] 
    then 
    echo "LOG file not found" 
    else 
    echo " LOG file present" 
    export server_node1= `cat /home/rakesh/tomar.log` 
    fi 
    EOF 

    ssh box2.com << EOF 
    if [[ ! -f /home/rakesh/tomar.log ]] 
    then 
    echo "LOG file not found" 
    else 
    echo " LOG file present" 
    export server_node2= `cat /home/rakesh/tomar.log` 
    fi 
    EOF 

が、私は「server_node1」と、ローカルマシン上の「server_node2」の値を取得しておりません。

助けていただければ幸いです。

+0

あなたは '[[[! -f]] 'ではなく、'/home/rt9419'を 'cat'に入れます。あなたは本当に1つのファイルの存在を確認してから、別の目的でファイルを取得していますか、それとも間違っていますか? – tripleee

+0

私の悪い! 訂正します。ありがとうございました – rKSH

答えて

1

bash -c 'export foo=bar'と同じように、入力した呼び出し元シェルで変数を宣言できません。sshコマンドは、呼び出し元シェルで変数を宣言できません。呼び出すシェルが情報を受け取り、それをどうするかを知るように、リファクタリングする必要があります。

変数にログファイルを保存するのはおそらくまともではない、あるいは少なくともエレガントなことではないという意見に同意しますが、あなたが試みていることを簡単に行う方法は、sshを割り当て内に置くことです。

server_node1=$(ssh box1.com cat tomar.log) 
server_node2=$(ssh box2.com cat tomar.log) 

いくつかの注意事項および増幅:

  • リモートシェルは、自分のホームディレクトリで実行されますので、私は(/home/rt9419は明らかに、あなたホームディレクトリであると仮定して)、それを取り出しました。 catコマンドにエラーが発生した場合には
  • sshの終了コードがcatからのエラーコードになり、標準エラーにエラーメッセージが標準エラーに表示されますので、echoはかなり余計に見えました。 (カスタムメッセージが必要な場合は、variable=$(ssh whatever) || echo "Custom message" >&2となります。標準エラーへのリダイレクトに注意してください。ここで問題はないようですが、良い形式です)。
  • 本当にしたい場合は、任意の複雑なコマンドはsshです。上に概説したように、ここでは必要ないように見えますが、assigment=$(ssh remote 'if [[ things ]]; then for variable in $(complex commands to drive a loop); do : etc etc; done; fi; more </dev/null; exit "$variable"')などを使用できます。あなたのオリジナルの試みで、さらにコメントとして

  • sshコマンドも実行する前に、ここであなたの試みで、文書があなたの地元シェルによって評価されるでバッククォート。それを修正する方法については別個の質問があります。例えば、 How have both local and remote variable inside an SSH command.しかし、要するに、送信したコマンドをローカルシェルが変更できるようにする必要がある場合を除き、上記の愚かな複合体sshの例のように、おそらく一重引用符で囲みます。
  • exportの機能は、変数を子に表示することです。プロセス。親プロセスの環境に影響を与える方法はありません(上のコードのように、協調させたり、変更を調整したりするのには不十分です)。違いを説明する例として、PERL5LIBをPerlライブラリのあるディレクトリに設定しても、exportに失敗した場合、起動するPerlプロセスには変数が表示されません。現在のシェルでのみ表示されます。 exportとすると、このシェルの子として起動するPerlプロセスには、この変数と割り当てた値も表示されます。言い換えれば、現在のシェルに対してプライベートではない変数(exportプライベートなものではなく、それらがプライベートであることを確認する以外に、プロセス間でコピーする必要があるメモリの量を節約します)でも、 U * xプロセスアーキテクチャーの設計によって、それらを子供に見えるようにします。
0

あなたはscpbox1box2からファイルを取り戻す必要があります。

scp box1.com:/home/rt9419/tomar.log ~/tomar1.log 
#then you can cat! 
export server_node1=`cat ~/tomar1.log` 

同上

scp box2.com:/home/rt9419/tomar.log ~/tomar2.log 
#then you can cat! 
export server_node2=`cat ~/tomar2.log` 
+0

私はログファイルが実行可能だとは思わない;-)。また、OPポスターは、ログファイルの* content *を変数に格納することを望んでいます(これは奇妙ですが、彼がここで何をしているのかを知りたいと思っています)。 – user1934428

+0

申し訳ありませんが、コピー/貼り付けの問題があり、不足している 'cat'sを追加しました –

-1

box2でいくつかの可能性があります。あなたのログファイルの全体の内容はなりたい理由私は思ってしまう自分の場合は、リモート・システム上で、これらの変数の割り当てを含む、(bashの構文で)ファイルを作成することができ、例えば

echo "export server_node2='$(</home/rt9419/tomar.log)'" >>export_settings 

(変数に格納されますが、これは別の質問です)、このファイルをホスト(たとえばscp)に転送し、bashスクリプトからソースを取得します。

+0

次にログファイルを直接コピーしてそこから取り出してみませんか?ログファイルに1つの引用符が含まれていると、これが原因で中断され、そうでなければあまりにも脆いようです。 – tripleee