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:
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
sudo apt-get install sshpass
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.