2009-04-03 19 views
43

Sto scrivendo uno script di shell per aggiungere automaticamente un nuovo utente e aggiornare la password. Non so come ottenere il passwd per leggere dallo script della shell invece di richiedere in modo interattivo la nuova password. Il mio codice è sottoUtilizzo del comando passwd da uno script di shell

adduser $1 
passwd $1 
$2 
$2
+0

Simile domanda a: http://askubuntu.com/questions/94060/run-adduser-non-interactively/667842#667842 – ThorSummoner

risposta

71

da "man 1 passwd":

--stdin 
      This option is used to indicate that passwd should read the new 
      password from standard input, which can be a pipe. 

Quindi nel tuo caso

adduser "$1" 
echo "$2" | passwd "$1" --stdin 

[Aggiornamento] alcuni problemi sono stati portati in su nei commenti:

tuo Il comando passwd potrebbe non avere unOpzione: utilizzare l'utilità invece, come suggerito da ashawley.

Se si utilizza una shell diversa da bash, "echo" potrebbe non essere un comando incorporato, e la shell chiamerà /bin/echo. Questo non è sicuro perché la password verrà visualizzata nella tabella del processo e può essere visualizzata con strumenti come ps.

In questo caso, è necessario utilizzare un altro linguaggio di scripting. Ecco un esempio in Perl:

#!/usr/bin/perl -w 
open my $pipe, '|chpasswd' or die "can't open pipe: $!"; 
print {$pipe} "$username:$password"; 
close $pipe 
+0

È necessario citare le espansioni dei parametri. Inoltre; questo non è in alcun modo forma o forma portatile o addirittura raccomandato nel minimo. Vedi la mia risposta per ulteriori informazioni sull'argomento. – lhunath

+1

Si prega di non usare echo ... | parola d'ordine! La password sarà quindi visibile a tutti gli altri utenti che eseguono ps. E più posti passi la password attraverso (diversi programmi, file, pipe, ecc.), Maggiori sono le possibilità che si diffondano da qualche parte. –

+0

@lhunath: hai ragione sul quoting, lo aggiusterò. @Brian: "echo" è un built-in bash, non * verrà * visualizzato nell'output di 'ps' (almeno in bash, non è sicuro di sh) – 8jean

0

hai guardato la possibilità di -padduser (che per quanto ne so è solo un altro nome per useradd)? Si potrebbe anche voler vedere l'opzione -P di luseradd che accetta una password in chiaro, ma non so se luseradd è un comando standard (potrebbe essere parte di SE Linux o forse solo una stranezza di Fedora).

1

Testato su un'immagine CentOS VMWare che mantengo per questo genere di cose. Si noti che probabilmente si desidera evitare di inserire password come argomenti della riga di comando, poiché chiunque sull'intera macchina può leggerle da 'ps -ef'.

Detto questo, questo funzionerà:

user="$1" 
password="$2" 
adduser $user 
echo $password | passwd --stdin $user 
24

leggere le parole sagge da:

cito:

Niente y si può fare in bash può forse funzionare. passwd (1) non legge dallo standard input. Questo è intenzionale. È per la tua protezione Le password non sono mai state pensate per essere inserite nei programmi o generate dai programmi. Dovevano essere inseriti solo dalle dita di un vero essere umano, con un cervello funzionale, e mai, mai scritti da nessuna parte.

Tuttavia, otteniamo orde di utenti che chiedono come possono aggirare i 35 anni di sicurezza di Unix.

Si va avanti a spiegare come è possibile impostare la password di shadow(5) correttamente, e vi mostra il gnu- I-solo-care-about-sicurezza-se-it-Indifferente-make-me-pensare -troppo-molto -way of abusing passwd(1).

Infine, se avete intenzione di utilizzare la sciocca passwd GNU (1) estensione --stdin, non passare la password metterlo sulla riga di comando.

echo $mypassword | passwd --stdin # Eternal Sin. 
echo "$mypassword" | passwd --stdin # Eternal Sin, but at least you remembered to quote your PE. 
passwd --stdin <<< "$mypassword" # A little less insecure, still pretty insecure, though. 
passwd --stdin < "passwordfile" # With a password file that was created with a secure `umask(1)`, a little bit secure. 

L'ultima è la migliore che si può fare con GNU passwd. Anche se ancora non lo consiglierei.

Inserire la password sulla riga di comando significa che chiunque con il minimo suggerimento di accesso alla casella può controllare ps o simili e rubare la password. Anche se pensi che la tua scatola sia sicura; è qualcosa che si dovrebbe davvero prendere l'abitudine di evitare a tutti i costi (sì, anche il costo di fare un po 'più di difficoltà per ottenere il lavoro fatto).

+1

posso chiedere perché questo è 'ancora piuttosto insicuro'? $ passwd --stdin <<< $ (passa somehost/someuser) –

+1

@JackTang Hai bisogno di preventivi sull'espansione dei parametri. Il motivo per cui <<< è meno sicuro di lhunath

0

È possibile utilizzare the expect utility per azionare tutti i programmi letti da un tty (anziché da stdin, che è ciò che fa passwd). Aspettatevi con esempi pronti per l'esecuzione di tutti i tipi di problemi interattivi, come la registrazione passwd.

40

L'unica soluzione funziona su Ubuntu 12.04:

echo -e "new_password\nnew_password" | (passwd user) 

Ma la seconda opzione funziona solo quando cambio da:

echo "password:name" | chpasswd 

A:

echo "user:password" | chpasswd 

Vedi spiegazioni in originale post: Changing password via a script

+0

'echo 'utente: newpassword' | sudo chpasswd', o senza sudo come root. – ThorSummoner

+1

L'uso di sudo quando si chiama dallo script non è una buona idea ... –

+0

Cosa succede se la password contiene un "\ n" nel primo caso? C'è un modo per gestire questo? Ad esempio 'my @ secret \ npasword123' –

1

Potreste usare chpasswd

echo $1:$2 | chpasswd

17

Al giorno d'oggi:

echo "user:pass" | chpasswd

+3

Per qualche motivo ho ricevuto il seguente errore durante il tentativo del comando: "Errore di manipolazione dei token di autenticazione". Aggiungendo sudo prima che chpasswd abbia risolto questo problema per me. –

0

A volte è utile per impostare una password che nessuno lo sa. Questo sembra funzionare:

tr -dc A-Za-z0-9 < /dev/urandom | head -c44 | passwd --stdin $user 
+2

È meglio disabilitare un account/disabilitare il suo accesso piuttosto che dargli una password sconosciuta ma lasciando attivo il suo login. – DanFromGermany

+1

passwd --delete o --lock – temoto

0

mi sono imbattuto lo stesso problema e per qualche motivo l'opzione "--stdin" non era disponibile sulla versione di passwd stavo usando (fornito su un'Ubuntu 14.04).

Se qualcuno di voi capita di sperimentare lo stesso, è possibile lavorare in giro come ho fatto io: utilizzando il comando chpasswd in questo modo:

echo "<user>:<password>" | chpasswd

0

Questa è la risposta definitiva per un amministratore nodo di Teradata

1: Vai a file/etc/hosts e creare un elenco di nomi IP o un nodo in un file di testo

------------------ file di configurazione per se RVers cominciano ------------
SMP007-1
SMP007-2
SMP007-3
------ file di fine lasciare fuori questi commenti dal file CFG ---

ora lo script

impostare una password su tutti i nodi

printf "ID utente:"
leggere MYUSERID
printf "Nuova password:"
leggere mypass

for i in ` gatto /usr/bin/setpwd.srvrs `
fare
eco cambiare la password su $ i
ssh root @ $ i sudo echo "$ MYUSERID": "$ MYPASS" | chpasswd
eco password modificata in $ i
fatto

ok lo so Ho rotto una regola di sicurezza Cardinale con ssh e radice ma ti farò gente di sicurezza a che fare con esso

_________________________________
mettere questo nel vostro/usr/bin subdir insieme con i vostri file di configurazione setpwd.srvrs

quando si esegue il comando viene richiesto una sola volta per l'ID utente
quindi una volta per la password. Poi lo script attraversa tutti i nodi
nel file setpwd.srvrs fa uno ssh senza password ad ogni nodo
quindi imposta la password senza alcuna interazione da parte dell'utente o secondaria
convalida della password. Ora quante volte hai voluto fare questo
ma non sapevi come? Con grande bisogno, arriva una grande innovazione.

Pensa a quanto è utile qualcosa di simile a un amministratore con centinaia di
server.

0

Per chi ha bisogno di 'eseguito come root' da remoto tramite uno script accedendo un account utente nel file sudoers, ho trovato un orribile trucco male, cioè senza dubbio molto insicura:

sshpass -p 'userpass' ssh -T -p port [email protected] << EOSSH 
sudo -S su - << RROOT 
userpass 
echo "" 
echo "*** Got Root ***" 
echo "" 
#[root commands go here] 
useradd -m newuser 
echo "newuser:newpass" | chpasswd 
RROOT 
EOSSH 
Problemi correlati