Git
SSH
xserver

XSERVERにgit pushしようとしたらPermission deniedとか言われた対策

事象

git push origin masterで怒られました。

$ git push origin master
XXXXX@XXXXX.xsrv.jp: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

一回gitbucketにoriginの向き先を変えて、戻したらこの有様です。

なんでうまくいってるものを消してしまったのか……理解に苦しみます。

地雷踏みの面目躍如といったところ。
会社のサーバーぶっ壊したこともあります

調査

ssh接続は問題なくできてました。

ssh -i ~/keys/XXXXX.key -p 10022 XXXXX@XXXXX.xsrv.jp

パスワードを入力すれば繋がります。

しかしgitからはパスワードすら求められません。
どうやら、gitの方はローカルの~/.ssh/id_rsaを使ってつなぎに行こうとしているっぽい?
少なくともsshで利用している鍵を使っていないようです。

まあ、sshでは指定してるけど、gitでは指定してませんもんね……そりゃね……。

じゃあ、remote addで鍵を指定するようにしてやれば動くのか?

と思い返して当時の記事を見返すも、それらしい記述はありません。
remoteのヘルプをざっと見たんですが見つからず(探すのが下手なだけかもしれないけど)。

(sshのデフォルト設定を変更すればいけるのか……?でもそこまでするほどじゃない)

妥協、もとい解決

しかたないので、ローカルのid_rsaを利用してXSERVERに接続するようにしました。
というわけで、XSERVERにssh接続するための鍵情報を更新します。

手順としては

  1. ローカルにid_rsaがなければ作成する(作成してあるので省略)
  2. XSERVERにログイン後、設定したいサーバーのサーバーパネル -> SSH設定 -> 公開鍵登録・設定に移動する
  3. cat ~/.ssh/id_rsa.pubで出てきた文字列を貼り付けて、設定

こんな感じになります。
登録するときの注意書きにも書いてありますが、それまで利用していた鍵情報が上書きされるので、上記のssh接続はできなくなります。
まあ、鍵のパラメータを消せば動くわけですが。

ssh -p 10022 XXXXX@XXXXX.xsrv.jp

2周目が発生したので根本的に解決を目指す

えっと、この記事のことをすっかり忘れてやらかしました。

XSERVERにssh接続できない→鍵情報作り直そう→git pushできない→鍵を変えよう→ググる→自分のQiitaが出てくる

と、綺麗にループに入ったので根本的解決を目指します。

そもそもsshでつなぎに行くときとgit remoteでsshを使うときの鍵が違うのがおかしいわけですよ。
という当たり前のことにようやく思い至れるくらい理解が進んだので、その方向で調べました。

普通に出てきました。
そうとわかって調べないと見つからないものってありますよね……(言い訳)

鍵情報を追記

なんかどっかに追記するらしいです。
vi ~/.ssh/configとかで以下を記述します。

~/.ssh/config
Host my.XXXXX.server
    Hostname XXXXX.xsrv.jp
    User XXXXX
    IdentityFile ~/app/tool/XXXXX.key
    Port 10022

鍵ファイルをなんでそんなところに置いてるんですかね、僕。
(理解が進んで不自然さに気付いた)

試しに接続

これをやると、1行目のHostで指定した名前(上の場合はmy.XXXXX.server)がエイリアスとして利用されて、$ ssh my.XXXXX.serverでssh接続できるようになるらしいです。
試しにやってみます。

$ ssh my.XXXXX.server
Enter passphrase for key '/Users/YYYYY/app/tool/XXXXX.key':
Last login: Sat May 12 08:43:00 2018 from 118-86-189-179.kakt.j-cnet.jp
[XXXXX@ZZZZZ ~]$ 

おー、つながった。

pushしてみる

というわけでremoteを修正します。

git remote set-url origin ssh://my.XXXXX.server/home/XXXXX/XXXXX.xsrv.jp/git/YYYYY.git

これでpushしたところ、configで指定したkeyのパスワードを求められて、無事に動作しました。