From 98129cd4007a5f912898ca53299d488231d8ffd8 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Fri, 7 Feb 2020 08:45:57 +0400 Subject: [PATCH] passer par un script annexe pour cssh --- cssh | 74 +++++++++------------------------------------------- start-screen | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 62 deletions(-) create mode 100755 start-screen diff --git a/cssh b/cssh index e2c5c12..ae29366 100755 --- a/cssh +++ b/cssh @@ -23,68 +23,18 @@ vars="$("$scriptdir/ussh" --parse "$@")" || die eval "$vars" [ "${#hosts[*]}" -gt 0 ] || die "Vous devez spécifier l'hôte sur lequel se connecter" -cmd="'$(qvals "${args[@]}") -"' -function __ask() { - local r - read -p "$1" -t 2 r - [ $? -gt 128 -o -z "$r" -o "$r" == "o" -o "$r" == "O" -o "$r" == "y" -o "$r" == "Y" ] -} - -function __auto_screen() { - # Si screen pas installé, ne rien faire - if [ -z "$(which screen 2>/dev/null)" ]; then - echo "'"$COULEUR_JAUNE"'WARNING'"$COULEUR_NORMALE"' screen introuvable. une session bash classique sera lancée" - exec /bin/bash -l - fi - - # Si on est déjà dans screen, ne rien faire - [ -z "$STY" ] || return - - # corriger TERM pour les vieilles versions de Linux - case "$TERM" in - xterm*) TERM=xterm;; - screen*) TERM=screen;; - esac - export TERM - - local msgprefix - local screens count - - screens="$(LANG=C screen -ls | grep -Ei "attached|detached")" - if [ -n "$screens" ]; then - count="$(echo "$screens" | wc -l)" - else - count=0 - fi - if [ $count -gt 0 ]; then - if [ $count -eq 1 ]; then - msgprefix="Il y a '"$COULEUR_BLEUE"'1 session screen en cours'"$COULEUR_NORMALE"' -Cette session" - else - msgprefix="Il y a '"$COULEUR_ROUGE"'$count sessions screen en cours'"$COULEUR_NORMALE"': -$screens -La première session" - fi - if __ask " -$msgprefix sera reconnectée automatiquent dans 2 secondes -Voulez-vous reconnecter la session screen? [On] "; then - exec screen -q -s -/bin/bash -xRR - else - exec /bin/bash -l - fi - elif __ask " -Une '"$COULEUR_VERTE"'nouvelle session screen'"$COULEUR_NORMALE"' sera lancée automatiquement dans 2 secondes -Voulez-vous lancer une session screen? [On] "; then - exec screen -q -s -/bin/bash -RR - else - exec /bin/bash -l - fi -} - -__auto_screen -'\' +[ ${#args[*]} -gt 0 ] && cmd="$(qvals "${args[@]}"); " || cmd= +cmd="$cmd$(<"$scriptdir/start-screen")" +cmd="'${cmd//\'/\'\\\'\'}'" for host in "${hosts[@]}"; do - ${exec:+exec} "$ssh" "${options[@]}" -t "$host" -- /bin/bash -c "$cmd" + "$ssh" \ + "${options[@]}" -qt "$host" -- \ + "[ -x /usr/local/nutools/start-screen ] && exec /usr/local/nutools/start-screen $(qvals "${args[@]}") || exit 123" + if [ $? -eq 123 ]; then + # pas de start-screen en face, le faire à la main + ${exec:+exec} \ + "$ssh" "${options[@]}" -t "$host" -- \ + /bin/bash -c "$cmd" + fi done diff --git a/start-screen b/start-screen new file mode 100755 index 0000000..f449e34 --- /dev/null +++ b/start-screen @@ -0,0 +1,72 @@ +#!/bin/bash +# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 + +COULEUR_NORMALE=$'\e[0m' +COULEUR_ROUGE=$'\e[31;1m' +COULEUR_VERTE=$'\e[32;1m' +COULEUR_JAUNE=$'\e[33;1m' +COULEUR_BLEUE=$'\e[34;1m' +COULEUR_BLANCHE=$'\e[37;1m' + +function __ask() { + local r + read -p "$1" -t 2 r + [ $? -gt 128 -o -z "$r" -o "$r" == "o" -o "$r" == "O" -o "$r" == "y" -o "$r" == "Y" ] +} + +function __auto_screen() { + # Si screen pas installé, ne rien faire + if [ -z "$(which screen 2>/dev/null)" ]; then + echo "${COULEUR_JAUNE}WARNING${COULEUR_NORMALE} screen introuvable. une session bash classique sera lancée" + exec /bin/bash -l + fi + + # Si on est déjà dans screen, ne rien faire + [ -z "$STY" ] || return + + # corriger TERM pour les vieilles versions de Linux + case "$TERM" in + xterm*) TERM=xterm;; + screen*) TERM=screen;; + esac + export TERM + + local msgprefix + local screens count + + screens="$(LANG=C screen -ls | grep -Ei "attached|detached")" + if [ -n "$screens" ]; then + count="$(echo "$screens" | wc -l)" + else + count=0 + fi + if [ $count -gt 0 ]; then + if [ $count -eq 1 ]; then + msgprefix="Il y a ${COULEUR_BLEUE}1 session screen en cours${COULEUR_NORMALE} +Cette session" + else + msgprefix="Il y a ${COULEUR_ROUGE}$count sessions screen en cours${COULEUR_NORMALE}: +$screens +La première session" + fi + if __ask " +$msgprefix sera reconnectée automatiquent dans 2 secondes +Voulez-vous reconnecter la session screen? [On] "; then + exec screen -q -s -/bin/bash -xRR + else + exec /bin/bash -l + fi + elif __ask " +Une ${COULEUR_VERTE}nouvelle session screen${COULEUR_NORMALE} sera lancée automatiquement dans 2 secondes +Voulez-vous lancer une session screen? [On] "; then + exec screen -q -s -/bin/bash -RR + else + exec /bin/bash -l + fi +} + +if [ $# -gt 0 ]; then + # lancer les commandes fournies avant de lancer SCREEN + "$@" +fi +__auto_screen