2016/05/18

gitサーバにssh接続して特定のディレクトリ配下にあるgitリポジトリを片っ端からcloneまたはpullするshell script

掲題の通りです。gitリポジトリのバックアップに使おうと思って書きました。expectコマンドは使ったことがなかったので、それなりにハマりつつ書きました。いい加減な作りなので使う人は気をつけてね☆
gitのhookでバックアップ用のremoteにpushする手も考えましたが、リポジトリが増えるごとにメンテがいる気がしたのでやめました。メンテは0にしたい。
会社のリポジトリはすべて社内サーバの特定ディレクトリ配下にあるので「ssh接続して検索、すでに知ってるリポジトリであればpull、新しく見つかったらcloneするマン」を用意すれば楽だなって。cronで実行すればほったらかしで済むし、メールで飛んでくるcronのログさえ見てればOKだし。
  1. gitサーバにssh接続してgitリポジトリをfind (サブディレクトリも)
  2. 対象リポジトリのリストを作成 (ファイルにする必要はないけど特に何も考えてない)
  3. 新しいリポジトリならディレクトリ階層も再現しつつclone、そうでなければpull
#!/bin/sh
SSH_SERVER="git-server" # .ssh/config
SSH_PASSWORD="*****"
SSH_SERVER_REPOS_ROOT_PATH='/repos'
BACKUP_DIR="/home/valvallow/repos"
REPOS_LIST_FILE="/home/valvallow/repos.list"
GIT_COMMAND_PATH="/home/valvallow/opt/bin/git"
# ----------------------------
# find repository
# ----------------------------
REMOTE_COMMAND="cd ${SSH_SERVER_REPOS_ROOT_PATH}; find ./ -type d -name '*.git';"
REPOSITORY_LIST=`
expect -c "
log_file -noappend ${REPOS_LIST_FILE}
set timeout 120
spawn ssh ${SSH_SERVER} \"${REMOTE_COMMAND}\"
expect \"Enter passphrase for key\"
send \"${SSH_PASSWORD}\n\"
expect eof
exit
"
`
REPOSITORY_LIST=$(tail -n +2 ${REPOS_LIST_FILE})
echo '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^'
echo $REPOSITORY_LIST
echo '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^'
# ----------------------------
# pull or clone
# ----------------------------
if [ ! -e ${BACKUP_DIR} ];
then
mkdir -p ${BACKUP_DIR}
fi
for REPOSITORY in `echo ${REPOSITORY_LIST} | tr '\n' ' ' | tr '\r' ''`
do
cd
cd ${BACKUP_DIR}
echo '======================================================'
echo $REPOSITORY;
echo '======================================================'
NEED_CLONE=0;
if [ ! -e ${REPOSITORY} ];
then
NEED_CLONE=1;
mkdir -p ${REPOSITORY}
cd ${REPOSITORY}
else
cd ${REPOSITORY}
cd `basename ${REPOSITORY} | sed -e s_^\./__g -e s/.git//g`
if [ "$?" -ne 0 ];
then
NEED_CLONE=1;
fi
fi
if [ ${NEED_CLONE} -eq 1 ];
then
REPOSITORY_FULL_PATH="echo ${REPOSITORY} | sed s_^\._${SSH_SERVER_REPOS_ROOT_PATH}_g"
REMOTE_COMMAND="${GIT_COMMAND_PATH} clone ${SSH_SERVER}:${REPOSITORY_FULL_PATH}"
else
REMOTE_COMMAND="${GIT_COMMAND_PATH} pull origin master"
fi
expect -c "
set timeout 120
spawn ${REMOTE_COMMAND}
expect \"Enter passphrase for key\"
send \"${SSH_PASSWORD}\n\"
expect eof
exit
"

2016/05/06

zsh + screen + ssh-agent

.zshrcの後半に下記を追記した。ちなみにgnu screenはいつも手動起動している。
 if [ 0 -eq $(ps ax | grep ssh-agent | wc -l) ]
 then
     eval $(ssh-agent)
     ssh-add .ssh/hoge/id_rsa
 fi
 
 TRAPEXIT()
 {
     if [ 0 -eq $(ps ax | grep screen | wc -l) ]
     then
         eval $(ssh-agent -k)
     fi
 }

2016/05/02

Re: 制限されまくったWindows環境で意地でもcmd.exeを起動する

すごい反響で驚きました。ブコメ面白いですね(笑)

そろそろホッテントリ入りのほとぼりが覚めたと思いますので補足してみたいと思います。

ひとまず言っておきたいのは、うちの会社の環境じゃないよってことですね。あんな環境じゃ開発なんてできませんよね(汗)

例の環境については、例えば下記の様な場所があるとしましょう。

  • 職員500人(20代から50代のPCに詳しくない一般の人)
  • そのうちIT担当者が10人程度
  • パソコン1500台、プリンタ300台、Androidやその他携帯機器100台
  • パソコンではIE、Word、Excel、特定の業務アプリが2~3使えればOK
  • USBメモリは許可されたものしか接続できないようにパソコン側でソフトウェア的にロックされている
  • そもそもパソコンのUSBポートは物理的にロックしてある
  • パソコンや機器に関わる問い合わせはIT担当者に来る

自分がここのIT担当者だったらと思うと、可能な限り制限を付けたくなりませんかね。どういう制限ができるかについては詳しくないんで、アクティブディレクトリとかグループポリシーとかその辺をお調べください。