本日も乙

ただの自己満足な備忘録。

SSHオプションを変更する方法

GitやMercurialSSH経由でcloneやpullなどをすることがかなり多くありますが、ポート番号や秘密鍵のパスがデフォルト(e.g. ~/.ssh/id_rsa) と異なっていたり、ProxyCommandなどのSSHオプションを付けたりしたいことも多くの場合あります。

今回は、そのような場合の設定方法をまとめてみました。

~/.ssh/configに書く

これが一番簡単ですね。Gitなどの操作以外にもSSH接続する場合によく使います。
僕は自分のPC(Mac book Air)でこのような設定をしています。

# ~/.ssh/config

Host *
  IdentityFile /Users/user/.ssh/id_rsa
  StrictHostKeyChecking no
  UserKnownHostsFile /dev/null
  ServerAliveInterval 120

EC2インスタンスを頻繁に立ち上げたり削除したりするので、~/.ssh/known_hostsを見ないようにするかつ、残さないようにしたいためにStrictHostKeyChecking noUserKnownHostsFile /dev/nullを設定しています。
また、サーバによってはSSHが切断されることがあるため、ServerAliveInterval 120と少し長めですが設定しています。

~/.ssh/configに書くことで簡単に設定できますが、諸事情で書けない(書きたくない)場合もあります *1 ので、Mercurial, Gitそれぞれの設定方法もまとめておきます。 *2

Mercurialの場合

--sshオプションを付けることで簡単にできます。

例えば、cloneしたい場合は、このようになります。

$ hg clone --ssh 'ssh -i /home/user/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' ssh://foo@bar.com//xxxx

毎回、--sshオプションを付けるのが面倒な場合は、~/.hgrcに書くこともできます。

# ~/.hgrc
[ui]
ssh = ssh -i /home/user/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no

Gitの場合

Mercurialと比べると若干面倒ですが、変数GIT_SSHSSHオプションを付けることでできます。~/git-ssh.shというファイルにSSHオプションを設定します。ファイル名やパスなどは任意です。

$ echo 'exec ssh -i /home/user/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no "$@"' > ~/git-ssh.sh
$ chmod +x ~/git-ssh.sh

cloneしたい場合は、次のようにします。

$ GIT_SSH='~/git-ssh.sh' git clone ssh://foo@bar.com/xxxx.git

最後に

MercurialやGitでSSHオプションを指定する場合の設定方法をまとめてみました。なんてことない小ネタですが、知っておくと便利ですのでぜひ活用してみてください。

*1:ある特定のサーバのみSSHオプションを適用させたい場合などが考えられます

*2:他にも方法があるかもしれませんのでご存知の方はコメントくださると嬉しいです