log logging shell scp

logging - scp log



¿Cómo mejor capturar y registrar la salida de scp? (8)

Parece que solo faltaste si el scp fue exitoso o no desde el registro.

Supongo que la barra de desplazamiento no se imprime en stdout y usa ncurses o algún otro tipo de TUI.

Podrías simplemente mirar el valor de retorno de scp para ver si fue exitoso. Me gusta

scp myfile [email protected]:. && echo success!

man scp dice

scp exits with 0 on success or >0 if an error occurred.

Estoy tratando de capturar el resultado de un script de instalación (que usa scp) y registrarlo. Sin embargo, no estoy obteniendo todo lo que scp está imprimiendo, es decir, la barra de progreso.

salida de pantalla:

Copiar / user2 / cdb / builds / tmp / uat / myfiles / * a server / users / myfiles como cdb

Contraseña de cdb @ server: miarchivo 100% | ***************************** | 2503 00:00

salida de registro:

Copiar / user2 / cdb / builds / tmp / uat / myfiles / * a server / users / myfiles como cdb

Realmente me gustaría saber que mi archivo llegó allí. Esto es lo que estoy intentando ahora en vano:

myscript.sh 2> y 1 | tee mylogfile.log

¿Alguien tiene una buena manera de capturar la salida scp y registrarla?

Gracias.


Tal vez puedas usar '' script '' para iniciar sesión en la terminal.


sí, recientemente estaba tratando de obtener resultados dentro de un script php de proc_open () perdí un tiempo tranquilo tratando de obtener resultados :-) pero es un poco tarde aquí y luego de leer este post aquí me di cuenta de que realmente no necesito este resultado no deseado para mi script

solo el código de salida hará el trabajo :-)

$ exit_code = proc_close ($ process);


scp imprime su barra de progreso en el terminal usando códigos de control. Detectará si redirige la salida y omite así la barra de progreso.

Puede evitarlo engañando a scp haciéndole creer que se ejecuta en un terminal utilizando el comando "script" que está instalado en la mayoría de las distribuciones de manera predeterminada:

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 tropecé con este problema al redirigir el resultado de una secuencia de comandos interactiva en un archivo de registro. No tener los resultados en el registro no fue un problema ya que siempre se pueden 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 [email protected]:. && echo success!

es muy útil, pero para escribir el mensaje en un archivo de registro lo cambié de esta manera

scp myfile [email protected]:. && echo myfile successfully copied! >> logfile 2>&1

y esto escribirá "myfile exitosamente copiado" mensaje al archivo de registro.


Tratar:

scp server:/file /tmp/ > /dev/tty


No puedo comentar todavía :( así que añadiré una actualización aquí ...

@Martin tenía la mejor solución para mí, aunque si su comando scp está en la mitad del guión, su resultado 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 forma secuencial (como en un script de compilación), entonces debería agregar algo de lógica sobre el uso del comando de script.

es decir

script -q -c "su comando" && sleep 1

o algo similar para que el shell de su padre espere a que el caparazón hijo termine antes de continuar.


$ grep -r "Error" xyz.out > abc.txt

Aquí, en el comando anterior, estoy almacenando el resultado en el archivo abc.txt.

Este comando grep es para buscar texto que contiene Error en el archivo xyz.out y almacenar el resultado en abc.txt sin mostrar en la consola.