diff options
author | jakob.stendahl <jakob.stendahl@infomedia.dk> | 2022-05-03 08:41:57 +0200 |
---|---|---|
committer | jakobst1n <jakob.stendahl@outlook.com> | 2022-05-03 08:41:57 +0200 |
commit | 12102c365247329f4d6964d6b48e12fa2bf67208 (patch) | |
tree | 0275ffef4d603a5f19dd161f79d6f80ebc9ab770 /bin/tmux-cssh | |
parent | 8c8ea3760651c226e585a67b3800e676a2cc86c0 (diff) | |
download | dotfiles-12102c365247329f4d6964d6b48e12fa2bf67208.tar.gz dotfiles-12102c365247329f4d6964d6b48e12fa2bf67208.zip |
Some changes
Diffstat (limited to 'bin/tmux-cssh')
-rwxr-xr-x | bin/tmux-cssh | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/bin/tmux-cssh b/bin/tmux-cssh new file mode 100755 index 0000000..6e686a8 --- /dev/null +++ b/bin/tmux-cssh @@ -0,0 +1,114 @@ +#!/bin/sh + +hosts="" +ssh_options="" +tmux_name="cssh" + +usage() { + echo "Usage: $0 [options] host [host ...]" >&2 + echo "" >&2 + echo "Spawns multiple synchronized SSH sessions inside a tmux session." >&2 + echo "" >&2 + echo "Options:" >&2 + echo " -h Show help" >&2 + echo " -c Use the current tmux session and just spawn a new window instead" >&2 + echo " -n <name> Name of the tmux session or window (default: cssh)" >&2 + echo " -o <ssh args> Additional SSH arguments" >&2 +} + +while [ $# -ne 0 ]; do + case $1 in + -n) + shift; + if [ $# -eq 0 ]; then + usage + exit 2 + fi + tmux_name="$1"; shift + ;; + -c) + tmux_attach_current_session="true"; shift + ;; + -o) + shift; + if [ $# -eq 0 ]; then + usage + exit 2 + fi + ssh_options="$1"; shift + ;; + -h) + usage + exit 0 + ;; + -*) + usage + exit 2 + ;; + *) + hosts="${hosts}${hosts:+ }$1"; shift + ;; + esac +done + +if [ -z "${hosts}" ]; then + usage + exit 2 +fi + +# Find a name for a new session +n=0; while tmux has-session -t "${tmux_name}-${n}" 2>/dev/null; do n=$(($n + 1)); done +tmux_session="${tmux_name}-${n}" + +if [ -n "${tmux_attach_current_session}" ]; then + tmux_session=$(tmux display-message -p '#S') + n=0; while tmux list-windows -F "#W" | grep -q "${tmux_name}-${n}" 2>/dev/null; do n=$(($n + 1)); done + tmux_window="${tmux_name}-${n}" + tmux_window_options="-n ${tmux_window}" +fi + +# If host doesn't look like a DNS name, it may be a CSSH cluster +if ! echo "${hosts}" | grep -q '[. ]'; then + for cfg in ~/.clusterssh/clusters /etc/clusters; do + if [ -r "${cfg}" ]; then + h="$(sed -n < "${cfg}" "s/^$hosts //p")" + if [ -n "$h" ]; then + hosts="${h}" + break + fi + fi + # If there was no corresponding cluster name, + # just assume we have an unqualified domain name + done +fi + +# Open a new session and split into new panes for each SSH session +for host in ${hosts}; do + if ! tmux has-session -t "${tmux_session}" 2>/dev/null; then + tmux new-session -s "${tmux_session}" -d "ssh ${ssh_options} ${host}" + elif [ -n "${tmux_attach_current_session}" ] && ! tmux list-windows -F "#W" | grep -q "${tmux_window}" >/dev/null; then + tmux new-window ${tmux_window_options} "ssh ${ssh_options} ${host}" + else + tmux split-window -t "${tmux_session}" -t ${tmux_window} -d "ssh ${ssh_options} ${host}" + # We have to reset the layout after each new pane otherwise the panes + # quickly become too small to spawn any more + tmux select-layout -t "${tmux_session}" tiled + fi +done + +# Synchronize panes by default +if [ -n "${tmux_attach_current_session}" ]; then + tmux set-window-option -t "${tmux_window}" synchronize-panes on +else + tmux set-window-option -t "${tmux_session}" synchronize-panes on +fi + +if [ -n "${TMUX}" ]; then + # We are in a tmux, just switch to the new session + tmux switch-client -t "${tmux_session}" +else + # We are NOT in a tmux, attach to the new session + tmux attach-session -t "${tmux_session}" +fi + +exit 0 |