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

Ho bisogno di trasferire un file di log 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 altri host, non posso generare e condividere chiavi RSA con l’altro host.

Quindi c’è un modo per eseguire il comando sftp (con il nome utente / password fornito) all’interno dello script Bash attraverso un cron job?

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

Hai alcune opzioni oltre all’utilizzo dell’autenticazione a chiave pubblica:

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

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

 export SSHPASS=your-password-here sshpass -e sftp -oBatchMode=no -b - [email protected] << ! cd incoming put your-log-file.log bye ! 

Un altro modo sarebbe usare lftp:

 lftp sftp://user:[email protected] -e "put local-file.name; bye" 

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

Un’alternativa più sicura disponibile poiché LFTP 4.5.0 imposta la variabile di ambiente LFTP_PASSWORD ed esegue lftp con --env-password . Ecco un esempio completo:

 LFTP_PASSWORD="just_an_example" lftp --env-password sftp://[email protected] -e "put local-file.name; bye" 

LFTP include anche una funzione di mirroring (può includere delete dopo il trasferimento confermato ‘–Remove-source-files’):

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

Aspettarsi è un ottimo programma da usare.

Su Ubuntu installalo con:

 sudo apt-get install expect 

Su una macchina CentOS installalo con:

 yum install expect 

Diciamo che vuoi fare una connessione con un server sftp e poi caricare un file locale dalla tua macchina locale al server sftp remoto

 #!/usr/bin/expect spawn sftp [email protected] 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 va alla directory in cui si desidera caricare il file, in questo caso “logdirectory”

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

È ansible utilizzare lftp in modo interattivo in uno script di shell in modo che la password non venga salvata in .bash_history o simile effettuando le seguenti operazioni:

 vi test_script.sh 

Aggiungi il seguente al tuo file:

 #!/bin/sh HOST= USER= PASSWD= cd  lftp< 

E scrivi / esci dall'editor vi dopo aver modificato l'host, l'utente, il passaggio e la directory per il tuo file put digitando :wq chmod +x test_script.sh esegui lo script eseguibile chmod +x test_script.sh ed chmod +x test_script.sh ./test_script.sh .

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

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

Esempio di batch:

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

Ho pensato di dover 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.

È ansible eseguire l’override triggersndo la password con meno autenticazione. Ma dovresti installare le chiavi (pub, priv) prima di andare a quello.

Esegui 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 [email protected]: Prompts for pwd$> ENTERPASSWORD 

Connetti al server remoto usando il seguente comando

 Local $> ssh [email protected] Prompts for pwd$> ENTERPASSWORD 

Esegui 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 

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

 $> ssh [email protected] 

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

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 che usi Ubuntu -> ssh user @ IP -> inserisci “sì”
  3. dare un comando combinato di scp e sshpass per questo. Di seguito è riportato un codice di esempio per coping di guerra su tomcat sshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #[email protected]#RemoteIP:/var/lib/tomcat7/webapps remoto sshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #[email protected]#RemoteIP:/var/lib/tomcat7/webapps

Programma Bash per attendere sftp per chiedere una password e poi inviarlo:

 #!/bin/bash expect -c " spawn sftp [email protected]_host expect \"Password\" send \"your_password_here\r\" interact " 

Potrebbe essere necessario installare aspettarsi, cambiare la dicitura di “Password” in “p” minuscola per corrispondere a ciò che riceve il prompt. I problemi qui sono 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.