以下のような構成を考える.Localは手元のサーバ,Server1は踏み台用サーバ,Server2がターゲットとなるサーバです.
通常,何も設定していない場合は,LocalからServer1にssh接続し,Server1からServer2にssh接続します.
Local$ ssh account1@Server1
Server1$ ssh account2@Server2
あるいは
ssh -t account1@Server1 "ssh account2@Server2"
今回は,LocalからServer1には公開鍵認証方式を使って接続し,LocalからServer2へ一発のコマンドで接続する事を考える.
(Server1からServer2への接続は常にパスワードの入力を要求するように残しておくため,Server1からServer2への接続には公開鍵認証方式を用いなかった)
##LocalからServer1に公開鍵認証で接続する
1.まず,Server1へ接続する
ssh account1@Server1
sshの設定で鍵の利用ができるかは「/etc/sssshd_config 」か,「/etc/ssh/sshd_config」で確認できると思う.
2.「.ssh」ディレクトリへ移動し,RSAで暗号化された鍵を生成する
cd .ssh
ssh-keygen -t rsa
パスフレーズを入力してできる「id_rsaが秘密鍵」「id_rsa.pubが公開鍵」です.
3.公開鍵をauthrized_keysとして保存し,古い公開鍵は削除する
cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
rm id_rsa.pub
4.パーミッションを変更し,ログアウトする
chmod 600 ~/.ssh/authorized_keys
logout
5.Localの「.ssh」ディレクトリへ移動し,秘密鍵をローカルへ保存する(本当はネットワーク越しに送るべきではないですが・・・)
cd .ssh
scp account1@Server1:~/.ssh/id_rsa ~/.ssh/server1_rsaKey
接続できるか確認
ssh -i server1_rsaKey account1@Server1
##ProxyCommandを使って,LocalからServer2までssh接続する
ProxyCommandは,sshクライアントと標準入出力でやりとりしてくれるみたい.詳しくは「多段 ssh / rsync するために ProxyCommand を使ってみる - daily dayflower」あたりを参照.
1.「.ssh/config」に,ssh接続ごとに,接続に関する情報を以下のように書き込む
Host S1
HostName Server1
User account1
IdentityFile ~/.ssh/server1_rsaKey
Host S2
HostName Server2
User account2
ProxyCommand ssh S1 nc %h %p
- 以上より,LocalからServer2へssh接続するには,以下のコマンドでできるようになる.
ssh S2
LocalからS1(Server1)へは,公開鍵認証で接続しているのでパスフレーズを覚えてなくてもバックグラウンドで接続し,S2(Server2)への接続を試みてくれる.
これで,ssh接続を利用するscp等も,以下のように省略して利用できる
scp -r S2:/path/to/data /local/path/downloadData
ただ,以下のように書いたrsyncはなぜか利用できなかった
rsync -rav --exclude '/path/to/data/tmp/' S2:/path/to/data /local/path/downloadData