情報系大学生の雑記帳

プログラミングや電子工作などを中心に書いていくつもりです

多段ssh環境でgdbserverを使ってリモートデバックをする

目的

ホストAからgdbserverを使ってホストCでリモートデバックを行う。
ただしホストAもホストCもLANの外からはアクセスできないので、ホストCと同一LAN内にあるLANの外からアクセス可能なホストBを経由してアクセスを行う。
f:id:dwight_1011:20150225031808j:plain
[ 図-1 ]

 




~/ssh/config

まず、簡単に多段sshを行えるようにするのと同時に後の工程で使うので~/.ssh/にあるconfigを編集する。
~/.ssh/config

Host hostB
 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


これで

$ ssh hostC


と入力すると自動的にhostB経由でhostCに接続されるようになる。


gdbserverについて

 次にgdbserverでデバックをするためには、ホストAとホストCにデバックするファイルが存在する必要があるのでその準備をする。今回はホストAで作成したhoge.exeをホストCで動かしたいので、hoge.exeをホストAからホストCにscpコマンドでコピーする。scpコマンドの書式は

$ scp [オプション] コピー元 コピー先


である。
今回はカレントディレクトリのhoge.exeをhostCのルートディレクトリにコピーしたいので

$ scp ./hoge.exe hostC:/


と入力すれば良い。
コピー先が"hostC:/"となっているのは、scpが先ほど編集した~/.ssh/configを参照してくれるので多段sshをするのと同じ要領でコピー先を指定することができるからである。


local porting

[表-1]
経由するホスト hostB
クライアントのポート 10000
ターゲットのポート 12345
接続するホストのローカルIP 192.168.1.xx

gdbserverを使ったリモートデバックではクライアントとターゲット(hostAとhostC)がそれぞれにどのポートを使用するかを指定する。しかし、どちらもLANの外から直接アクセスすることはできないのでトンネリングをする。これによってhostBを経由しながら、あたかもhostAとhostCが直接通信しているかのようにすることができる。トンネリングにはsshの-Lオプションを使う。
[表-1]の条件でトンネリングするには

$ ssh hostB -L 10000:192.168.1.xx:12345


と入力すれば良い。こうすることにより[ 図-2 ]の様にトンネルが作られる。

f:id:dwight_1011:20150225031753j:plain

[ 図-2 ]


また、-fと-Nオプションを付けて

$ ssh hostB -fNL 10000:192.168.1.xx:12345


と入力することにより、sshの実行がトンネリングした後にバックグラウンドでの実行に変わる。
ただ、毎回入力するのは大変なので~/.ssh/configに以下のように書くと

Host hostB
 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


コンソールに

$ ssh tunnel


と入力するだけでトンネルを作る事ができる。
ただし、-fと-Nオプションは~/.ssh/configには書くことができないので

$ ssh -fN tunnel


と入力する必要がある。


gdbserverの接続

gdbserverを使ってリモートデバックをするには、まずターゲット側でgdbserverを起動する必要がある。今回の条件でgdbserverを起動するには

$ gdbserver localhost:12345 hoge.exe


と入力する。こうするとターゲット側はクライアント側からの接続を待機し始める。

クライアント側では

$ gdb hoge.exe


と入力することでデバッガが起動するので、

 (gdb) target remote localhost:12345


と入力する。こうすることで先ほど作ったトンネルを介してリモートデバックをすることができる。