% netの使用とデバッグ.ssh.SSH接続用のセッション


% netssh.Sessionクラスでは、SSHを使用してサーバーに接続できます.特にFTPのインバウンドとアウトバウンドアダプタでは、SFTPで最も一般的に使用されます.
この記事では、クラスを使用してSSHサーバーに接続する方法の簡単な例を示します.認証のためのオプションを記述します.
以下に接続の例を示します.
Set SSH = ##class(%Net.SSH.Session).%New()
Set return=SSH.Connect("ftp.intersystems.com")​
これは新しい接続を作成し、FTPに接続します.インターシステムズ.デフォルトのポートでCOM SFTPサーバ.この時点で、クライアントとサーバーは、暗号化アルゴリズムとオプションを選択したが、ユーザーがまだログインしていません.
一度接続したら、認証する方法を選択できます.次の3つの方法があります.
  • AuthenateWithUsername
  • AuthenateWirelessキーペア
  • AuthenateWithKeyboardInteractive
  • これらはそれぞれ異なったタイプの認証です.以下に、それぞれのタイプについて簡単に紹介します.

    AuthenticateWithUsername


    これはユーザ名とパスワードを使用します.

    AuthenticateWithKeyPair


    これは、公開鍵と秘密鍵のペアを使用します.公開鍵はサーバーにプリロードされている必要がありますし、一致する秘密キーを持っている必要があります.プライベートキーがディスク上に暗号化されている場合は、メソッドへの呼び出しにおいてパスフレーズを復号化する必要があります.注:あなたは誰にも秘密鍵を送るべきではありません.
    公開キーはOpenSSH形式で、プライベートキーはPEMエンコードされるべきです.OpenSSH形式は次のようになります.
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCfi2Vq+u0rtt2OC84pyrkq1k7WkrS+s76u3a+2gdD43KQ2Z3vSUUfksymJjp11JBZEpOtBVIAy221UKdc7j7Qk6sUjZaK8LIy+bzDVwMyFWgVvQge7EjdWjrJLBRCDXYML6y1Y25XexThkTWSGyXzGNdr+wfIHYn/mIt0hfvrusauvT/9Wz8K2MGAj4BL7UQZpFJrlXzGmewe6++6cZDQQYi0aztwLK798oc9j0LsccdMpqWrjqoU1uANFhYIuUu/T47TEhT+e6M+KFYK5TR998eJTO25IjdN2Tgw0feXhQFF/nngbol0bA4auSPaZQsgokKK+E+Q/8UtBdetEofuV user@hostname
    
    PEMエンコードされた秘密鍵には、以下のようなファイルの先頭にヘッダがあります.
    -----BEGIN RSA PRIVATE KEY-----
    
    で終わる
    -----END RSA PRIVATE KEY-----
    

    を認証する


    これはキャッシュ2018.1以降で利用できる新しいオプションです.それはあなたの挑戦と応答認証を実行することができます.たとえば、テキストメッセージを介して送信されるか、Googleの認証アプリによって生成された一度のコードを求めることがあります.この形式の認証を使用するには、サーバーが送信するプロンプトを処理するためにラムダ関数を記述する必要があります.
    ユーザにパスワード認証と同じように、ユーザ名とパスワードプロンプトでこれを使用してサーバーを見ることができます.以下に記述されているsshデバッグフラグは、あなたがこれを見ているかどうかを判断するのに役立ちます.
    認証に関する最終的な注意:1つの接続のために2つの形式の認証を使用することに興味があるならば、あなたは、キャッシュ2018.1またはシステム間アイリスのどんなバージョンも使っていることを確認してください.このバージョンでは、キーペアやユーザー名などの複数のフォームの使用を許可するように更新されます.

    何が悪いときに物事を行う。


    一般的なエラーには以下が含まれます。


    バナー失敗


    これは次のようになります.
    ERROR #7500: SSH Connect Error '-2146430963': SSH Error [8010100D]: Failed getting banner [FFFFFFFF8010100D] at Session.cpp:231,0
    
    バナーを取得するのはSSHクライアントが最初に行うことです.あなたがこのエラーを見ているならば、あなたは正しいサーバーに接続していて、それがSFTPサーバであると確認するべきです.
    例えば、サーバが実際にftpsサーバならば、このエラーが表示されます.FTPSサーバはSSLではなくSSLを使用します.したがって% netでは動作しません.ssh.セッションクラス.% netを使用できます.ftpsessionクラスftpsサーバに接続します.

    暗号化キーを交換できません


    このエラーは次のようになります.
    ERROR #7500: SSH Connect Error '-2146430971': SSH Error [80101005]: Unable to exchange encryption keys [80101005] at Session.cpp:238,0
    
    このエラーは通常、クライアントとサーバが暗号化やMACアルゴリズムに同意できないことを意味します.あなたがこれを見るならば、あなたは新しいアルゴリズムの支持を加えるためにクライアントかサーバのどちらかをアップグレードする必要があるかもしれません.
    2017.1以前にキャッシュのバージョンを使用しているなら、2017.1またはそれ以降を試してみてください.libssh 2ライブラリは2017.1でアップグレードされ、複数の新しいアルゴリズムを追加しました.
    下記のデバッグフラグによって提供されるログの詳細を見つけることができます.

    公開キーの無効な署名


    Error [80101013]: Invalid signature for supplied public key, or bad username/public key combination [80101013] at Session.cpp:418
    
    このエラーはかなり誤解を招く可能性があります.あなたのサーバーが認証の2つのフォームを望んでいるならば、あなたはこれを見るでしょう、そして、あなたは1つだけを提供しました.その場合は、行くし、次のいずれかを試し続ける!万事うまくいっている.

    エラー- 37


    エラー- 37に関するメッセージを見ることができます.たとえば、デバッグログにあります.
    [libssh2] 0.369332 Failure Event: -37 - Failed getting banner
    
    任意の時間エラー- 37が表示され、失敗した操作が再試行されます.このエラーは最終的な失敗の原因ではありません.他のエラーメッセージをチェックします.

    SSHの展開フラグ


    SSH接続の詳細なログは、SSHデバッグフラグを使用して接続を有効にすることができます.フラグはSetTraceMethodメソッドで有効になります.以下に例を示します:
    Set SSH = ##class(%Net.SSH.Session).%New()
    Do SSH.SetTraceMask(511,"/tmp/ssh.log")  
    Set Status=SSH.Connect("ftp.intersystems.com")​ 
    
    setTraceMaskへの最初の引数は何を集めるかを指示します.ビットの10進表現です.511は512以外の全てのビットを要求し、最もよく使われる設定である.各ビットについてもっと知りたい場合は、% netのクラスドキュメンテーションに記載されています.ssh.セッションクラス.
    番目の引数は、どのようなファイルに接続に関するログ情報を入れるかを指示します.この例では、/tmp/sshファイルを使いました.ログインするが、使用する任意の絶対または相対パスを入力することができます.
    上の例では、connectメソッドを実行しました.あなたの問題が認証にあるならば、あなたは同様に適切な認証メソッドを走らせる必要があるでしょう.
    テストを実行したら、ログファイルをチェックすることができます.ログファイルを解釈する方法がわからなければ、WRCは助けることができます.