Deseo crear un batch que actualice/sustituya la IP
Deseo crear un batch (bat) que actualice/sustituya la IP contenida en un archivo .txt por la IP actual de mi ordenador. El archivo .txt contiene más datos que deben permanecer inalterados. ¿Es ésto posible?
1 Respuesta
En principio sí. Si la IP a sustituir es fija (digamos 75.32.18.180) sería más sencillo. Si no es fija y es el único texto con una estructura tipo a.b.c.d dentro del archivo supongo que también, aunque exigiría algo más de trabajo. La IP actual de tu ordenador se puede extraer mediante el comando ipconfig. Si solo tienes una tarjeta de red será más fácil de identificar. Si tienes más de una, real o virtual, ethernet + wifi por ejemplo, también exigirá algo más de trabajo.
Si concretas un poco más podemos ponernos a ello.
Por desgracia la IP es dinámica.
No tengo casi experiencia en programacion, y sólo puedo realizar cosas básicas. Consigo sacar la IP a un archivo:
ipconfig | find "IPv4" >Ip.txt
Me aparece lo siguiente en Ip.txt (con espacios, texto y puntos)
Direcci¢n IPv4. . . . . . . . . . . . . . : *.*.*.*
Lo siguiente sería poder extraer sólo "*.*.*.*"
El paso siguiente sería insertarlo dentro de otro .txt, sustituyendo las direcciones IP existentes, y sin alterar el otro contenido del .txt.
Pero me falta la experiencia para todo ésto.
Para obtener solo la IPv4 lo puedes hacer con el comando (tecleado directamente en una ventana CMD):
for /f "tokens=1,2 delims=:" %a in ('ipconfig ^| find "IPv4"') DO (echo%b)
Si se incluye en un bat (como será en este caso) hay que duplicar los "%" de las variables internas y en lugar de sacarlo por pantalla con ECHO se asignaría a una variable, por ejemplo DirIP. Quedaría
for /f "tokens=1,2 delims=:" %%a in ('ipconfig ^| find "IPv4"') DO (set DirIP=%%b)
De modo que esto (la IP dinámica de tu equipo) no supone gran problema. Si el texto del TXT está preestablecido tal vez fuera más sencillo generarlo desde el propio bat incluyendo la IP del equipo en las zonas adecuadas, en lugar de partir de un TXT ya existente, localizar todas las IP que existan en él y sustituirlas por ésta. Pero creo que también esto se podría hacer. Una pregunta respecto al TXT, ¿puede tener líneas en blanco que haya que conservar? Es que si la respuesta es "no" la solución es algo más sencilla. ¿Me puedes escribir un ejemplo de todo o parte del TXT con IP's ficticias?
La IP que figura en el TXT, la que hay que cambiar por la de tu equipo, ¿es también variable? ¿Se podría pasar como parámetro al BAT? Como siempre cuanta menos variabilidad más sencillez. Pero con mayor o menor esfuerzo se puede conseguir.
La idea de crear el archivo cada vez es buena, no había caído en eso.
Así lo podría crear:
ECHO url server ip username password > C:\Temp\archivo.txt
ECHO url2 server2 ip username2 password2 >>C:\Temp\archivo.txt
ECHO url3 server3 ip username3 password3 >> C:\Temp\archivo.txt
La IP que figura es siempre la del equipo, pues sólo cambia cuando el ISP decide cambiarla.
Otra pregunta, ¿sería posible enviar este archivo por FTP a otro equipo de una red local como parte final del batch?
Prueba con algo así:
@echo off
for /f "tokens=1,2 delims=:" %%a in ('ipconfig ^| findstr "Dirección IP"') DO (set DirIP=%%b)
ECHO url server %DirIP% username password > C:\Temp\archivo.txt
ECHO url2 server2 %DirIP% username2 password2 >> C:\Temp\archivo.txt
ECHO url3 server3 %DirIP% username3 password3 >> C:\Temp\archivo.txt
ECHO usuarioftp > C:\Temp\ftp.txt
ECHO claveftp >> C:\Temp\ftp.txt
ECHO lcd c:\Temp >> C:\Temp\ftp.txt
ECHO cd c:\Temp >> C:\Temp\ftp.txt
ECHO put archivo.txt >> C:\Temp\ftp.txt
ECHO quit >> C:\Temp\ftp.txt
ftp -i -s:"C:\Temp\ftp.txt" IPFTP > C:\Temp\ftp.log
Naturalmente tendrás que ajustar a tu caso concreto las "pseudovariables" url, url2, url3, server, server2, etc. En cambio %DirIP% es la forma de que el BAT rellene el valor de la variable DirIP y por tanto debe dejarse así. Para el ftp el propio bat genera el archivo de comandos de ftp (ftp.txt) que luego se usa en el comando ftp. Por supuesto aquí también hay que poner los valores concretos de usuarioftp, claveftp, IPFTP,
Ya sabes, salva lo anterior "personalizado" en un archivo con extensión BAT y lo ejecutas.
Ya me dirá. De momento un saludo, GGG
Grandes avances, sin duda.
Me ayuda usted una barbaridad! :)
Ahora el archivo contiene lo siguiente:
url server direcci¢n IPv6 local. . . username password
url2 server2 direcci¢n IPv6 local. . . username2 password2
url3 server3 direcci¢n IPv6 local. . . username3 password3
No aparece la IP en sí.
Se debe a un error en ipconfig?
No, es un error mío. Configuré así el comando para que sirviera en Windows 8, 10 y en XP (y supongo que en win 7). Pero acabo de comprobar que aunque creía que lo había probado en win 8 el resultado no era correcto. Corrige el "findstr" para que solo sea "find" y si sigue dando resultados incorrectos vuelve a "IPv4" en el literal del find.
Perdón por el despiste. Ya me cuentas.
Me muestra la ip interna. Per es mi culpa, ya que me expresé mal.
Mi objetivo es introducir la IP pública. No sé si ipconfig puede hacerlo. He leído que existe un método usando la página web ifconfig.me/ip.
Estoy rizando el rizo, ¿verdad?
He estado mirando por ahí y algo prometedor sería lo que se muestra en https://www.youtube.com/watch?v=SJskhReMsGc
El problemas es que no consigo enviar "Intro" o retorno como clave de anonymous para la conexión con el servidor ftp.opera.com. Pero se me ha ocurrido que posiblemente el mismo destino ftp al que quieres enviar el archivo, que supongo que tendrá clave de usuario, podría servir.
Prueba a conectarte manualmente por ftp a ese servidor y después de teclear la clave y de que diga "Login successful." escribe "literal stat". Si responde como el ftp.opera.com la IP pública vendría a continuación de algo como "Connected to".
Olvídalo. Me parece que los espacios en la creación del texto del archivo de comandos de FTP me jugaron una mala pasada.
Prueba con esto:
@echo off
ECHO anonymous> C:\Temp\ftp.txt
ECHO. >> C:\Temp\ftp.txt
ECHO literal stat >> C:\Temp\ftp.txt
ECHO quit >> C:\Temp\ftp.txt
ftp -i -s:"C:\Temp\ftp.txt" ftp.opera.com>C:\Temp\Ippub.txt
for /f "tokens=1,2,3" %%a in ('type c:\Temp\Ippub.txt') DO (
if "%%a" == "Connected" set DirIp=%%c
)
ECHO url server %DirIP% username password > C:\Temp\archivo.txt
ECHO url2 server2 %DirIP% username2 password2 >> C:\Temp\archivo.txt
ECHO url3 server3 %DirIP% username3 password3 >> C:\Temp\archivo.txt
ECHO usuarioftp> C:\Temp\ftp.txt
ECHO claveftp>> C:\Temp\ftp.txt
ECHO lcd c:\Temp >> C:\Temp\ftp.txt
ECHO cd c:\Temp >> C:\Temp\ftp.txt
ECHO put archivo.txt >> C:\Temp\ftp.txt
ECHO quit >> C:\Temp\ftp.txt
ftp -i -s:"C:\Temp\ftp.txt" IPFTP > C:\Temp\ftp.log
Es importante que entre "anonymous" y el ">" no haya espacios.
Por supuesto tienes que "personalizar" las mismas partes del BAT.
Supongo que con esto avanzaremos un pasito más.
Perdón, he estado fuera esta semana. No consigo que me introduzca el archivo en el aparato remoto.
Debo cambiar el cd o lcd? Cual es el formato correcto?
La dirección interna es 192.168.1.2
El archivo debe ir en "root\etc\"
(192.168.1.2/etc/)
Algo estaré haciendo mal...
Ahora ya lo he conseguido!!!
La línea del cd queda así:
ECHO cd /etc >> C:\Temp\ftp.txt
Funciona de maravilla!
Qué cosa tan fantástica!!!
Gracias infinitas!!!!
Me alegro enormemente de que te haya funcionado.
El comando lcd es para el directorio local y el cd para el directorio remoto, como ya habrás averiguado a estas alturas.
Realmente con los bat se pueden resolver bastantes problemas, a veces con cierta complicación porque sus comandos no siempre son fáciles de entender. En las versiones actuales hay una herramienta similar pero muchísimo más potente una vez que se conoce. Me refiero al powershell, aunque no tengo demasiada experiencia con ella.
Pues eso, que me hace muy feliz saber que he podido ayudarte y que te has quedado satisfecho del resultado. Siempre que tengas alguna duda o necesites una ayuda puedes intentarlo conmigo (o con cualquiera de los muchos expertos de esta página, y de otras similares).
- Compartir respuesta