¿Cómo capturar y registrar mejor la salida scp?
Pregunta
Estoy tratando de capturar la salida de un script de instalación (que usa scp) y registrarlo. Sin embargo, no obtengo todo lo que scp está imprimiendo, a saber, la barra de progreso.
salida de pantalla:
Copiando / user2 / cdb / builds / tmp / uat / myfiles / * to servidor / usuarios / myfiles como cdb
contraseña del servidor cdb @: myfile 100% | ***************************** | 2503 00:00
salida de registro:
Copiando / user2 / cdb / builds / tmp / uat / myfiles / * to servidor / usuarios / myfiles como cdb
Realmente me gustaría saber que mi archivo llegó allí. Esto es lo que estoy tratando ahora en vano:
myscript.sh 2 > & amp; 1 | tee mylogfile.log
¿Alguien tiene una buena manera de capturar la salida scp y registrarla?
Gracias.
Solución
Parece que simplemente falta saber si el scp tuvo éxito o no del registro.
¿Supongo que la barra de desplazamiento no se imprime en stdout y usa ncurses o algún otro tipo de TUI?
Podrías mirar el valor de retorno de scp para ver si fue exitoso. Me gusta
scp myfile user@host.com:. && echo success!
man scp
dice
scp exits with 0 on success or >0 if an error occurred.
Otros consejos
scp imprime su barra de progreso en la terminal usando códigos de control. Detectará si redirige la salida y, por lo tanto, omite la barra de progreso.
Puede evitar eso engañando a scp para que piense que se ejecuta en una terminal usando el " script " comando que está instalado en la mayoría de las distribuciones por defecto:
script -q -c "scp server:/file /tmp/" > /tmp/test.txt
El contenido de test.txt será:
file 0% 0 0.0KB/s --:-- ETA
file 18% 11MB 11.2MB/s 00:04 ETA
file 36% 22MB 11.2MB/s 00:03 ETA
file 54% 34MB 11.2MB/s 00:02 ETA
file 73% 45MB 11.2MB/s 00:01 ETA
file 91% 56MB 11.2MB/s 00:00 ETA
file 100% 61MB 10.2MB/s 00:06
... que es probablemente lo que quieres.
Me topé con este problema al redirigir la salida de un script interactivo a un archivo de registro. No tener los resultados en el registro no fue un problema, ya que siempre puede evaluar los códigos de salida. Pero realmente quería que el usuario interactivo viera la barra de progreso. Esta respuesta resuelve ambos problemas.
scp myfile user@host.com:. && echo success!
es muy útil, pero para escribir el mensaje en un archivo de registro lo cambié así
scp myfile user@host.com:. && echo myfile successfully copied! >> logfile 2>&1
y esto escribirá "¡myfile se copió correctamente!" mensaje al archivo de registro.
Prueba:
scp server:/file /tmp/ > /dev/tty
No puedo comentar todavía :( así que agregaré una actualización aquí ...
@Martin tenía la mejor solución para mí, aunque si su comando scp está en la mitad de su secuencia de comandos, su salida puede aparecer después de los comandos que realmente se ejecutaron después.
Creo que eso se debe a que el script debe ejecutar el comando en una subshell, pero aún no lo he probado.
EDITAR: de hecho genera un shell, por lo que si necesita que las cosas se ejecuten (y de hecho fallen) de manera secuencial (como en un script de compilación), entonces tendría que agregar algo de lógica en torno al uso del comando de script.
es decir
script -q -c " su comando " & amp; & amp; dormir 1
o algo similar para que su caparazón principal espere a que termine el caparazón secundario antes de continuar.
sí, recientemente estaba tratando de obtener resultados dentro de un script php de proc_open () Perdí un momento tranquilo tratando de obtener salida :-) pero es un poco tarde aquí y luego leer esta publicación aquí me hizo darme cuenta de que realmente no necesito esta salida basura para mi script
solo el código de salida hará el trabajo :-)
$ exit_code = proc_close ($ proceso);
$ grep -r "Error" xyz.out > abc.txt
Aquí, en el comando anterior, estoy almacenando la salida en el archivo abc.txt.
Este comando grep
es para buscar texto que contenga Error en el archivo xyz.out y almacenar la salida en abc.txt sin mostrar en la consola.