- bin/run-tmuxというシェルスクリプトを経由して起動する。デタッチ後も以前のssh-agentを利用できるようにする。
- セッションがあればattach、セッションがなければ新しいセッションを開始する
- セッションがなければ、ssh-agentを起動し、SSH_AUTH_SOCK, SSH_AGENT_PIDを .ssh/tmux-ssh-agent に保存しtmuxセッションを開始する。
- bash や zsh起動時には .ssh/tmux-ssh-agent の環境変数を読み込むことでssh-agentを利用可能にする。
- セッション開始時に bin/run-tmux agent-killer を起動し、数秒おきにtmuxの終了をチェック、終了されていたらssh-agentを停止する。
- ssh-agentのPIDが無効ならばファイルを削除する。
agent-killer は セッション名をキーにしてtmuxを検索するため、セッション名を変更すると追えなくなる。追えなくなった時点で ssh-agentは停止される。
#!/bin/bash
set -eu
MYSELF="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/"$( basename "${BASH_SOURCE[0]}" )
SESSION_NAME="$USER"
if [[ "${1:-}" == "agent-killer" ]]; then
while [[ -n "$(tmux list-sessions 2>/dev/null | grep $SESSION_NAME':')" ]]; do
sleep 30
done
kill $2
rm -f $HOME/.ssh/tmux-ssh-agent
echo "shutdown ssh-agent PID:$SSH_AGENT_PID"
exit 0
fi
if [[ -z "${TMUX:-}" ]]; then
if [[ -z "$(tmux list-sessions 2>/dev/null | grep $SESSION_NAME':')" ]]; then
ssh-agent -s | grep SSH_ > $HOME/.ssh/tmux-ssh-agent
chmod 600 $HOME/.ssh/tmux-ssh-agent
tmux new-session -s $SESSION_NAME -d
echo "start agent-killer"
source $HOME/.ssh/tmux-ssh-agent
nohup $0 agent-killer $SSH_AGENT_PID > /dev/null 2>&1 &
sleep 1
fi
exec tmux attach-session -t $SESSION_NAME
fi
if [ -e "$HOME/.ssh/tmux-ssh-agent" ]; then
source "$HOME/.ssh/tmux-ssh-agent"
if ! $(kill -s 0 $SSH_AGENT_PID > /dev/null 2>&1); then
rm -f "$HOME/.ssh/tmux-ssh-agent"
unset SSH_AGENT_PID
unset SSH_AUTH_SOCK
echo "[WARNING] ssh-agent has gone."
fi
fi
$ ssh -t user@host bin/run-tmux