aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/tmux/.local/bin/tmux-sshr
diff options
context:
space:
mode:
Diffstat (limited to 'tmux/.local/bin/tmux-sshr')
-rwxr-xr-xtmux/.local/bin/tmux-sshr53
1 files changed, 53 insertions, 0 deletions
diff --git a/tmux/.local/bin/tmux-sshr b/tmux/.local/bin/tmux-sshr
new file mode 100755
index 0000000..7120703
--- /dev/null
+++ b/tmux/.local/bin/tmux-sshr
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+HOST=$(tmux display -p '#h' 2>/dev/null)
+
+if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]; then
+ tmux -L ssh run-shell "tmux-sshr"
+ exit 0
+fi
+
+if [ "$#" -eq 0 ]; then
+ ATTACHED=$(tmux display -p '#{?#{m:*ssh,#{socket_path}},#S,#{host}}' 2>/dev/null)
+
+ set -- "$(
+ sshr --all --exclude="$ATTACHED" |
+ fzf-tmux -p20%,20% -- --print-query --tac |
+ tail -1
+ )"
+fi
+
+if [ -z "$1" ]; then
+ exit 0
+fi
+
+target="$1"
+
+if [ "$target" = "$HOST" ]; then
+ tmux detach -E 'tmux new -A'
+else
+ if ! tmux -L ssh has-session -t "$target"; then
+ local_socket=$(tmux -L ssh start-server \; display -p "#{socket_path}")
+ remote_socket=$(
+ ssh -T \
+ -o "ControlMaster=auto" \
+ -o "ControlPath=${XDG_RUNTIME_DIR}/ssh.%C" \
+ "$target" 'tmux -L ssh start-server \; display -p "#{socket_path}"'
+ )
+
+ tmux -L ssh new-session -ds "$target" \
+ ssh -t \
+ -o "ControlMaster=auto" \
+ -o "ControlPath=${XDG_RUNTIME_DIR}/ssh.%C" \
+ -R "$local_socket":"$remote_socket" \
+ "$target" "zsh -l -c 'tmux new -A'"
+ fi
+
+ if [ -z "$TMUX" ]; then
+ tmux -L ssh attach -t "$target"
+ else
+ tmux detach -E "tmux -L ssh attach -t $target"
+ fi
+
+ exit 0
+fi