Skip to content

Instantly share code, notes, and snippets.

@pi8027
Last active December 10, 2015 16:18
Show Gist options
  • Save pi8027/4460472 to your computer and use it in GitHub Desktop.
Save pi8027/4460472 to your computer and use it in GitHub Desktop.
SSH の鍵を発行して scp したり authorized_keys を書き換えに行ったりするツール。
#!/bin/sh
# ~/.ssh/key-manager-config
# $1 に鍵の名前を取り、それが正しい名前であれば、1行目にその秘密鍵を持って良い計
# 算機のリストを、2行目にその鍵で入れるようにする計算機のリストを出力する。
case "$1" in
master)
echo
echo hostA hostB www.coins.tsukuba.ac.jp
;;
coins)
echo www.coins.tsukuba.ac.jp
echo www.coins.tsukuba.ac.jp
;;
git)
echo
echo
;;
*)
exit 1
;;
esac
#!/bin/sh
LANG=C
CONFIG_FILE=~/.ssh/key-manager-config
KEY_NAME=$1
TIMESTAMP=`date +%s`
CONFIG=`. $CONFIG_FILE $KEY_NAME`
[ 0 != $? ] && exit 1
mkdir -p ~/.ssh/$KEY_NAME
cd ~/.ssh/$KEY_NAME
ssh-keygen -N "" -C "ssh-key-update:$KEY_NAME:$TIMESTAMP" -f ./$TIMESTAMP
echo 'updating private keys...'
for host in `echo "$CONFIG" | head -n 1`; do
echo $host
ssh -S ~/.ssh/master-$$ $host -M -f -N 2>/dev/null 1>&2
ssh -S ~/.ssh/master-$$ $host "mkdir -p ~/.ssh/$KEY_NAME"
scp -o ControlPath=~/.ssh/master-$$ \
./$TIMESTAMP ./$TIMESTAMP.pub $host:.ssh/$KEY_NAME/
ssh -S ~/.ssh/master-$$ $host \
"cd ~/.ssh/$KEY_NAME/; ln -f -s $TIMESTAMP latest"
ssh -S ~/.ssh/master-$$ $host \
"cd ~/.ssh/$KEY_NAME/; ln -f -s $TIMESTAMP.pub latest.pub"
ssh -S ~/.ssh/master-$$ $host -O exit 1>/dev/null 2>/dev/null
done
echo 'updating public keys...'
for host in `echo "$CONFIG" | tail -n 1`; do
echo $host
ssh -S ~/.ssh/master-$$ $host -M -f -N 2>/dev/null 1>&2
{
ssh -S ~/.ssh/master-$$ $host 'cat ~/.ssh/authorized_keys' | \
grep -v -F " ssh-key-update:$KEY_NAME:"
cat ./$TIMESTAMP.pub
} | ssh -S ~/.ssh/master-$$ $host 'cat > ~/.ssh/authorized_keys_new'
ssh -S ~/.ssh/master-$$ $host \
'cd ~/.ssh/; mv authorized_keys_new authorized_keys'
ssh -S ~/.ssh/master-$$ $host -O exit 1>/dev/null 2>/dev/null
done
ln -f -s ./$TIMESTAMP ./latest
ln -f -s ./$TIMESTAMP.pub ./latest.pub
@pi8027
Copy link
Author

pi8027 commented Jan 8, 2013

これを使うと ~/.ssh がこんな感じになる。

$ tree ~/.ssh
/home/pi8027/.ssh
├── authorized_keys
├── coins
│   ├── 1357372047
│   ├── 1357372047.pub
│   ├── 1357373400
│   ├── 1357373400.pub
│   ├── latest -> ./1357373400
│   └── latest.pub -> ./1357373400.pub
├── config
├── git
│   ├── 1357372001
│   ├── 1357372001.pub
│   ├── latest -> ./1357372001
│   └── latest.pub -> ./1357372001.pub
├── id_rsa
├── id_rsa.pub
├── key-manager-config
├── known_hosts
└── master
    ├── 1357227139
    ├── 1357227139.pub
    ├── 1357227182
    ├── 1357227182.pub
    ├── 1357227289
    ├── 1357227289.pub
    ├── 1357378956
    ├── 1357378956.pub
    ├── latest -> ./1357378956
    └── latest.pub -> ./1357378956.pub

3 directories, 26 files

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment