Come passare la password a su / sudo / ssh senza sovrascrivere il TTY?


148

Sto scrivendo un programma C Shell che farà suo sudoo ssh. Tutti vogliono le loro password nell'input della console (il TTY) anziché in stdin o nella riga di comando.

Qualcuno conosce una soluzione?

L'impostazione senza password sudonon è un'opzione.

potrebbe essere un'opzione, ma non è presente sul mio sistema ridotto.



Risposte:


215

Per sudo esiste un'opzione -S per accettare la password dall'input standard. Ecco la voce man:

    -S          The -S (stdin) option causes sudo to read the password from
                the standard input instead of the terminal device.

Ciò ti consentirà di eseguire un comando come:

echo myPassword | sudo -S ls /tmp

Per quanto riguarda ssh, ho fatto molti tentativi di automatizzare / scriptare il suo utilizzo senza successo. Non sembra esserci alcun modo incorporato per passare la password al comando senza chiedere conferma. Come altri hanno già detto, l' utilità " prevede " sembra mirare a risolvere questo dilemma, ma alla fine, impostare l'autorizzazione corretta per la chiave privata è la strada giusta da percorrere quando si tenta di automatizzare ciò.


2
Fortunatamente, Ruby ha un client SSH integrato che ti consente di specificare la password. Potresti provare ruby ​​-e "richiede 'net / ssh'; Net :: SSH.start ('example.com', 'test_user',: password => 'secret') do | ssh | mette 'Loggato correttamente'; while cmd = gets; put ssh.exec! (cmd); end end "
user1158559

13
Odio essere un povero partito qui, ma farlo può far apparire la tua password in un elenco di processi. Stavo cercando di determinare un modo migliore e mi sono imbattuto in questo articolo e sono rimasto sorpreso dal fatto che nessuno lo avesse sottolineato. Ottima soluzione, ma attenzione ai rischi.
Matt,

A proposito di ssh, hai provato a passare la password nella stringa di connessione? come nonroot:yourpassword@hostname.com? Ovviamente le cose sono molto più semplici se usi l'autenticazione delle chiavi e il gestore delle chiavi.
Killah,

12
Evita la password che appare nell'elenco dei processi o nei file di registro inserendola in un file e usando cat; 'cat pw | sudo -S <command>e più tardi rm pw.
CAB

Un altro modo sarebbe usare netcat e consegnare la password su un socket - nc -l 12345 | sudo -S <command>. Dal lato di invio; echo myPassord | nc <target> 12345. Questo sposta solo il problema di gestione della password, ma presumibilmente su una console principale in cui hai più opzioni.
CAB

36

Ho scritto un po 'di Applescript che richiede una password tramite una finestra di dialogo e quindi crea un comando bash personalizzato, come questo:

echo <password> | sudo -S <command>

Non sono sicuro se questo aiuta.

Sarebbe bello se sudo accettasse una password pre-crittografata, quindi potrei crittografarla all'interno del mio script e non preoccuparmi di riecheggiare password di testo chiare in giro. Tuttavia, questo funziona per me e la mia situazione.


27

Per sshè possibile utilizzare sshpass: sshpass -p yourpassphrase ssh user@host.

Devi solo scaricare sshpass prima :)

$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server

12

Ho avuto:

ssh user@host bash -c "echo mypass | sudo -S mycommand"

Per me va bene.


Non ha funzionato per me. ssh richiede ancora la password.
AKS

Eccellente, finalmente qualcosa che posso usare! Grazie. Lo uso all'interno di uno script bash che avvia una sessione ssh e passa i comandi sudo al client. La mia sceneggiatura ha delle linee che risolvono in: ssh -t username @ hostname bash -c "sudo echo fartjuice"
James T Snell

12

Per sudo puoi fare anche questo:

sudo -S <<< "password" command

10

La solita soluzione a questo problema è impostare un'app helper che esegue l'attività che richiede l'accesso da superutente: http://it.wikipedia.org/wiki/Setuid

Sudo non è pensato per essere usato offline.

Modifica successiva: SSH può essere utilizzato con l'autenticazione con chiave pubblica-privata. Se la chiave privata non ha una passphrase, è possibile utilizzare ssh senza richiedere una password.


10

Questo può essere fatto impostando le chiavi pubbliche / private sugli host di destinazione a cui ci si connetterà. Il primo passo sarebbe generare una chiave ssh per l'utente che esegue lo script sull'host locale, eseguendo:

ssh-keygen
Enter file in which to save the key (/home/myuser/.ssh/id_rsa): <Hit enter for default>
Overwrite (y/n)? y

Quindi inserire una password vuota. Successivamente, copia la tua chiave ssh sull'host di destinazione a cui ti connetterai.

ssh-copy-id <remote_user>@<other_host>
remote_user@other_host's password: <Enter remote user's password here>

Dopo aver registrato i tasti ssh, sarai in grado di eseguire un silenzio ssh remote_user@other_hostdal tuo host locale.


7

Forse puoi usare un expectcomando ?:

expect -c 'spawn ssh root@your-domain.com;expect password;send "your-password\n";interact

Tale comando fornisce automaticamente la password.


Sembra carino, ma come posso abilitare il comando wait su una macchina senza permessi di root?
Radon8472,

1
@ Radon8472 Un eseguibile può essere aggiunto a ~ / bin se non si dispone delle autorizzazioni per installarlo. Se il tuo sistema non aggiunge automaticamente ~ / bin al tuo PATH, puoi farlo manualmente con export PATH = "$ PATH: ~ / bin" o aggiungere quel comando al tuo profilo per farlo automaticamente. Se non vuoi cambiare il tuo PERCORSO, puoi invece eseguire il comando usando il suo percorso assoluto: ~ / bin / explore [argomenti] Ricordati di impostare il bit eseguibile: chmod + x ~ / bin /
explore

6

Quando non c'è scelta migliore (come suggerito da altri), allora man socat può aiutare:

   (sleep 5; echo PASSWORD; sleep 5; echo ls; sleep 1) |
   socat - EXEC:'ssh -l user server',pty,setsid,ctty

          EXEC’utes an ssh session to server. Uses a pty for communication
          between socat and ssh, makes it ssh’s  controlling  tty  (ctty),
          and makes this pty the owner of a new process group (setsid), so
          ssh accepts the password from socat.

Tutta la complessità pty, setsid, ctty è necessaria e, mentre potresti non aver bisogno di dormire più a lungo, dovrai dormire. Anche l'opzione echo = 0 vale la pena dare un'occhiata, come sta passando il comando remoto sulla riga di comando di ssh.


1
Questo funzionerà anche per su. sunon ha un'opzione -S (stdin).
aus

È possibile evitare di dormire e utilizzare invece qualcosa di più affidabile?
Michael Pankov,

6

Dai un'occhiata expectall'utility linux.

Ti consente di inviare output a stdio in base alla semplice corrispondenza dei pattern su stdin.


1

Imposta SSH per l'autenticazione con chiave pubblica, senza passphrase sulla chiave. Carichi di guide in rete. Allora non avrai bisogno di una password per accedere. È quindi possibile limitare le connessioni per una chiave in base al nome host del client. Fornisce una sicurezza ragionevole ed è ottimo per gli accessi automatici.


1
ssh -t -t me@myserver.io << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF

Se riesci ad accedere come utente con il tasto ssh, per l'accesso sudo va bene: ssh -t user @ host "echo mypassword | sudo -S sudocommand"
Jack

0

Ho avuto lo stesso problema. script di dialogo per creare directory sul pc remoto. il dialogo con ssh è facile. Uso sshpass (precedentemente installato).

   dialog --inputbox "Enter IP" 8 78 2> /tmp/ip

   IP=$(cat /tmp/ip)


   dialog --inputbox "Please enter username" 8 78 2> /tmp/user

   US=$(cat /tmp/user)


   dialog --passwordbox "enter password for \"$US\" 8 78 2> /tmp/pass

   PASSWORD = $(cat /tmp/pass)


   sshpass -p "$PASSWORD" ssh $US@$IP mkdir -p /home/$US/TARGET-FOLDER


   rm /tmp/ip

   rm /tmp/user

   rm /tmp/pass

saluti dalla Germania

Titus


0

Basandomi sulla risposta di @ Jahid, questo ha funzionato per me su macOS 10.13:

ssh <remote_username>@<remote_server> sudo -S <<< <remote_password> cat /etc/sudoers

0

sshpassun'alternativa migliore è: passh https://github.com/clarkwang/passh

Accedi a un server remoto

 $ passh -p password ssh user@host

Esegui un comando sul server remoto

 $ passh -p password ssh user@host date

altri metodi per passare la password

-p La password (impostazione predefinita: `password ')

-p env: legge la password da env var

-p file: legge la password dal file

qui ho spiegato perché è meglio di sshpass e altre soluzioni.


-1
echo <password> | su -c <command> <user> 

Questo sta funzionando.


1
Questo è l'unico che funziona per me in Fedora. Le persone declassano le risposte solo perché non lavorano nella loro situazione?
Hangchen Yu

2
"su: deve essere eseguito da un terminale" (RPi1B, Raspbian)
notme1560

Sfortunatamente questo non accade nelle versioni recenti di su, che legge invece la password di stdio .
moutonjr,

-1

L'hardcoding di una password in uno script prevede è lo stesso di avere un sudo senza password, in realtà peggio, dato che sudo registra almeno i suoi comandi.



-1

USO:

echo password | sudo command

Esempio:

echo password | sudo apt-get update; whoami

Spero che sia d'aiuto..


-2

È possibile fornire la password come parametro per prevedere lo script.


-11
su -c "Command" < "Password"

Spero sia utile


1
Non è. "su: deve essere eseguito da un terminale" è la risposta a questo.
thelogix,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.