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.