Rsync su SSH che non viene presentato

Sto utilizzando il seguente command nella crontab di root su Debian.

rsync -vqrlHEAXogDtzhi --log-file=${LOG} --progress --rsync-path="sudo /usr/bin/rsync" --exclude-from=$CONFIG_DIR/excludes -e "ssh -i /home/backups/.ssh/id_rsa" backups@${HOSTNAME}:/ ${BACKUP_DIR} 

E ho la seguente:

  • Apache2 server che utilizza un sacco di CPU
  • Nell'output di `last`, cosa significa il suffisso" .d "dopo un indirizzo IP?
  • Collegamento del sistema Linux per passare da 2 interfacce
  • C'è un modo per installare Apache Bench (ab) senza installare apache
  • Come si imposta la dimensione del block bzip2 quando si utilizza tar?
  • Perché questo tee sta perdendo lo stdout?
  •  sudo: no tty present and no askpass program specified 

    Ho provato a aggiungere -t al command ssh e ottengo:

     Pseudo-terminal will not be allocated because stdin is not a terminal. 

    Ho provato ad aggiungere -t -t al command ssh e ottengo:

     protocol version mismatch -- is your shell clean? 

    Ho aggiunto un .hushlogin all'utente di backup nella casella remota e ho confermato che posso utilizzare ssh come backup utilizzando un tasto nella casella remota con niente visualizzato (il login è silenziato). Ho ancora questi messaggi.

    Notare che posso utilizzare ssh come backup per la casella remota utilizzando un tasto correttamente.

    Notare che il mio sudo non dispone dell'opzione -tt.

    Notare che il seguente è impostato nel file / etc / sudoers di origine e destinazione:

     backups ALL= NOPASSWD:/usr/bin/rsync 

    Si noti che il file / etc / sudoers non ha alcun riferimento a:

     Defaults requiretty 

    Notare che non ho eco la mia password nel command.

    Come posso pelle questo gatto? : |

    Grazie

  • Il burattino a volte non può trovare fatti standard come l'osfamily
  • Come recuperare un arrays mdadm su Synology NAS con l'unità in stato "E"?
  • Postgresql / etc / postgresql non esiste
  • Ogni script presente in /etc/network/if-up.d viene eseguito quando viene visualizzata un'interface?
  • direttiva alias con posizione nidificata per catturare file php - richieste per file php che danno 404
  • eseguendo uno script sh dal cron
  • 4 Solutions collect form web for “Rsync su SSH che non viene presentato”

    A volte pensi troppo alle cose.

    Rsync non è stato installato sul sistema remoto.

    / facepalm

    1. Non è necessario sudo se il lavoro cron esce da root.
    2. C'è una serie di bandiere inutili: -rlptgoD ; rimuovere e sostituire con -a .
    3. Il messaggio TTY da sudo è per il TTY locale mentre l'opzione -t per ssh è per il TTY remoto . Non confondere i due.
    4. Non -v e -q contraddicono l'un l'altro?
    5. L'ultima preoccupazione dovrebbe essere se la chiave privata SSH locale sia crittografata o less. Il primo non può essere utilizzato con corse automatiche (ad esempio, quelle in cui stdin non sono TTY, non vengono eseguite da un terminal o da un emulatore terminal).

    MODIFICA / AGGIORNAMENTO :

    • Ritengo 1 e 2.
    • 3 dovrebbe essere circa che non ci sia TTY locale quando cron è in esecuzione, e SSH non lo assegna in remoto poiché non c'è un locale.

    Immagino che sia un problema chiave di ssh. La chiave privata del backup ha una frase di passaggio o la chiave pubblica non è nel keychain degli utenti remoti. Forse il tuo tentativo precedente ha usato un tasto già caricato nel tuo portchiavi?

    Mettere questo in modo da poter ricordare e condividere questo trucco:

     rsync -av -e "ssh -tt" --rsync-path="stty raw -echo; sudo /usr/bin/rsync" user@${HOSTNAME}:/ ${DEST_DIR} 

    Questo metodo sembra ignorare il requisito per un tty come eseguito su un file predefinito /etc/sudoers un sistema con Defaults requiretty . Queste informazioni sono state create dopo aver esaminato questa domanda e risposte SO .

    In questa risposta, essi consigliano di rimuovere gli Defaults requiretty da /etc/sudoers . Questo è il metodo più semplice. Tuttavia, se non è ansible modificare l'host remoto /etc/sudoers per rimuovere questa opzione di configuration, è ansible provare a forzare il rsync locale per utilizzare ssh -tt . Questa opzione per ssh è descritta nella pagina del manuale del client ssh come questa:

    Forza l'assegnazione di pseudo-terminal. Questo può essere utilizzato per eseguire programmi arbitrari basati su schermo su una macchina remota, che può essere molto utile, ad esempio durante l'attuazione dei servizi di menu. Le opzioni multiple-t consentono l'assegnazione di tty, anche se ssh non dispone di un tty locale.

    Quindi, forzoniamo ssh per assegnare un pseudo-tty per evitare l'errore:

     Pseudo-terminal will not be allocated because stdin is not a terminal. stty: standard input: Inappropriate ioctl for device sudo: sorry, you must have a tty to run sudo 

    Quindi, il --rsync-path viene sovrascritto con un command per eseguire le seguenti operazioni:

     stty raw -echo; sudo /usr/bin/rsync 

    stty raw -echo è impostare la disciplina di linea del terminal remoto come passare attraverso. Questo rende effettivamente il comportmento come un pipe che verrà utilizzato invece di un pseudo-terminal senza -tt .

    Quindi il command rsync remoto sarà sudo /usr/bin/rsync , che ora ha un pseudo-tty e passerà il controllo richiesto per sudo .

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.