#!/bin/bash
# Функция для получения списка хостов из аргумента (файл или строка)
get_hosts() {
local input="$1"
if [[ -f "$input" ]]; then
# Если это файл, читаем все непустые строки
mapfile -t hosts < "$input"
else
# Иначе разбиваем по пробелам
IFS=' ' read -ra hosts <<< "$input"
fi
echo "${hosts[@]}"
}
# ---- Режим с аргументами командной строки ----
if [ $# -ge 2 ]; then
USER="$1"
shift
# Второй аргумент может быть строкой или файлом – объединяем все оставшиеся аргументы в одну строку
INPUT="$*"
HOSTS_ARRAY=($(get_hosts "$INPUT"))
if [ ${#HOSTS_ARRAY[@]} -eq 0 ]; then
echo "Ошибка: не найдено ни одного хоста."
exit 1
fi
else
# ---- Интерактивный режим ----
read -p "Введите имя пользователя: " USER
read -p "Введите хосты (через пробел) или путь к файлу с хостами: " INPUT
HOSTS_ARRAY=($(get_hosts "$INPUT"))
if [ ${#HOSTS_ARRAY[@]} -eq 0 ]; then
echo "Ошибка: не найдено ни одного хоста."
exit 1
fi
fi
# ---- Создание tmux-сессии ----
SESSION="parallel-ssh"
# Первый хост
tmux new-session -d -s "$SESSION" "ssh $USER@${HOSTS_ARRAY[0]}"
# Остальные хосты
for (( i=1; i<${#HOSTS_ARRAY[@]}; i++ )); do
tmux split-window -t "$SESSION" "ssh $USER@${HOSTS_ARRAY[$i]}"
done
tmux select-layout -t "$SESSION" tiled
tmux set-window-option -t "$SESSION" synchronize-panes on
tmux attach-session -t "$SESSION"