2011-09-27 6 views
11

Io sono la creazione di un file di script a livello di codice e chiamare psftp.exe come segue:Come passare valore al PSFTP pronta

psftp [email protected] -pw password -b psftpscript.txt 

ma richiede l'input dell'utente

chiave host del server non viene memorizzato nella cache in il registro. Non hai la garanzia che il server sia il computer che pensi sia. L'impronta digitale della chiave rsa2 del server è: [ssh-rsa 1024 somekey] Se ci si fida di questo host , immettere "y" per aggiungere la chiave alla cache di PuTTY e continuare la connessione . Se vuoi continuare a connetterti solo una volta, senza aggiungendo la chiave alla cache, inserisci "n". Se non ti fidi di questo host, premi Invio per abbandonare la connessione. Memorizza la chiave nella cache? (sì/no)

Ho bisogno che sia completamente libero, automatico. Ho provato il parametro -batch ma semplicemente abbandona la connessione

risposta

-2

Ho finito per aggiungere la chiave alla cache immettendo 'y' al prompt. Ho dovuto farlo solo una volta, e dopo di ciò non c'è più bisogno, funziona bene.

+1

-1: questo non è completamente automatico: venga visualizzata prima volta la connessione è aperta. Se qualcuno capita di svuotare la cache, il programma si interromperà. Fare affidamento su ciò che non sta accadendo è male! – ya23

3

È possibile creare un file come input contenente solo ay e ritorno a capo quindi eseguire

psftp [email protected] -pw password -b psftpscript.txt < filename.txt 

Grazie a James da http://www.sqlservercentral.com/Forums/Topic281954-9-1.aspx per una soluzione così semplice

+0

Non suggerire a nessuno di accettare ciecamente una chiave host di un server SSH senza spiegare le conseguenze sulla sicurezza! In questo modo si perde una protezione contro [attacchi MITM] (https://en.wikipedia.org/wiki/Man-in-the-middle_attack). –

2

In Net, ho scoperto che il metodo di cui sopra non ha funzionato abbastanza come previsto. Il trucco consisteva nell'utilizzare il reindirizzamento di input integrato di .Net e non nell'operatore <. Ecco ciò che il codice è simile ora:

System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
proc.EnableRaisingEvents = false; 
proc.StartInfo.FileName = "c:\\psftp.exe"; 
proc.StartInfo.UseShellExecute = false; 
proc.StartInfo.RedirectStandardInput = true;    
proc.StartInfo.Arguments = strIP + " -v -l " + strUsername + " -pw " + strPassword + " -b " + strBatchFilename;    
proc.Start(); 
StreamWriter myStreamWriter = proc.StandardInput; 
myStreamWriter.WriteLine("Y\n"); //override the public key question <--- 
myStreamWriter.Close(); 
proc.WaitForExit(); 
proc.Close(); 
+0

+1: buona risposta, vincolata a .NET, ma utile. – ya23

+0

Non suggerire a nessuno di accettare ciecamente una chiave host di un server SSH senza spiegare le conseguenze sulla sicurezza! In questo modo si perde una protezione contro [attacchi MITM] (https://en.wikipedia.org/wiki/Man-in-the-middle_attack). –

+0

@MartinPrikryl - mentre hai perfettamente ragione su questo, il tuo commento non dovrebbe andare nella domanda? questo non è esattamente ciò che il richiedente ha chiesto? – FuzzyAmi

21

Ho avuto lo stesso problema con l'esecuzione di uno script automatico in 'sandbox' di 2008 Server di Windows come ambiente. Ho finito per l'esecuzione del seguente che entra nel y al prompt per voi:

echo y | psftp [email protected]stname.com -l username -pw password -b psftpscript.txt 

Spero che questo aiuti!

Nota: Ho dovuto solo eseguire l'eco y una volta e rimuovendolo per la seconda esecuzione non chiedevo più la chiave per essere memorizzata nella cache.

+13

Nota: se echo 'n', invece, otterrai un comportamento più coerente. Continuerete comunque con la connessione, ma la chiave non verrà memorizzata nella cache. Te lo chiederà ogni volta. –

+2

Funziona come previsto un caricamento file ininterrotto senza interazione dell'utente. Ho persino provato manualmente una volta accettato un tasto. Il file di script "echo n | psftp.exe ..." funziona ancora. – Whome

+0

Non ha funzionato per me se ho quel comando echo in un file batch (.bat) che precede la chiamata a psftp. Eseguo. Bat dal prompt dei comandi. – VISQL

0

Questo non risponde alla tua domanda direttamente, ma fornisce una possibile soluzione:

Avviare un prompt dei comandi come l'utente che eseguirà lo script e manualmente accetta il certificato. Quindi, su future connessioni, non avrai il problema.

Data la necessità, oltre quanto affermato, questo può o non può funzionare. Sono arrivato a questa domanda con lo stesso problema e ho finito per risolverlo usando l'approccio che ho appena descritto.

8

quando lo esegui la prima volta, ti mostrerà la tua chiave per il server. Copiare la chiave e poi sulla linea di comando, specificare la chiave host in questo modo:

psftp yourhostAddress -hostkey 06:15:d4:3b:e4:e8:23:c0:d6:6d:45:47:7e:bd:8d:74 -l yourusername -pw yourpassword -batch

+0

'-hostkey' non è un parametro valido. E questo non funziona con '-i', richiede ancora l'input y/n. – niksofteng

+0

@NikhilVartak hostkey è stato aggiunto a mastice nel 2014. quale versione di mastice stai correndo? –

1

ho avuto il problema in cui non ho avuto il permesso di eliminare \ rinominare il file sul server remoto e il i file contengono il timestamp. Quindi avevo bisogno di scaricare i file per nome. Lo psftp non può accettare parametri (o in alcun modo a mia conoscenza) e non è stato possibile modificare dinamicamente i nomi dei file in base alla data corrente.

Quindi, dal file batch che sto chiamando i comandi psftp ho creato i comandi dinamicamente e con il file con l'indicazione temporale pertinente. Potrei copiare solo i file di oggi che è meglio quindi copiare ogni volta ogni cosa.

cd "C:\CX\FTP\IG\Files" 
echo cd outbound > C:\SFTP\temp.txt 
echo mget file_%date:~10,4%%date:~4,2%%date:~7,2%*.csv >> C:\SFTP\temp.txt 
echo quit >> C:\SFTP\temp.txt 
echo close >> C:\SFTP\temp.txt 
C:\SFTP\psftp [email protected] -b C:\SFTP\temp.txt 
close 
exit 

Il "echo cd in uscita> C: \ SFTP \ temp.txt" ripulito il file vecchio e iniziare a scrivere il contenuto del nuovo file. Il "echo mget file_% data: ~ 10,4 %% data: ~ 4,2 %% data: ~ 7,2% .csv >> C: \ SFTP \ temp.txt" ha generato la creazione del comando : "mget file_20151008 .csv" che scarica tutti i file che iniziano con "file_20151008 ..." le successive 2 righe hanno appena terminato l'azione e la riga "C: \ SFTP \ psftp [email protected] -b C: \ SFTP \ temp.txt "eseguirlo.

come risultati temp.txt assomiglia a questo:

cd outbound 
mget file_20151008*.csv 
quit 
close