多段ssh環境でgdbserverを使ってリモートデバックをする
目的
ホストAからgdbserverを使ってホストCでリモートデバックを行う。
ただしホストAもホストCもLANの外からはアクセスできないので、ホストCと同一LAN内にあるLANの外からアクセス可能なホストBを経由してアクセスを行う。
[ 図-1 ]
~/ssh/config
まず、簡単に多段sshを行えるようにするのと同時に後の工程で使うので~/.ssh/にあるconfigを編集する。
~/.ssh/config
Hostname xxx.x.xxx.xxx
Port 22
User user
Host hostC
Hostname 192.168.1.xx
Port 22
User user
ProxyCommand ssh -W %h:%p hostB
これで
と入力すると自動的にhostB経由でhostCに接続されるようになる。
gdbserverについて
次にgdbserverでデバックをするためには、ホストAとホストCにデバックするファイルが存在する必要があるのでその準備をする。今回はホストAで作成したhoge.exeをホストCで動かしたいので、hoge.exeをホストAからホストCにscpコマンドでコピーする。scpコマンドの書式は
である。
今回はカレントディレクトリのhoge.exeをhostCのルートディレクトリにコピーしたいので
と入力すれば良い。
コピー先が"hostC:/"となっているのは、scpが先ほど編集した~/.ssh/configを参照してくれるので多段sshをするのと同じ要領でコピー先を指定することができるからである。
local porting
経由するホスト | hostB |
クライアントのポート | 10000 |
ターゲットのポート | 12345 |
接続するホストのローカルIP | 192.168.1.xx |
gdbserverを使ったリモートデバックではクライアントとターゲット(hostAとhostC)がそれぞれにどのポートを使用するかを指定する。しかし、どちらもLANの外から直接アクセスすることはできないのでトンネリングをする。これによってhostBを経由しながら、あたかもhostAとhostCが直接通信しているかのようにすることができる。トンネリングにはsshの-Lオプションを使う。
[表-1]の条件でトンネリングするには
と入力すれば良い。こうすることにより[ 図-2 ]の様にトンネルが作られる。
[ 図-2 ]
また、-fと-Nオプションを付けて
と入力することにより、sshの実行がトンネリングした後にバックグラウンドでの実行に変わる。
ただ、毎回入力するのは大変なので~/.ssh/configに以下のように書くと
Hostname xxx.x.xxx.xxx
Port 22
User user
Host hostC
Hostname 192.168.1.xx
Port 22
User user
ProxyCommand ssh -W %h:%p hostB
Host tunnel
Hostname xxx.x.xxx.xxx
Port 22
LocalForward 10000 192.168.1.xx:12345
User user
コンソールに
と入力するだけでトンネルを作る事ができる。
ただし、-fと-Nオプションは~/.ssh/configには書くことができないので
と入力する必要がある。
gdbserverの接続
gdbserverを使ってリモートデバックをするには、まずターゲット側でgdbserverを起動する必要がある。今回の条件でgdbserverを起動するには
と入力する。こうするとターゲット側はクライアント側からの接続を待機し始める。
クライアント側では
と入力することでデバッガが起動するので、
と入力する。こうすることで先ほど作ったトンネルを介してリモートデバックをすることができる。