xSSH

xSSHとは?

xSSHはLinuxで動作するインフラエンジニア向けのログ取得ツールです。

JSON形式の設定ファイルを使ってネットワーク機器やサーバーのログを取得します。大量の機器でも効率良くログを取得できるように並行処理を取り入れていますが、Communityエディションは同時に2接続に制限しています(PersonalエディションとProfessionalエディションは制限なし)。

動作環境とダウンロード

xSSHはコンパイル済みファイルでの提供となり、現在はGNU Linux(amd64)向けのみ提供しています。

xssh-community-linux_amd64_v1.1

Professionalエディションについては以下のページをご覧ください。

https://netwiz.co.jp/xssh-professional/

xSSHを使うメリット

インフラエンジニアがログ取得に使うツールの代表格と言えばTera Termマクロだと思います。

Tera Termマクロは非常に簡単に開発できて便利なのですが、同時に多数の機器にログインしてログを取得しようとするとフリーズしたりログが正常に取得でいないなどの問題が発生することが多々あります。また、特定の文字列を受信するまで待ち受けるというexpectのような使い方をすることが多く、プロンプトを誤検知して正常にログが取得できない場合があるという問題がありました。

xSSHは特定の文字列を待ち受けるのではなく、受信データはすべて取得する仕様です。そのためログが途中で途切れるという心配はありません。また、同時に複数台の機器へログインするため非常に高速です。

その他のメリットはFortigateのVDOMやA10のパーティション、Ciscoのenableモード、SRXのシェルモード・オペレーションモード・コンフィグレーションモードに対応している点です(後述)。

使い方

いくつかのオプションがありますが、-configオプションでコンフィグファイル名を指定するだけで実行できます。

$ xssh -config target.json

実行すると~/xssh/YYYYMMDDにログを保存します。拡張子は付かないので、拡張子を付けたい場合は-suffixオプションを使います。

$ xssh -config target.json -suffix .log

ログファイルの先頭に文字列を付加したい場合、-prefixオプションを使います。作業前と作業後でログファイル名を分けるとき「before-」「after-」のような文字列をログファイル名に付けたい場合に使います。

$ xssh -config target.json -prefix before-

ログディレクトリのデフォルトは~/xssh/YYYYMMDDですが、変更したい場合は-logdirオプションを使います。

$ xssh -config target.json -logdir /path/to/dir

ログディレクトリを毎回オプションで指定することが面倒な場合は環境変数XSSH_LOGDIRを設定することができます。bashをご利用の方は~/.bashrcなどで以下のように設定します。

export XSSH_LOGDIR=/path/to/dir

ログ出力を詳細にしたい場合は-vオプションを使います。これは好みの問題です。

$ xssh -config target.json -v

実行すると次のようにログを取得します(Communityエディションなので同時接続数が2台に制限されています)。


$ ./xssh-community-linux_amd64 -config ~/target.json
xSSH version 1.00 Community
Max Proccess: 2
Connection limit: 2
Target: 7 hosts
Log directory: /tmp/xxx
Config file: /home/shj/target.json
-------------------------------------------------------------------------------
2023/12/10 11:03:39 [Fail]192.168.218.128: dial tcp 192.168.218.128:22: connect: no route to host
2023/12/10 11:03:40 192.168.0.123: Login successful
2023/12/10 11:03:46 [Fail]10.0.0.1: dial tcp 10.0.0.1:22: i/o timeout
2023/12/10 11:03:46 192.168.0.124: Login successful
2023/12/10 11:03:58 192.168.0.123: Done
2023/12/10 11:03:59 192.168.0.124: Done
2023/12/10 11:03:59 192.168.0.48: Login successful
2023/12/10 11:04:09 [Fail]devspace: dial tcp 192.168.0.107:22: i/o timeout
2023/12/10 11:04:09 192.168.0.3: Login successful
2023/12/10 11:04:21 192.168.0.48: Done
2023/12/10 11:04:21 192.168.0.3: Done
-------------------------------------------------------------------------------
44.39 seconds in proccess
$

Professionalエディションでは次のようにすべての機器へ同時にログインしているため、Communityエディションと比較すると高速です。

$ ./xssh-pro-linux_amd64 -config ~/target.json
xSSH version 1.00 Professional
Max Proccess: 8
Connection limit: 7
Target: 7 hosts
Log directory: /tmp/xxx
Config file: /home/shj/target.json
-------------------------------------------------------------------------------
2023/12/10 11:05:09 192.168.0.3: Login successful
2023/12/10 11:05:09 192.168.0.124: Login successful
2023/12/10 11:05:10 192.168.0.48: Login successful
2023/12/10 11:05:10 192.168.0.123: Login successful
2023/12/10 11:05:12 [Fail]192.168.218.128: dial tcp 192.168.218.128:22: connect: no route to host
2023/12/10 11:05:19 [Fail]10.0.0.1: dial tcp 10.0.0.1:22: i/o timeout
2023/12/10 11:05:19 [Fail]devspace: dial tcp 192.168.0.107:22: i/o timeout
2023/12/10 11:05:21 192.168.0.124: Done
2023/12/10 11:05:22 192.168.0.3: Done
2023/12/10 11:05:28 192.168.0.123: Done
2023/12/10 11:05:28 192.168.0.48: Done
-------------------------------------------------------------------------------
18.94 seconds in proccess
$

Professionalエディションの同時接続数の上限値はデフォルトでは論理CPU数(スレッド数)x 5です。たとえば4コア8スレッドのCPUを利用している場合は同時接続数が最大で40になります。同時接続数の上限値を増やしたり減らしたりしたい場合は後述するglobal設定で変更します。

設定ファイルを作成する

設定ファイルはJSON形式です。設定は大きく分けるとglobal(グローバル設定)とtargets(個々の接続先設定)の2つあります。

最小限の設定例

細かい設定方法を解説する前に必要最小限の設定例を掲載します。

最低でも次のようなコンフィグになります。typeを指定しないので、typecommonになります。

{
  "targets": [
    {
      "host": "192.168.0.1",
      "user": "foo",
      "password": "passw@rd",
      "shell": {
        "command": [ "command1" ]
      }
    }
  ]
}

このコンフィグを使うと、192.168.0.1にSSHログインして「comand1」を実行します。ログイン時のユーザーは「foo」でパスワードは「passw@rd」となります。

ログファイルはhostで設定している「192.168.0.1」になります。ログファイル名を変更したい場合はlogfileで指定します。次の例では「example.com」というファイル名でログが保存されます。

{
  "targets": [
    {
      "host": "192.168.0.1",
      "user": "foo",
      "password": "passw@rd",
      "shell": {
        "command": [ "command1" ]
      },
      "logfile": "example.com"
    }
  ]
}

global(グローバル設定)

グローバル設定は全体的な設定をおこないたい場合に使います。この設定は実行時のオプションや個々の接続設定で上書きされる場合があります。

{
  "global": {
    "connection_limit": 0,
    "log_suffix": "",
    "log_prefix": "",
    "ssh_timeout": 5,
    "logdir": ""
  },
  "targets": [
    {

設定の説明は以下のとおりです。connection_limitについては、Communityエディションでは最大値が2に制限されます。

設定名種類設定の説明デフォルト値
connection_limitint同時接続数の最大値論理CPU数 x 5
log_suffixstringログファイル拡張子(空)
log_prefixstringファイル名のプレフィックス(空)
ssh_timeoutintSSHログインが完了するまでのタイムアウト値(秒)5
logdirstringログディレクトリ$HOME/xssh/日付
global設定

targets(個々の接続設定)共通設定

個々の接続設定は、ベースとなる共通部分と接続先のタイプによって変わる設定があります。すべての接続設定で共通なのは以下の設定です。

{
  "targets": [
    {
      "type": "common",
      "host": "",
      "logfile": "",
      "ssh_timeout": 5,
      "auth_method": "password",
      "user": "",
      "password": "",
      "key": {
        "file": "",
        "passphrase": ""
      }
    }
  ]  
}

設定の説明は以下のとおりです。

設定名値の種類設定の説明初期値
typestringcisco / bigip / a10 / fortigate / srxを指定すると、各機器に応じた設定ができます。それ以外の機器では自由にホストタイプを指定でき、未指定の場合はcommonとなります。common
hoststring接続先のホスト名もしくはIPアドレス(空)
portintSSHの接続ポートが22番でない場合に指定します22
logfilestring未指定の場合はhostで指定したホスト名/IPアドレスがファイル名になります「host」の指定値
ssh_timeoutintSSHログインが完了するまでの待ち時間(秒)5
auth_methodstring認証方式を指定します
password / passwd … パスワード認証
publickey / pubkey / key … 公開鍵認証
keyboard-interactive / challenge-response / challenge … キーボードインタラクティブ認証(チャレンジレスポンス)

デフォルトはpasswordです
password
userstringログインユーザー名を指定します(空)
passwordstringログインパスワードを指定します(空)
key/filestring秘密鍵のフィアルパス(空)
key/passphrasestring秘密鍵のパスフレーズ(空)
全ホストタイプ共通の設定

targets(個々の接続設定)タイプ別設定

typeを設定することによって機器の特性に合わせた挙動をさせることができます。利用できるtypeは以下のとおりです。

type機能
common・SSHログインしてコマンドを実行できる(デフォルト)
cisco・enableモードに切り替えてコマンドを実行できる
・自動的に「terminal length 0」「terminal width 0」を実行する
bigip・認証方式を指定していない場合、自動的にキーボードインタラクティブ認証を実行する
・tmshモードに切り替えてコマンドを実行できる
fortigate・vdomを切り替えてコマンドを実行できる
・globalモードに切り替えてコマンドを実行できる
a10・enableモードに切り替えてコマンドを実行できる
・パーティションを切り替えてコマンドを実行できる
srx・シェルモードに切り替えてコマンドを実行できる
・オペレーションモードに切り替えてコマンドを実行できる
・コンフィグレーションモードに切り替えてコマンドを実行できる
vdx・自動的に「terminal length 0」を実行する
ホストタイプと機能

Cisco機器にログインするから必ずしもtypeciscoを選択しなければいけない、というわけではありません。Fortigateでもtypecommonを指定して、コマンドでVDOM切り替えをおこなうこともできます。

あくまでも、typeを指定するとxSSHが機種別の特定機能をサポートする、というだけです。

common

設定でtypeを指定しない場合、もしくは未知のtypeを指定した場合はcommonとなります。

commonで設定できるのはshellのみです。

{
  "targets": [
    {
      "type": "common",
      "host": "",
      "logfile": "",
      "ssh_timeout": 5,
      "auth_method": "password",
      "user": "",
      "password": "",
      "key": {
        "file": "",
        "passphrase": ""
      },
      "shell": {
        "command": [ "" ],
          "file": [ "" ]
      }
    }
  ]  
}

commandは実行させたいコマンドを直接記述します。配列なので複数指定可能です。

"command": [ "command1", "command2" ],

fileはコマンドを記述したファイルを指定します。このファイルを読み込んでコマンドを実行します。これも配列なので複数指定可能です。

"file": [ "/path/to/file", "/path/to/file2" ]

cisco

typeciscoを指定した場合、以下の2つの機能が追加されます。

  • ログイン後にterminal length 0terminal width 0が送信される
  • enableモードに遷移できる

enalbeモードに遷移しない場合、typeciscoを指定する必要はなくcommonで十分です。

{
  "targets": [
    {
      "type": "cisco",
      "host": "",
      "port": 22,
      "logfile": "",
      "ssh_timeout": 5,
      "auth_method": "password",
      "user": "",
      "password": "",
      "key": {
        "file": "",
        "passphrase": ""
      },
      "cisco": {
        "shell": {
          "command": [ "" ],
          "file": [ "" ]
        },
        "enable": {
          "password": "",
          "command": [ "" ],
          "file": [ "" ]    
        }
      }
    }
  ]
}

ログイン後にコマンドを実行したい場合はshellで指定します。これだけであればtypecommonを指定するのと変わりません。

ログイン後にenableモードに遷移したい場合はenableを指定していください。passwordenableパスワードを指定します。

commandfiletypcommonを指定したときと同様にコマンドを直接記述したりコマンドファイルを指定できます。

bigip

typebigipを指定した場合、以下の2つの機能が追加されます。

  • ログイン方法がキーボードインタラクティブ認証に変更される(鍵認証を選択していない場合)
  • TMSHに遷移できる

TMSHに遷移する必要がない場合、typecommonを指定できます。その場合は認証方法を適切に設定してください。

{
  "targets": [
    {
      "type": "bigip",
      "host": "",
      "port": 22,
      "logfile": "",
      "ssh_timeout": 5,
      "auth_method": "",
      "user": "",
      "password": "",
      "key": {
        "file": "",
        "passphrase": ""
      },
      "bigip": {
        "shell": {
          "command": [ "" ],
          "file": [ "" ]
        },
        "tmsh": {
          "command": [ "" ],
          "file": [ "" ]
        }
      }
    }
  ]
}

commandfiletypcommonを指定したときと同様にコマンドを直接記述したりコマンドファイルを指定できます。

fortigate

typefortigateを指定した場合、以下の2つの機能が追加されます。

  • globalモードに遷移できる
  • VDOMを切り替えることができる

事前にVDOMチェックをおこなうので、存在しないVDOMを誤って指定しても新規にVDOMが作成されることを防ぎます。VDOM切替が不要の場合、typecommonを指定できます。

{
  "targets": [

    {
      "type": "fortigate",
      "host": "",
      "port": 22,
      "logfile": "",
      "ssh_timeout": 5,
      "auth_method": "password",
      "user": "",
      "password": "",
      "key": {
        "file": "",
        "passphrase": ""
      },
      "fortigate": {
        "global": {
          "command": [ "" ],
          "file": [ "" ]
        },
        "shell": {
          "command": [ "" ],
          "file": [ "" ]
        },
        "vdom": [
          {
            "name": "",
            "command": [ "" ],
            "file": [ "" ]
          }
        ]
      }
    }
  ]
}

globalはglobalモードに切り替えてコマンドを実行したい場合に使います。

globalの下にあるshellはglobalモードへの切り替えやVDOM切り替えをせずにコマンドを実行したい場合に使います。

vdomはVDOM切り替えをしたい場合に使います。nameでVDOM名を指定してください。vdomは配列なので複数指定できます。

        "vdom": [
          {
            "name": "",
            "command": [ "" ],
            "file": [ "" ]
          },
          {
            "name": "",
            "command": [ "" ],
            "file": [ "" ]
          }
        ]

a10

typea10を指定した場合、以下の2つの機能が追加されます。

  • enableモードに遷移できる
  • パーティションを切り替えることができる

enableモードを使わない場合やパーティションの切り替えが不要の場合、typecommonを指定できます。

{
  "targets": [
    {
      "type": "a10",
      "host": "",
      "port": 22,
      "logfile": "",
      "ssh_timeout": 5,
      "auth_method": "password",
      "user": "",
      "password": "",
      "key": {
        "file": "",
        "passphrase": ""
      },
      "a10": {
        "shell": {
          "command": [ "" ],
          "file": [ "" ]
        },
        "enable": {
          "password": "",
          "command": [ "" ],
          "file": [ "" ]    
        },
        "partition": [
          {
            "name": "",
            "command": [ "" ],
            "file": [ "" ]
          }
        ]
      }
    }
  ]
}

shellはログイン後に実行したいコマンドを指定します。これだけであればtypecommonを指定した場合と変わりません。

enableはenableモードに遷移してコマンドを実行したい場合に使います。

partitionはパーティションを切り替えてコマンドを実行したい場合に使います。nameでパーティション名を指定してください。partitionは配列なので複数指定できます。

"partition": [
  {
    "name": "",
    "command": [ "" ],
    "file": [ "" ]
  },
  {
    "name": "",
    "command": [ "" ],
    "file": [ "" ]
  }
]

srx

typesrxをした場合、以下の3つの機能が追加されます。

  • シェルモードに切り替えてコマンドを実行できる
  • オペレーションモードに切り替えてコマンドを実行出来る
  • コンフィグレーションモードに切り替えてコマンドを実行できる

{
  "targets": [
    {
      "type": "srx",
      "host": "",
      "port": 22,
      "logfile": "",
      "ssh_timeout": 5,
      "auth_method": "password",
      "user": "",
      "password": "",
      "key": {
        "file": "",
        "passphrase": ""
      },
      "srx": {
        "shell": {
          "command": [ "" ],
          "file": [ "" ]
        },
        "operation": {
          "command": [ "" ],
          "file": [ "" ]
        },
        "configuration": {
          "command": [ "" ],
          "file": [ "" ]
        }
      }
    }
  ]
}

shellを使うとシェルモードに切り替えてコマンドを実行できます。

operationを使うとオペレーションモードに切り替えてコマンドを実行できます。

configurationを使うとコンフィグレーションモードに切り替えてコマンドを実行できます。

vdx

typevdxを指定した場合、以下の機能が追加されます。

  • ログイン後にtermilan length 0が送信される
{
  "targets": [
    {
      "type": "vdx",
      "host": "",
      "port": 22,
      "logfile": "",
      "ssh_timeout": 5,
      "auth_method": "password",
      "user": "",
      "password": "",
      "key": {
        "file": "",
        "passphrase": ""
      },
      "vdx": {
        "command": [ "" ],
        "file": [ "" ]
      }
    }
  ]
}

複数の接続先を設定する

設定のtargetsは配列です。そのため、次のように複数の接続先設定が可能です。

{
  "targets": [
    {
      "host": "192.168.0.1",
      "user": "foo",
      "password": "passw@rd",
      "shell": {
        "command": [ "command1" ]
      }
    },
    {
      "host": "192.168.0.2",
      "user": "admin",
      "password": "passw@rd",
      "fortigate": {
        "vdom": {
          "name": "root",
          "command": [ "show" ]
        }
      }
    },
    {
      "host": "192.168.0.3",
      "user": "admin",
      "password": "passw@rd",
      "cisco": {
        "enable": {
          "password": "secretPassw@rd",
          "command": [ "show run" ]
        }
      }
    }
  ]
}

サポート

Professionalエディションユーザーの方は、ライセンスIDを記載の上 support@netwiz.co.jp までお問い合わせください。