Come eseguire il comando sftp con una password dallo script Bash?


173

Devo trasferire un file di registro su un host remoto usando sftp da un host Linux. Mi sono state fornite le credenziali per lo stesso dal mio gruppo operativo. Tuttavia, poiché non ho il controllo su un altro host, non riesco a generare e condividere le chiavi RSA con l'altro host.

Quindi c'è un modo per eseguire il sftpcomando (con il nome utente / password forniti) dall'interno dello script Bash attraverso un processo cron ?

Ho trovato una domanda Stack Overflow simile, specificare la password per sftp in uno script Bash , ma non c'era una risposta soddisfacente al mio problema.

Risposte:


178

Hai alcune opzioni oltre all'utilizzo dell'autenticazione con chiave pubblica:

  1. Usa il portachiavi
  2. Usa sshpass (meno sicuro ma probabilmente soddisfa i tuoi requisiti)
  3. Usa prevedono (meno sicuro e più codice necessario)

Se decidi di dare una possibilità a sshpass ecco uno snippet di script funzionante per farlo:

export SSHPASS=your-password-here
sshpass -e sftp -oBatchMode=no -b - sftp-user@remote-host << !
   cd incoming
   put your-log-file.log
   bye
!

3
Per il suo utilizzo su Mac: stackoverflow.com/questions/9102557/...
anubhava

18
Non c'è bisogno di esportare, penso. SSHPASS=password sshpass -e ...dovresti ... dovrebbe.
Jens,

9
Sono stato in grado di fare un one-liner per scaricare un file di registro:sshpass -p "my_password" sftp -oPort=9999 user@host:dir/file.log
Cloud Artisans,

6
@gorus: One-liner è molto bello, tuttavia non volevo usare la password dalla riga di comando a causa dei rischi di ficcanaso potenziati.
anubhava,

8
-oBatchMode=noè stato il pezzo mancante cruciale per me.
richardkmiller,

99

Un altro modo sarebbe usare lftp:

lftp sftp://user:password@host  -e "put local-file.name; bye"

Lo svantaggio di questo metodo è che altri utenti sul computer possono leggere la password da strumenti simili pse che la password può diventare parte della cronologia della shell.

Un'alternativa più sicura disponibile da LFTP 4.5.0 è l'impostazione della LFTP_PASSWORDvariabile di ambiente e l'esecuzione di lftp con --env-password. Ecco un esempio completo:

LFTP_PASSWORD="just_an_example"
lftp --env-password sftp://user@host  -e "put local-file.name; bye"

LFTP include anche una fantastica funzione di mirroring (può includere l'eliminazione dopo il trasferimento confermato --Remove-source-files):

lftp -e 'mirror -R /local/log/path/ /remote/path/' --env-password -u user sftp.foo.com

9
+1 per suggerire un'alternativa ma possiamo evitare di fornire la password dalla riga di comando?
Anubhava,

1
Sottovalutato per aver mostrato la password a chiunque sullo stesso computer
Aaron Digulla,

10
È possibile creare il file di script per lftp, in questo modo non sarà necessario fornire la password nella riga di comando. Crea un file put-script: open sftp://user:password@host; put local-file.name; exit esegui In lftp -f put-script questo modo non devi disporre di nome utente e password in una riga di comando e puoi impostare autorizzazioni restrittive per il tuo file di script.
obaranovsky,

@obaranovsky Questa è una buona idea. Mi chiedo se dovessi aggiungere questo alla mia variabile di ambiente come alias o funzione, sarebbe sicuro e possibile nasconderlo agli altri utenti?
Sdkks,

1
Molto più facile da fare lftpche scherzare con sftpe sshpass. Buona risposta.
MeanEYE

53

Aspettarsi è un ottimo programma da usare.

Su Ubuntu installalo con:

sudo apt-get install expect

Su una macchina CentOS installarlo con:

yum install expect

Supponiamo che tu voglia stabilire una connessione a un server sftp e quindi caricare un file locale dal tuo computer locale al server sftp remoto

#!/usr/bin/expect

spawn sftp username@hostname.com
expect "password:"
send "yourpasswordhere\n"
expect "sftp>"
send "cd logdirectory\n"
expect "sftp>"
send "put /var/log/file.log\n"
expect "sftp>"
send "exit\n"
interact

Questo apre una connessione sftp con la tua password al server.

Quindi passa alla directory in cui vuoi caricare il tuo file, in questo caso "logdirectory"

Questo carica un file di registro dalla directory locale trovata in / var / log / con il nome del file che è file.log nella "directory di registro" sul server remoto


Grazie per la tua risposta, mi aspettavo come una delle mie opzioni per raggiungere questo obiettivo.
anubhava,

Grazie. Ho trovato la tua risposta attraverso una ricerca, l'ho usata e ho creato uno script con successo. Ho appena pubblicato la sceneggiatura di poterity
rezizter il

Grazie mille per la tua risposta, l'ho già votato :)
anubhava,

Sto usando questo per inserire la passphrase per la chiave privata ssh. È più comodo mettere la stessa chiave pubblica su tutti i server e ruotare periodicamente la passphrase della chiave privata.
sdkks,

24

È possibile utilizzare lftp in modo interattivo in uno script di shell in modo che la password non venga salvata in .bash_history o simile effettuando quanto segue:

vi test_script.sh

Aggiungi quanto segue al tuo file:

#!/bin/sh
HOST=<yourhostname>
USER=<someusername>
PASSWD=<yourpasswd>

cd <base directory for your put file>

lftp<<END_SCRIPT
open sftp://$HOST
user $USER $PASSWD
put local-file.name
bye
END_SCRIPT

E scrivi / esci dall'editor vi dopo aver modificato l'host, l'utente, il pass e la directory per la digitazione del file put. :wqQuindi rendi eseguibile il tuo script chmod +x test_script.shed eseguilo ./test_script.sh.


2
Per sovrascrivere il file esistente, aggiungi "set xfer: clobber on" dopo lftp << END_SCRIPT
Balaji Natarajan

17

Recentemente mi è stato chiesto di passare da ftp a sftp, al fine di proteggere la trasmissione dei file tra server. Stiamo usando il pacchetto Tectia SSH, che ha un'opzione --passwordper passare la password dalla riga di comando.

esempio : sftp --password="password" "userid"@"servername"

Esempio di lotto:

(
  echo "
  ascii
  cd pub
  lcd dir_name
  put filename
  close
  quit
    "
) | sftp --password="password" "userid"@"servername"

Ho pensato di condividere queste informazioni, dato che stavo guardando vari siti Web, prima di eseguire il comando help ( sftp -h), e sono rimasto sorpreso nel vedere l'opzione password.


9
+1 per te un buon suggerimento. Tuttavia, ciò richiederà di passare la password dalla riga di comando e chiunque sul sistema esegua il pscomando sarà in grado di vedere la password.
anubhava,

4
Ci ho provato, ho ottenutounknown option -- - usage: sftp [-1246aCfpqrv] [-B buffer_size] [-b batchfile] [-c cipher] [-D sftp_server_path] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-R num_requests] [-S program] [-s subsystem | sftp_server] host sftp [user@]host[:file ...] sftp [user@]host[:dir[/]] sftp -b batchfile [user@]host
cyber8200

1
@ihue probabilmente perché hai bisogno di Techia SSH , non OpenSSH
qris

17

Puoi eseguire l'override abilitando l'autenticazione con meno password. Ma dovresti installare le chiavi (pub, priv) prima di procedere.

Eseguire i seguenti comandi sul server locale.

Local $> ssh-keygen -t rsa 

Premere INVIO per tutte le opzioni richieste. Non è necessario digitare alcun valore.

Local $> cd .ssh
Local $> scp .ssh/id_rsa.pub user@targetmachine:
Prompts for pwd$>  ENTERPASSWORD

Connettiti al server remoto usando il seguente comando

Local $> ssh user@targetmachine
Prompts for pwd$> ENTERPASSWORD

Eseguire i seguenti comandi sul server remoto

Remote $> mkdir .ssh
Remote $> chmod 700 .ssh
Remote $> cat id_rsa.pub >> .ssh/authorized_keys
Remote $> chmod 600 .ssh/authorized_keys
Remote $> exit

Eseguire il comando seguente sul server locale per testare l'autenticazione senza password. Dovrebbe essere collegato senza password.

$> ssh user@targetmachine

1
+1 per la tua risposta, ma la domanda riguardava il fatto di farlo senza chiavi pubbliche / private.
Anubhava,

oops .. Ho appena visto le restrizioni sulla condivisione delle chiavi :)
SriniV,

Per curiosità questo comando lftp -p ${port} -u ${login_id},${password} ${ip_number}quando viene invocato da uno script di shell li stamperà da qualche parte? Come hai risolto oltre a sshpass?
SriniV,

Non ho lftpe mi affido a sshpassMac e Linux entrambi.
Anubhava,

Oro zecchino. Grazie! :)
Nikolay Tsenkov

7

Combina sshpass con un file di credenziali bloccato e, in pratica, è sicuro come qualsiasi altra cosa - se hai root sulla scatola per leggere il file di credenziali, tutte le scommesse sono comunque disattivate.


5

Programma Bash in attesa di sftp per richiedere una password, quindi inviarlo insieme:

#!/bin/bash
expect -c "
spawn sftp username@your_host
expect \"Password\"
send \"your_password_here\r\"
interact "

Potrebbe essere necessario installare aspettarsi, modificare il testo di "Password" in lettere minuscole "p" in modo che corrisponda a ciò che il prompt riceve. Il problema qui è che espone la tua password in testo semplice nel file e nella cronologia dei comandi. Che quasi sconfigge lo scopo di avere una password in primo luogo.


+1 ma penso che tu affermi chiaramente quali sono i problemi con questo approccio.
anubhava,

5

Puoi usare sshpass per questo. Di seguito sono riportati i passaggi

  1. Installa sshpass per Ubuntu - sudo apt-get install sshpass
  2. Aggiungi l'IP remoto al tuo file host noto se è la prima volta per Ubuntu -> ssh user @ IP -> inserisci 'yes'
  3. dare un comando combinato di scp e sshpass per questo. Di seguito è riportato un codice di esempio per affrontare la guerra a Tomcat remoto sshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #user@#RemoteIP:/var/lib/tomcat7/webapps
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.