2011-09-27 15 views
11

Estoy creando un archivo de script de programación y llamar a psftp.exe de la siguiente manera:Cómo pasar valor a psftp pronta

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

pero espera por una entrada de usuario

clave de host del servidor no se almacena en caché en el registro. No tiene garantía de que el servidor es la computadora que usted cree que es. La huella dactilar de la clave rsa2 del servidor es: [ssh-rsa 1024 somekey] Si confía en este host , ingrese "y" para agregar la clave a la memoria caché de PuTTY y continuar conectándose. Si desea continuar con la conexión solo una vez, sin agregando la clave a la memoria caché, ingrese "n". Si no confía en este host, , presione Volver para abandonar la conexión. ¿Almacenar la clave en el caché? (y/n)

Necesito que sea completamente rápido, libre, automático. He intentado con el parámetro -batch pero simplemente abandona la conexión

Respuesta

-2

Terminé agregando la clave a la caché al ingresar 'y' en el indicador. Tuve que hacerlo solo una vez, y después de eso no hay más indicaciones, funciona bien.

+1

-1: esto no es totalmente automático: pronta se muestra por primera vez que la conexión está abierta. Si alguien borra el caché, tu programa se romperá. ¡Confiar en que esto no suceda es malo! – ya23

3

Se puede crear un archivo como entrada contiene solo ay retorno de carro y luego ejecutar

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

Gracias a James de http://www.sqlservercentral.com/Forums/Topic281954-9-1.aspx para una solución tan simple

+0

¡No sugiera a nadie que acepte ciegamente una clave de host de un servidor SSH sin explicar las consecuencias de seguridad! Pierdes una protección contra [ataques MITM] (https://en.wikipedia.org/wiki/Man-in-the-middle_attack) al hacerlo. –

2

En .Net, he encontrado que el método anterior no funcionó del todo como se esperaba El truco fue usar la redirección de entrada incorporada de .Net, y no el operador <. Esto es lo que el código se parece ahora:

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: buena respuesta, restringida a .NET, pero útil. – ya23

+0

¡No sugiera a nadie que acepte ciegamente una clave de host de un servidor SSH sin explicar las consecuencias de seguridad! Pierdes una protección contra [ataques MITM] (https://en.wikipedia.org/wiki/Man-in-the-middle_attack) al hacerlo. –

+0

@MartinPrikryl: aunque tienes razón en esto, ¿no deberías incluir tu comentario en la pregunta? ¿No es esto exactamente lo que pidió el asker? – FuzzyAmi

21

tuve el mismo problema con la ejecución de un script sin asistencia en la caja de arena '' de Windows 2008 Server como el medio ambiente. Terminé la ejecución del siguiente que entra en el y en el símbolo para usted:

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

Espero que esto ayude!

Nota: Solo tuve que ejecutar el eco y una vez y quitarlo para la segunda ejecución no solicitó que la clave fuera almacenada en la memoria caché.

+13

Nota: si repite 'n' en su lugar obtendrá un comportamiento más consistente. Aún continuará con la conexión, pero la clave no se almacenará en caché. Te lo pedirá todo el tiempo. –

+2

Funciona como se esperaba y no se interrumpe la carga de archivos sin la interacción del usuario. Incluso probé manualmente una vez que acepté una llave. El archivo de script "echo n | psftp.exe ..." todavía funciona. – Whome

+0

No funcionó para mí si tengo ese comando echo en un archivo por lotes (.bat) anterior a la llamada a psftp. Ejecuto el .bat desde el símbolo del sistema. – VISQL

0

Esto no responde a su pregunta directamente, sino que proporciona una posible solución:

lanzamiento un símbolo del sistema como el usuario que va a ejecutar la secuencia de comandos y de forma manual aceptar el certificado Entonces, en futuras conexiones, no tendrás el problema.

Dada su necesidad, más allá de lo que se ha indicado, esto puede funcionar o no. Llegué a esta pregunta con el mismo problema y terminé resolviéndola usando el enfoque que acabo de describir.

8

cuando lo ejecute la primera vez, le mostrará su clave para el servidor. Copiar la llave y luego en la línea de comandos, especificar su clave de host de esta manera:

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' no es un parámetro válido. Y esto no funciona con '-i', todavía pide entrada y/n. – niksofteng

+0

@NikhilVartak hostkey se agregó a putty en 2014. ¿Qué versión de masilla está ejecutando? –

1

tuve el problema en el que yo no tenía el permiso para eliminar \ cambiar el nombre de archivo a través del servidor remoto y el archivos contiene marca de tiempo. Así que necesitaba descargar archivos por nombre. La psftp no puede aceptar params (o de ninguna manera que yo sepa) y no pude cambiar dinámicamente los nombres de los archivos de acuerdo con la fecha actual.

Por lo tanto, desde el archivo de proceso por lotes que estoy llamando a los comandos de psftp creé los comandos dinámicamente y con el archivo con la marca de tiempo relevante. Podría copiar solo los archivos de hoy, que es mejor, luego copiar todo cada vez.

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 

El "eco cd saliente> C: \ SFTP \ temp.txt" limpiado el antiguo archivo y empezar a escribir el contenido del nuevo archivo. El "echo mget file_% date: ~ 10,4 %% date: ~ 4,2 %% date: ~ 7,2% .csv >> C: \ SFTP \ temp.txt" dio como resultado la creación del comando : "mget file_20151008 .csv" que descarga todos los archivos que comienzan con "file_20151008 ..." las siguientes 2 filas terminaron la acción y la línea "C: \ SFTP \ psftp [email protected] -b C: \ SFTP \ temp.txt "ejecutarlo.

como resultado temp.txt se ve así:

cd outbound 
mget file_20151008*.csv 
quit 
close 
Cuestiones relacionadas