多段ssh のはなし。
外部のネットワークから特定のLAN内のサーバにアクセスしたい。
ただし、特定のLANにはプロキシ(踏み台)サーバを経由しないといけない。
通常なら、プロキシサーバにSSHログインして、目的のサーバにSSHログイン。
[root@client ~]# ssh 1.2.3.4 -p 2222 root@1.2.3.4's password: Last login: Wed Nov 26 13:14:24 2014 from 1.3.4.5 [root@adm ~]# ssh db Last login: Wed Nov 26 13:16:41 2014 from adm [root@db ~]#
でも、SSHコマンドって、『SSH サーバ “コマンド”』で、対象サーバ内でコマンドの実行ができる。
[root@client ~]# ssh 1.2.3.4 -p 2222 "free" root@1.2.3.4's password: total used free shared buffers cached Mem: 8196648 8034528 162120 0 278368 5567024 -/+ buffers/cache: 2189136 6007512 Swap: 4194300 0 4194300
それなら、『SSH サーバ “SSH サーバ”』でSSHログインできるのでは?
[root@client ~]# ssh 1.2.3.4 -p 2222 "ssh db" root@1.2.3.4's password: Pseudo-terminal will not be allocated because stdin is not a terminal.
失敗。
『仮想端末が割り当てられていない』ということだそうな。
では、SSHのマニュアルを参考に。
SSH (1)
http://www.unixuser.org/~euske/doc/openssh/jman/ssh.html
-t
強制的に仮想端末を割り当てます。これはリモートマシン上で任意の画面ベースのプログラムを実行するとき(たとえば、メニューサービスを実装するときなど)に非常に便利です。複数の-t をつけると、たとえssh がローカル側での端末を持っていない場合でも強制的に仮想端末を割り当てます。
[root@client ~]# ssh -t 1.2.3.4 -p 2222 "ssh db" root@1.2.3.4's password: Last login: Thu Nov 27 17:41:23 2014 from adm [root@db ~]#
できた。
ちなみに、rsyncでは-tオプションがいらない。
e.g. プロキシ経由でdbサーバのログをローカルに取得する。
rsync -av -e 'ssh root@1.2.3.4 -p 2222 ssh 'db:/var/log/mysql/ /var/log/mysql/
ただし、一般的には以下のncやProxyCommandを使うことが多いみたい。
ncを使う場合
ただし、プロキシサーバにncがインストールされている必要がある。
[root@client ~]# vi .ssh/config
Host proxy HostName 1.2.3.4 Port 2222 Host db HostName 1.4.5.6 Port 22 ProxyCommand ssh proxy nc %h %p
[root@client ~]# ssh db root@1.2.3.4's password: root@1.4.5.6's password: Last login: Wed Nov 26 13:12:48 2014 from adm [root@db ~]#
ncを使わない(-Wオプションを使う)場合
ただし、SSHのバージョン(~CentOS5.3?)によっては-Wオプションが使えない。
[root@client ~]# vi .ssh/config
Host proxy HostName 1.2.3.4 Port 2222 Host db HostName 1.4.5.6 Port 22 ProxyCommand ssh proxy -W %h:%p
[root@client ~]# ssh db root@1.2.3.4's password: root@1.3.4.5's password: Last login: Wed Nov 26 13:16:01 2014 from adm [root@db ~]#
これで、scpによる直接コピーなんかもできる。
e.g. プロキシ経由でdbサーバのログをローカルに取得する。
scp db:/var/log/mysql/ /var/log/mysql/
Host login User www HostName fumidai.com Port 2222 IdentityFile ~/.ssh/id_rsa_www Host web01 HostName web01 Host web02 HostName web02 Host web* User www IdentityFile ~/.ssh/id_rsa_www ProxyCommand ssh login -W %h:%p
「web*」は正規表現で「web01/02」をまとめています。
ssh web02
fumidai01 → fumidai02 → server
Host fumidai01 User www HostName fumidai01.com Host fumidai02 User www HostName fumidai02.com ProxyCommand ssh fumidai01 -W %h:%p Host server User www HostName server.com ProxyCommand ssh fumidai02 -W %h:%p
ssh server