Skip to content

Instantly share code, notes, and snippets.

@mamemomonga
Last active March 1, 2022 16:06
Show Gist options
  • Save mamemomonga/9ac341b610a83b9481dc0bc2e195c2ab to your computer and use it in GitHub Desktop.
Save mamemomonga/9ac341b610a83b9481dc0bc2e195c2ab to your computer and use it in GitHub Desktop.
tmuxにおけるssh-agentの継続利用

tmuxにおけるssh-agentの継続利用

  • 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は停止される。

$HOME/bin/run-tmux

#!/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

$HOME/.bashrc または $HOME/.zshrc に追記

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment