多段SSHでscp,rsync,gitを使う
ファイアーウォールの中のSSHサーバに接続したい場合、ゲートウェイとなるSSHサーバを経由して接続することがよくあります。
その場合、ProxyCommandを使った多段SSHスクリプトを用意しておくといろいろなコマンドから利用できるのでとても便利です。
以下の例は、~/bin (ホーム直下のbinディレクトリ) にPATHが通っている前提です。
多段SSHスクリプト
小さなシェルスクリプトを書きます。
ゲートウェイとなるSSHの情報を設定します。以下の例はusername: username, host: gatewayの例です。
ProxyCommand ssh の後にはsshコマンドのオプションが使えますので、ポート番号が違う場合などは -p で指定できます。
$ vim ~/bin/hogessh
以下の内容を作成
#!/bin/sh
exec ssh -o "ProxyCommand ssh username@gateway -W %h:%p 2> /dev/null" $@
実行権限をつけます
$ chmod 755 ~/bin/hogessh
SSH接続
内側のネットワークで動作しているサーバへSSH接続します
$ hogessh user@192.168.0.12
ゲートウェイとなるSSHサーバで名前解決できれば、クライアント側で名前解決できなくても独自の名前のホストに接続することができます。/etc/hostsにかくもよし、dnsmasqをつかうもよし。クライアント側の ~/.ssh/config をすっきりさせることができるかもしません。
$ hogessh user@special-server
agent forwarding(-A)を使うと内部のサーバから手元のマシンの自分のSSHキーを使って直接GitHubにPushできたりするので便利です
$ hogessh -A user@192.168.0.12
$ cd very_nice_project
$ vim README.md
$ git commit -a "message" --author "user <email@address>"
$ git push origin master
scpを使う
-S に多段SSHスクリプトを指定します
$ scp -S ~/bin/hogessh user@192.168.0.12:/home/user/thefile.txt .
rsyncを使う
環境変数 RSYNC_RSH に多段SSHスクリプトを指定します
$ RSYNC_RSH=~/bin/hogessh rsync -av user@192.168.0.12:/home/user .
または
$ export RSYNC_RSH=~/bin/hogessh
$ rsync -av user@192.168.0.12:/home/user .
gitを使う
環境変数 GIT_SSH に多段SSHスクリプトを指定します
$ GIT_SSH=~/bin/hogessh git clone user@192.168.0.12:/home/user/very_nice_project .
または
$ export GIT_SSH=~/bin/hogessh
$ git clone user@192.168.0.12:/home/user/very_nice_project .