2012-04-19 7 views
15

Sto cercando di accedere a un server ssh ed eseguire qualcosa di simile:ambiente set SSH_ASKPASS variabile o askpass in sudoers, resp

ssh [email protected] 'sudo echo "foobar"' 

Purtroppo sto ottenendo un errore:

sudo: no tty present and no askpass program specified 

Google mi ha detto di impostare la variabile di ambiente SSH_ASKPASS o di impostare askpass nel file sudoers. La mia macchina remota è in esecuzione su Debian 6 e ho installato i pacchetti ssh-askpass e ssh-askpass-gnome e il mio file sudoers assomiglia a questo:

Defaults  env_reset 
Defaults  askpass=/usr/bin/ssh-askpass 

# User privilege specification 
root ALL=(ALL) ALL 
user ALL=(ALL) ALL 

Qualcuno può dire quello che sto fare male e come farlo meglio

risposta

18

Ci sono due modi per sbarazzarsi di questo messaggio di errore. Il modo semplice è quello di fornire uno pseudo terminale per il processo sudo remoto. È possibile farlo con l'opzione -t:

ssh -t [email protected] 'sudo echo "foobar"' 
+6

... e nel modo più duro? –

+1

@ bradley.ayers: Il problema è che 'sudo' vuole leggere una password da una tty. O fornite un tty per sudo o evitate il controllo della password in sudo. Quest'ultimo è più difficile se si vuole ottenere la sicurezza giusta. – nosid

+0

@nosid Grazie per questo. –

-3

ne dite di aggiungere questo nel file sudoers:

user ALL=(ALL) NOPASSWD: ALL 
+3

Non è molto sicuro. –

+1

Accetto, ma consigliato solo per i server che sono nel controllo – Akshat

+3

La rimozione dei requisiti della password sudo non è corretta. È anche peggio se non si specifica alcuna password per gli eseguibili "TUTTI". Non è qualcosa che dovresti considerare OK perché i server sono sotto il tuo controllo. Esistono alternative più sicure che non richiedono alcuna modifica sul server. –

1

EDIT dicembre 2013: Ecco una risposta più breve: prendere un giorno o due per familiarizzare con la libreria Python "Fabric". Fabric risolve un sacco di problemi per quanto riguarda l'invio di attività remote a 1 o più server.

Probabilmente vorrete ancora impostare un nome utente sul sistema di destinazione che possa eseguire comandi senza password (e potete usare anche Fabric per farlo!).

Basta fare attenzione che alcuni aspetti di Fabric non sono perfettamente Pythonic. Inoltre, Fabric è stato progettato innanzitutto per gli amministratori di sistema, le persone che desiderano eseguire comandi batch sui server. Se stai provando a fare qualcos'altro (come automatizzare alcuni server o scenari molto specifici), ti consigliamo di comprendere appieno come funzionano "con le impostazioni" e/o il decoratore @roles. Non ho guardato indietro ...

(E sì, ho ricevuto comandi SSH remoti che funzionano su sistemi "remoti", ovvero il server A chiede al server B di connettersi al server C, e il ritorno del comando è visto sul server A anche se A non parla direttamente al server C. Rende la configurazione di laboratorio più facile!).

Risposta originale: Esistono MOLTE soluzioni a questo problema. Cavalli per i corsi; alcuni sono migliori di altri in diverse situazioni.

La domanda posta è come risolvere l'errore "no TTY". Questo sembra essere l'obiettivo, quindi presumo che parlare di sudoers sia solo un tentativo di soluzione per evitare il problema TTY.

Opzione 1) La risposta di Askhat funziona alla grande ... il più delle volte. In realtà, specifica sempre "-tt" che funziona su più sistemi di destinazione.

Nota si continuerà a riscontrare il problema se si utilizza una libreria SSH come Paramiko, che non ha un modo intuitivo di fare "-t".

Opzione 2) La mia risposta - è specificare un ASKPASS che è STDIN.Quindi questo esempio soddisfa sia il requisito della password sudo sia il TTY: $ shell> ssh [email protected] 'echo "password" | sudo -S echo "foobar"'

Opzione 3) Sì, è possibile disabilitare sudo controlli di password su tutti o alcuni utenti, ma non è bello su un server di produzione.

opzione 4) È possibile remoto "requiretty" (o impostare "! Requiretty" per tutti o alcuni utenti in sudoers. Anche in questo caso, non raffreddare su una casella di produzione.

E 'meglio evitare di fare modifiche al server. Un giorno quel server verrà sostituito, le impostazioni torneranno ai valori predefiniti e lo script smetterà di funzionare.

Nota che una volta comprese tutte le opzioni, si aprono le porte a un maggior numero di automazione (ad esempio una sceneggiatura sul tuo laptop che può connettersi a un elenco di nomi host di server ed eseguire attività sudo su quei server senza che sia necessario copiare detti script su quei server)

5

Piuttosto che assegnare un TTY o impostare una password che può essere vista nella riga di comando, fare qualcosa di simile.

Creare un file di shell che eco di rivelare la propria password come:

#!/bin/bash 

echo "mypassword" 

quindi copiare che al nodo che si desidera utilizzare scp come questo:

scp SudoPass.sh somesystem:~/bin 

Poi, quando si ssh effettuare le seguenti operazioni:

+0

come dire 'export SUDO_ASKPASS = 'echo" mypassword "'; sudo whatever_command'? Non l'ho provato da solo, ma penso che dovrebbe funzionare ... – anishsane

+0

Questo non funziona per me. Ricevo ancora: '$ SUDO_ASKPASS = $ HOME/askpass.sh; sudo -A "echo hello" 'il seguente output:' sudo: nessun programma askpass specificato, prova ad impostare SUDO_ASKPASS' –

+0

@white_gecko: perché non hai esportato la variabile d'ambiente. Prova: 'esporta SUDO_ASKPASS = $ HOME/askpass.sh; sudo -A "/ bin/true" ' – miklosq

2

Un altro modo è eseguire sudo -S al fine di "Scrivere il prompt per l'errore standard e leggere la password dallo standard input invece di utilizzare il dispositivo terminale" (secondo man) insieme cat:

cat | ssh [email protected] 'sudo -S echo "foobar"' 

Basta inserire la password quando viene richiesto a.

Un vantaggio è che è possibile reindirizzare l'output del comando remoto di un file senza "[sudo] password per ..." in esso:

cat | ssh [email protected] 'sudo -S tar c --one-file-system /' > backup.tar 
+0

Questo mi ha avvicinato .... (in realtà è stata richiesta la password), ma la digitazione non ha fatto nulla. Invece, ho ottenuto '[sudo] password per il nome utente: Scusa, riprova. Apparirà automaticamente 3 volte e poi uscirà. –

Problemi correlati