Gestione di un parco macchine via SSH

Un incubo per chiunque, ma se poi c'è chi prova a fare il paranoico della sicurezza, è anche peggio... Uno script che esegua ssh su tante macchine è banale, ma se si devono eseguire compiti di manutenzione ed è necessario usare "su - -c ..." si ottiene un bel "standard in must be a tty" Sad

Ancora peggio, cercando in rete, si trova quasi esclusivamente una caterva di gente che consiglia di usare sudo, programmi setuid root o altre soluzioni più o meno fantasiose.

I punti da considerare sono:

  • Si ha a che fare con tante (per es. 100) macchine, tutte configurate "circa" allo stesso modo
  • sudo non è stato configurato
  • ssh è configurato per permettere ad un normale utente (ma non a root) l'accesso con autenticazione a chiave pubblica
  • L'utente suddetto è nel gruppo wheel e pam è configurato per permettergli di diventare root senza bisogno di password

Questo "setup di base" può essere più o meno criticabile, ma è ciò con cui ci si trova ad aver a che fare più comunemente. Sicuramente usare sudo ha i suoi vantaggi (e svantaggi), ma non voglio aprire qui un dibattito al riguardo -- semplicemente, in filosofia *nix, l'amministratore sa quello che fa.

La domanda è, quindi, come può farlo se 'su' non vuole fare il suo lavoro se lanciato da uno script eseguito via ssh?

Lo script di esempio potrebbe essere una cosa del tipo:

#!/bin/bash
for T in `seq -w 1 100`; do
    ssh macchina_$T "su - -c \"$@\""
done

che, nell'intenzione dell'autore, dovrebbe eseguire il comando passato come parametro su tutte e 100 le macchine (da macchina_001 a macchina_100) coi privilegi di root.

Ovviamente, non funziona Sad

Come dicevo più sopra, 'su' si aspetta di avere a disposizione un terminale (non una pipe) nel caso abbia bisogno di richiedere la password di root. Anche se, nella situazione specifica, non ha bisogno di chiederla. Non voglio neppure pensare al perché non venga ritardato il controllo: questa è la situazione -- una lista di 100 "standard in must be a tty".

Inutili i tentativi di aggirare la cosa usando ssh -t (che, da manuale, alloca un terminale)... San Google è demoralizzante: una caterva di risultati, quasi tutti che puntano a flamewar su forum, mailing list e newsgroup su cosa sia meglio usare (sudo, cron, ecc...).
Poi salta fuori un bellissimo link (ora non è più disponibile, ma da cui ho abbastanza spudoratamente copiato Smile quando lo era). E la soluzione è banale, come tutte le soluzioni (quando le si conosce): usare due volte '-t' in ssh.

La spiegazione del perché funziona non è semplicissima, e non sono molto convinto del fatto che nissplus l'abbia azzeccata. In attesa di capire bene il motivo per cui funziona, però, mi accontento del fatto che funziona. Smile Si, sono pigro. Magari un domani inserirò come commento la spiegazione Smile

Realizzato con Drupal, un sistema open source per la gestione dei contenuti