Gitで間違ったユーザでコミットしてしまったとき

Why?

  • 1台のPCで2ユーザ取り扱っている時に、間違ったユーザでコミットしてしまったときに泣きたくなる
    • しかも、かなりの量をコミットしていると辛い

そもそもこうするべきだった

  • host と id_rsa の設定だけではなく、ローカルディレクトリの git のユーザ設定をするべきだった
$ git config --local user.name kz-engineer
$ git config --local user.email kz-engineer@example.com

後処理

  • git ユーザをローカルで設定した後に

  • コミットがひとつの場合

$ git commit --amend --author="kz-engineer <kz-engineer@example.com>"
  • 今までのコミット全部の場合
$ git filter-branch -f --env-filter "GIT_AUTHOR_NAME='kz-engineer'; GIT_AUTHOR_EMAIL='kz-engineer@example.com'; GIT_COMMITTER_NAME='kz-engineer'; GIT_COMMITTER_EMAIL='kz-engineer@example.com';" HEAD

TODO List

ssh-keygen とは?(基本編)

Why?

What for?

  • ssh-keygen とは認証用の鍵を生成、管理、および変換するOpenSSHのコマンド
  • Diffie-Hellman 群交換 (DH-GEX) で使われる群を生成
  • 鍵失効リスト (Key Revocation List, KRL) を生成
  • 与えられた鍵は revoke されたものかどうかを検査

生成できる鍵(identiry file)タイプ

-t dsa | ecdsa | ed25519 | rsa | rsa1

よくある使用法

key pair を作る

$ ssh-keygen -t rsa -C XXX@example.comX -f ~/.ssh/id_rsa.kz
$ ssh-keygen -t hoge
unknown key type hoge
$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/Users/kz-engineer/.ssh/id_dsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/kz-engineer/.ssh/id_dsa.
Your public key has been saved in /Users/kz-engineer/.ssh/id_dsa.pub.
The key fingerprint is:
XXXXXXXXXXXXXXXXX kz-engineer@kz-engineer.local
The key's randomart image is:
+--[ DSA 1024]----+
...
+-----------------+

あるホストに対応づいた鍵をknown_hostsファイルの中から探す

$ ssh-keygen -F github.com
# Host github.com found: line 3 type RSA
github.com ssh-rsa XXXXXXXXXXXXXXXXXXX==

よくある失敗

  • パスフレーズを忘れた
    • 変更はできても、忘れたものを取り戻すことはできないので、再生成すること。

TODO List

  • TODO: /etc/rc でシステム管理者が鍵を作成?
  • TODO: OpenSSH について深く知りたい
  • TODO: SSH1がどれくらいまずいのか
  • TODO: 鍵のビット数を縮めるとどれくらいまずいのか
  • TODO: The key fingerprint とか The key's randomart image って可愛いけど何?
  • TODO: Diffie-Hellman 群交換 (DH-GEX) とは?
  • TODO: それぞれの鍵タイプで何がおいしいの?
  • TOOD: 鍵失効リスト (Key Revocation List, KRL)とは?

`pseudo-tty` とは?

Why?

pseudo-ttyとは?

  • pseudo-tty( text-terminal ) = 疑似端末
    • pseudo = 擬似
    • tty = 標準入出力となっている端末デバイス(制御端末、controlling terminal)の名前を表示するunixコマンドである。元来ttyとはteletypewriter(テレタイプライター)のことを指す。
$ tty
/dev/ttys000
$ ls /dev/ttys*
/dev/ttys0  /dev/ttys2  /dev/ttys5  /dev/ttys8  /dev/ttysb  /dev/ttyse
/dev/ttys000    /dev/ttys3  /dev/ttys6  /dev/ttys9  /dev/ttysc  /dev/ttysf
/dev/ttys1  /dev/ttys4  /dev/ttys7  /dev/ttysa  /dev/ttysd

ssh -T とは?

  • sshで接続テストをする際のTオプションの説明
 -T      Disable pseudo-tty allocation.
  • Disable pseudo-tty allocation = 疑似端末の割当を無効化する

  • どういうときに使うか?

    • shell accessが許可されていない端末へsshアクセスする場合
      • e.g. githubへの共通鍵を登録ができているかのチェック
  • 何が嬉しいのか?
    • githubはshell accessを許可していないので、PTY(pseudo-tty) allocation requestが通らずconnectionが閉じてしまう
$ ssh github-kz-engineer
PTY allocation request failed on channel 0
Hi kz-engineer! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
$ ssh -T github-kz-engineer
Hi kz-engineer! You've successfully authenticated, but GitHub does not provide shell access.
  • -tオプションの方が使われている?
-t Force pseudo-tty allocation. This can be used to execute arbitrary screen-based programs on a remote machine, which can be very useful,

TODO List

  • TODO: pseudo-tty( text-terminal ) = 疑似端末の理解が曖昧
  • TODO: /dev/ttys* にどんなものがあるか調べる
  • TODO: ttyとかptsとかの明確な理解
  • TODO: ssh -tオプション

`~/.ssh/config` の設定順序による設定の変化

Why?

~/.ssh/config の設定順序別の挙動

  • 複数の公開鍵をよしなに全検索して使用してほしい場合以下の用に書く
    • 上から順番に公開鍵が試されるので、先に書いた公開鍵が使用される

  • 先に書かれているのでid_rsa.hoge が使用される
IdentityFile ~/.ssh/id_rsa.hoge
IdentityFile ~/.ssh/id_rsa.fuga
$ ssh -T github-hoge
Hi hoge! You've successfully authenticated, but GitHub does not provide shell access.
  • 先に書かれているのでid_rsa.fuga が使用される
IdentityFile ~/.ssh/id_rsa.fuga
IdentityFile ~/.ssh/id_rsa.hoge
$ ssh -T github-hoge
Hi hoge! You've successfully authenticated, but GitHub does not provide shell access.
  • Hostを細かく指定していても、先に書かれているのでid_rsa.fuga が使用される
IdentityFile ~/.ssh/id_rsa.fuga

Host github-hoge
  User git
  Port 22
  HostName github.com
  IdentityFile ~/.ssh/id_rsa.hoge
  TCPKeepAlive yes
  IdentitiesOnly yes

同一PCで2つのgithubアカウントを使用する

Why?

How to

  • ひとつのリポジトリに2ユーザ使うことはほぼ無いので、各リポジトリでコミットユーザを指定できるようにする

準備

Host github-kz-engineer
  User git 
  Port 22
  HostName github.com
  IdentityFile ~/.ssh/id_rsa.kz
  TCPKeepAlive yes
  IdentitiesOnly yes

接続テスト

  • ssh Tオプション(Disable pseudo-tty allocation)で接続テスト
    • 接続成功
      • ここで呼ばれる名前で、どの公開鍵が使われているかわかる
$ ssh -T github-kz-engineer
Hi kz-engineer! You've successfully authenticated, but GitHub does not provide shell access.
  • 接続失敗
  * $ ssh -T github-kz-engineer
Permission denied (publickey).

実践

$ git config --local --list
user.name=hoge
user.email=hoge@example.com
$ less .git/config
[user]
        name = hoge
        email = hoge@example.com
  • グローバルでのユーザ確認
$ git config --global --list
user.name=fuga
user.email=fuga@example.com
$ less ~/.gitconfig
[user]
        name = fuga
        email = fuga@example.com
  • 実際にコミットしてみる
  • 確認して実際に設定されたユーザでコミットできていればおk
$ git log
commit hogehoge
Author: hoge<hoge@example.com>
Date:   Wed Mar 2 01:28:25 2016 +0700

    test

TODO List


2つの公開鍵でsshアクセスする

Why?

How to

  • 2つ目の鍵の作成(1つ目は既に存在している想定)
$ ssh-keygen -t rsa -C kz.engineer.jp@gmail.com -f ~/.ssh/id_rsa.kz
  • 公開鍵を指定してログイン
$ ssh hoge.example.com -i ~/.ssh/id_rsa.kz
  • ~/.ssh/config に鍵を登録しておけば、公開鍵を指定しなくても総当たりでアクセスしてくれる
$ vi ~/.ssh/config
IdentityFile ~/.ssh/id_rsa
IdentityFile ~/.ssh/id_rsa.kz

## TODO List


Macのターミナルのドルの前(プロンプト変数)のXXX-no~macbook-airの表示などを変更する

元の表示状態

kz_engineer-no~macbook-air:~ kz_engineer$
{ホスト名(コンピュータ名)}:{今いるディレクトリ} {ログインユーザ名(アカウント名)}$

デフォルト表示ルールの確認

  • Macbashでは $PS1 というシェル変数(環境変数)に表示ルールが保存されている
    • PS1 = The primary(= 1) Prompt String
    • PS2以降もある(TODO: 調査)
$ echo $PS1
\h:\W \u\$
  • 変数の内容を変更して設定できる
$ PS1="\h:\W \u\$" 
  • 使える変数一覧(英語)

www.gnu.org

ホスト名(コンピュータ名)の変更の仕方

  1. システム環境設定 > 共有 > コンピュータ名 を変更

f:id:kz_engineer:20160226024235p:plain

ログインユーザ名(アカウント名)の変更の仕方

  1. システム環境設定 > ユーザとグループ を起動
  2. 左下のロックをクリックして、管理者パスワードを入力し、設定を変更可能にする
  3. ユーザ名の上で右クリック > 詳細 > アカウント名 を変更

    • アカウント名を変えると、ホームディレクトリなどのアドレスも変わるので注意
  4. 公式資料

support.apple.com