プライベートなコードをVPS上に置く時に書いたシェルスクリプト.4年くらい使ってたやつを少し整理して公開.
前提条件
- SSH接続でgitを使っている
- Webインターフェイス入れるの面倒くさい or リポジトリ作るのにブラウザ操作したくない
- gitリポジトリにアクセスする専用のユーザ(もしくはSSH鍵)を使っている
Webインターフェイス欲しいと思う場合は素直にGithubライクな何かを用意するのが良いです.
(実際には一応Webインターフェイスもインストールしてますが1人開発用なので使っていなかった)
git_wrapper.sh
#!/bin/sh
LOG_FILE="./git_command.log"
GIT_DIR=./git
echo `date` org: $SSH_ORIGINAL_COMMAND >> $LOG_FILE
expr "$SSH_ORIGINAL_COMMAND" : "^git-" > /dev/null || exit
if REPO_NAME=`expr "$SSH_ORIGINAL_COMMAND" : "^git-receive-pack\\s\\+[\"']\\?/\\?\\([A-Za-z0-9_\\./\\-]\\+\\)[\"']$"`; then
echo repo: $REPO_NAME >> $LOG_FILE
# create if not exists
if [ ! -d ./git/$REPO_NAME ]; then
RET=`mkdir ./git/$REPO_NAME && cd $GIT_DIR/$REPO_NAME && git --bare init --shared && git update-server-info`
echo $RET >> $LOG_FILE
fi
fi
CMD=`echo $SSH_ORIGINAL_COMMAND | sed -e 's|^\(git[a-z-]\+\s\+["'\'']\?\)/\?|\1'$GIT_DIR'/|'`
echo exec: $CMD >> $LOG_FILE
sh -c "$CMD"
(おそらく,Linux + OpenSSH専用になってます.sedの細かい挙動とかは環境に合わせて読み替えて下さい)
使い方
上記のgit_wrapper.shを適当な場所に置いて,リモートのユーザの .ssh/authorized_keys
に以下のような形式で公開鍵を追加.
command="~/git_wrapper.sh" ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqxjaJAnG8l/aS7wA3XEYI3x0hJdZ4Qhol2xDrWfXCI5MnFHhiskkKTfjuGV22hqpD40wOx+YFiGk5RF3c9FbTdn+678YQUXJ4lDM1y9dRZ7jIF/30MiAxGvYyXe/8/oHZ3LuhGlGYPf6nl87ffkW8rIwEiBN1pYtLBUwCeL7XWWKxoECu3KzQlfYxKTEtMqjwm3C++lIod0RDYdoJ04z6qg8sFsk6kSoDwcvsCgPp9LzacbX9ktaaKd1lYq5zUMaXlADwftWv8TbAzEzMdzDfBaRa818FxxORkoH25/WPzEc4y6mWk2UFf1oXE6oMGomYiY7gAydL+fK/g/aaMmmwQ== binzume@kstm.org
repos@example.com:test.git
形式でも ssh://repos@example.com:22/test.git
形式でもリモートの~/git/test.gitにアクセスできます.特に,ssh:// だとポート番号を指定できる代わりにパスの先頭が/
になるせいでフルパスを書かなければいけないのが解決します.
あと,存在しないリポジトリにpushすると自動的にリポジトリ作ります.gitコマンド操作だけで気軽にリポジトリ作ってpushできるので便利.
gitコマンド以外は拒否するので気軽に他の人のSSH鍵も追加してましたがチェック適当なので実は任意のコマンド実行できる(知り合いの鍵を追加するくらいなので十分だった)
ただし
最近,GitBucket を仲間内の開発用に使い始めたのでそっちに全部まとめるのを検討しています.なので個人的にはもうこれは不要になりそう.