2016-06-24 5 views
0

jenkinsマシンからリモートサーバー上で一連のコマンドを実行しようとしています。 これらのコマンドは、ものsshを使ってリモートで実行されたgrepコマンドの出力を変数に保存しますか?

  1. 次のスクリプト、私はスクリプトの下に作成した

そのディレクトリにリモートサーバーからのいくつかのファイル

servername=<remote server ip> 

    sshuserconnect() { 
     echo `/usr/bin/sshpass -p passwd ssh -o ConnectTimeout=5 -o UserKnownHostsFile=knownhosts -o StrictHostKeyChecking=no $*` 
    } 

sshuserconnect [email protected]$servername << ENDOFSSH 

    sqlplus -s /nolog <<EOF> /home/user/output.txt 
    connect user/[email protected]$servername:<port>/<DB schema> 
    select column1||','||value from table where column1 like 'param1'; 
    EOF 

    version=`grep version /home/user/output.txt | cut -f 2 -d ","` 
    mkdir /home/user/${version} 

ENDOFSSH 

をリモートサーバ上のディレクトリ

  • コピーを作成します以下のエラーで失敗する

    grep: output.txt: No such file or directory 
    Pseudo-terminal will not be allocated because stdin is not a terminal. 
    

    一部のデバッグの後、私はgrepコマンドでのみスクリプトが失敗することがわかりました。バージョン変数へのgrep出力の割り当てが失敗します。

    私は多くのオプションを試しましたが、これが正しい方法ではないと思います。誰も私がこれを解決するのを助けることができますか?

  • +0

    うん、これは次のようになります。私は以下のコードでは、意図的に明示するためにとStackOverflowのスペースとタブをレンダリングするために、コードを貼り付ける&をコピーする意味が正しく動作しないの両方、<TAB>でタブ文字をマーク私には単純なタイプミスです。 'grep | grepの代わりにawkを使うことができます。 cut ': 'awk -F、'/version/{print $ 2} 'output.txt'です。 –

    +0

    ローカルディレクトリがPATHの一部でない場合は、output.txtを./output.txtに変更することをお勧めします。 $ {Version}を$ {version}に変更してください。 – LAROmega

    +0

    @LAROmega、私は質問を編集し、ファイルパスを絶対パスに変更しました。依然としてエラーは同じです。 @TomFenech、私はあなたのアプローチを 'version = 'awk -F'/version/{print $ 2} '/ home/user/output.txt'としました。まだエラーは同じです。 – user3347819

    答えて

    1

    `grep version ...`のスクリプト展開では、リモートシェルではなくローカルシェルによって実行されます。 /home/user/${version}の拡張についても同様です。ここでの拡張機能を使用するサブタイトルは、my answerthe canonical question addressing problems of this kindです。

    スクリプトが混在ケース「3.いくつかの拡張が子シェルで実行する必要があり、いくつかの - 親に」に所属し、その中で議論し、次のように固定されている必要があります

    sshuserconnect [email protected]$servername <<ENDOFSSH 
    
    sqlplus -s /nolog <<EOF > /home/user/output.txt 
    connect user/[email protected]$servername:<port>/<DB schema> 
    select column1||','||value from table where column1 like 'param1'; 
    EOF 
    
    version=\$(grep version /home/user/output.txt | cut -f 2 -d ",") 
    mkdir /home/user/\${version} 
    
    ENDOFSSH 
    

    私は意図的に<<ENDOFSSH here-document内のスクリプトセクションの字下げを取り除いたので、EOFは入れ子になった<<EOF here-documentの終了マーカーとして正しく認識されています。

    1. インデントのすべてが、EOF終了マーカ:

      sshuserconnect use[email protected]$servername <<ENDOFSSH 
      
          sqlplus -s /nolog <<EOF > /home/user/output.txt 
          connect user/[email protected]$servername:<port>/<DB schema> 
          select column1||','||value from table where column1 like 'param1'; 
      EOF 
      
          version=\$(grep version /home/user/output.txt | cut -f 2 -d ",") 
          mkdir /home/user/\${version} 
      
      ENDOFSSH 
      

      これはやや醜いインデントを維持するには、2つの方法があります。

    2. むしろスペースよりもタブがインデント、そして削除されるためにここに文書で有数のタブ文字を起こし<<-ENDOFSSH代わりの<<ENDOFSSHを、使用しています。

      sshuserconnect [email protected]$servername <<-ENDOFSSH 
      
      <TAB>sqlplus -s /nolog <<EOF > /home/user/output.txt 
      <TAB>connect user/[email protected]$servername:<port>/<DB schema> 
      <TAB>select column1||','||value from table where column1 like 'param1'; 
      <TAB>EOF 
      
      <TAB>version=\$(grep version /home/user/output.txt | cut -f 2 -d ",") 
      <TAB>mkdir /home/user/\${version} 
      
      ENDOFSSH 
      
    +0

    良いディスカッション、ニットだけが* 'これについて読む' *リンク 'this'はあなたにもあなたを導いている記事の*完全なタイトル*(または少なくとも記述的な部分文字列)でなければなりません。 –

    +0

    @ DavidC.Rankin提案をいただきありがとうございます。私は答えを更新しましたが、そのタイトルを通して指摘された質問を参照する良い方法を見つけることができませんでした。 – Leon

    +0

    ユーザーの目があなたのリンクを飛ばしていないことを確認するだけの良いものです。もう1つのトリックは、リンクを**太字にすることです。 –

    関連する問題