42766040 perl examples ssh

Upload: picsone

Post on 05-Jul-2015

419 views

Category:

Documents


3 download

TRANSCRIPT

Programacin Distribuida y Mejora del Rendimiento oCasiano R. Len o1

11 de octubre de 2008

1

DEIOC Universidad de La Laguna

Indice general1. Ejecucion de Programas 1.1. La funcin system . . . . . . . . . . . . . . . . . . . o 1.2. La funcin exec . . . . . . . . . . . . . . . . . . . . . o 1.3. Variables de entorno . . . . . . . . . . . . . . . . . . 1.4. Uso de comillas de ejecucin (Backticks) . . . . . . . o 1.5. Salvando Manejadores de Fichero . . . . . . . . . . . 1.6. Pipes . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.7. Entrada/Salida sin Buers . . . . . . . . . . . . . . . 1.8. Repaso . . . . . . . . . . . . . . . . . . . . . . . . . . 1.9. Prctica: Ejecucin Controlada de Un Programa . . a o 1.10. El Mdulo IPC::Run3 . . . . . . . . . . . . . . . . . o 1.11. Prctica: Uso de IPC::Run3 . . . . . . . . . . . . . . a 1.12. Pipes con nombre . . . . . . . . . . . . . . . . . . . . 1.12.1. Prctica: Calculo Usando Pipes con Nombre . a 12 12 13 15 16 17 19 24 25 27 34 35 35 36 39 39 39 39 40 41 41 42 42 43 44 46 46 48 49 50 51 52 53 54 57 57 58 60 63 64 65 66

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2. SSH: Secure Shell 2.1. Conexiones con ssh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 2.1.2. Conexin Segura a Una mquina por Primera Vez . . . . . . . . . . . . o a 2.1.3. Claves Pblica y Privada: Estableciendo Autenticacin No Interactiva u o 2.1.4. Ejecucin de un Comando v ssh . . . . . . . . . . . . . . . . . . . . . o a 2.1.5. Transferencia por sftp . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.6. Copia Segura de un Fichero . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.7. El chero authorized keys . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.8. Restriccin del Intrprete Perl . . . . . . . . . . . . . . . . . . . . . . . o e 2.1.9. Acceso Slo Via scp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 2.1.10. Deshabilitar la Asignacin de una TTY . . . . . . . . . . . . . . . . . . o 2.1.11. Agentes SSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.12. Depuracin/Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . o 2.1.13. Tunneling Directo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.14. Conexiones X y Tunneling . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.15. Copias de Seguridad con rsync . . . . . . . . . . . . . . . . . . . . . . . 2.1.16. Creacin de un Tunel Inverso . . . . . . . . . . . . . . . . . . . . . . . . o 2.1.17. Tunneling Directo con Redireccin a una Tercera Mquina . . . . . . . o a 2.1.18. Los Ficheros de Conguracin . . . . . . . . . . . . . . . . . . . . . . . . o 2.2. Conexin Automtica ssh con Net::SSH::Perl . . . . . . . . . . . . . . . . . . o a 2.2.1. Perl SSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.2. Cifrados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.3. Conmutando Entre Modo Batch e Interactivo . . . . . . . . . . . . . . . 2.3. El Mdulo Net::SSH::Expect . . . . . . . . . . . . . . . . . . . . . . . . . . . o 2.4. El Mdulo IPC::PerlSSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 2.5. Prctica: Producto de Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . a 2.6. Visualizacin de un Cluster con cssh . . . . . . . . . . . . . . . . . . . . . . . . o 1

2.7. Prctica: usando cssh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a 2.8. Virtual Network Computing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3. Fork y Se ales n 3.1. La Funcin fork . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 3.2. La Funcin wait . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 3.3. La Depuracin de Procesos . . . . . . . . . . . . . . . . . . . . . . . . o 3.4. Seales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . n 3.4.1. Lista de Seales . . . . . . . . . . . . . . . . . . . . . . . . . . n 3.4.2. Env de seales . . . . . . . . . . . . . . . . . . . . . . . . . . o n 3.4.3. Captura de seales . . . . . . . . . . . . . . . . . . . . . . . . . n 3.4.4. Seales a Grupos . . . . . . . . . . . . . . . . . . . . . . . . . . n 3.4.5. Controlando Errores en Tiempo de Ejecucin con eval . . . . o 3.4.6. Controlando warnings en tiempo de ejecucin . . . . . . . . . . o 3.4.7. A Donde se Retorna Despus de la Ejecucin del Manejador de e o 3.4.8. Cronometrando el Tiempo de Entrada con alarm . . . . . . . . 3.4.9. Limitando el Tiempo de Lectura . . . . . . . . . . . . . . . . . 3.4.10. Limitando el Tiempo de un Proceso . . . . . . . . . . . . . . . 3.4.11. El Manejo de Excepciones PIPE . . . . . . . . . . . . . . . . . . 3.4.12. El Manejador IGNORE . . . . . . . . . . . . . . . . . . . . . . 3.4.13. Consideraciones sobre el uso de las Seales . . . . . . . . . . . n 3.4.14. Cosechado con un Manejador para CHLD . . . . . . . . . . . . . 3.4.15. Ejercicio: Barreras . . . . . . . . . . . . . . . . . . . . . . . . . 3.5. Cerrojos sobre Ficheros . . . . . . . . . . . . . . . . . . . . . . . . . . 3.6. Prctica: Clculo Multiproceso usando cerrojos . . . . . . . . . . . . . a a 3.7. Prctica: El PID de un Subproceso . . . . . . . . . . . . . . . . . . . . a 3.8. El Mdulo Parallel::Simple . . . . . . . . . . . . . . . . . . . . . . o 3.9. El Mdulo Parallel::ForkManager . . . . . . . . . . . . . . . . . . . o 3.10. Prctica: Callbacks en ForkManager . . . . . . . . . . . . . . . . . . . a 3.11. El Anlisis de URLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . a 3.12. Prctica: Analisis de URLs en el Programa de Descarga . . . . . . . . a 3.13. Granjas Simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.13.1. Granja usando pipes y wait . . . . . . . . . . . . . . . . . . . 3.13.2. Ejercicio: Uso de waitpid . . . . . . . . . . . . . . . . . . . . . 3.13.3. Ejercicio: Hashes de Manejadores . . . . . . . . . . . . . . . . . 3.13.4. Granja con Extensiones . . . . . . . . . . . . . . . . . . . . . . 3.13.5. Prctica: Granja con Pipes . . . . . . . . . . . . . . . . . . . . a 3.13.6. Prctica: Extendiendo los Objetos Farm::Machine . . . . . . . a 4. Pipes 4.1. La Funcin pipe . . . . . . . . . . . . . . . . . . . . . . . o 4.1.1. Mltiples escritores . . . . . . . . . . . . . . . . . . u 4.1.2. Mltiples Lectores . . . . . . . . . . . . . . . . . . u 4.1.3. Comunicacin Bidireccional con Pipe . . . . . . . . o 4.1.4. Atascos . . . . . . . . . . . . . . . . . . . . . . . . 4.1.5. El Mdulo IO::Pipe . . . . . . . . . . . . . . . . . o 4.1.6. Comunicacin de Estructuras de Datos Complejas o 4.1.7. Prctica: Marshalling . . . . . . . . . . . . . . . . a 4.1.8. Comunicaciones Entre Todos los Procesos . . . . . 4.1.9. Prctica: Clculo usando la funcin pipe . . . . . a a o 4.1.10. Prctica: Suma de Prejos . . . . . . . . . . . . . . a 4.1.11. Prctica: Prejos de Productos de Matrices . . . . a 4.1.12. Prctica: Extensin de Parallel::Simple con Pipes . a o 4.2. Open con -| y |- . . . . . . . . . . . . . . . . . . . . . . . 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . una Seal n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

66 67 69 69 70 71 72 72 73 74 75 77 79 79 81 81 82 84 84 85 86 86 87 89 89 90 93 95 96 100 101 101 105 105 106 116 116 119 119 119 121 122 123 124 126 128 129 131 131 131 133 135

4.2.1. Filtrar la Propia Salida con -| y |- . . . . 4.2.2. Un pipe con N etapas . . . . . . . . . . . . 4.3. Prctica: Clculo usando canales . . . . . . . . . . a a 4.4. Prctica: Ejecucin de una Aplicacin en Mltiples a o o u

. . . . . . . . . . . . . . . . . . Mquinas a

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

136 136 137 138 139 139 139 142 142 146 146 147 150 151 153 156 156 159 160 162 164 165 166 169 169 169 170 172 174 174 182 183 184 186 188 190 192 192 193 199 202 203 204 205 205 209 209 210 211 213 215

5. Eventos 5.1. Select . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.1. Ejemplo de Uso: Clculo de . . . . . . . . . . . . . . a 5.1.2. Prctica: Clculo de un Area Usando GRID::Machine a a 5.1.3. Un Ejemplo: Una Aplicacin Tipo talk . . . . . . . . o 5.1.4. Prctica: Generalizaciones del Talk . . . . . . . . . . . a 5.2. El Mdulo Event . . . . . . . . . . . . . . . . . . . . . . . . . o 5.2.1. La Vida de un Vigilante . . . . . . . . . . . . . . . . . 5.2.2. Prioridades . . . . . . . . . . . . . . . . . . . . . . . . 5.2.3. Gestin de los Objetos Watchers . . . . . . . . . . . . o 5.2.4. Los Objetos Event::Event . . . . . . . . . . . . . . . 5.2.5. Vigilando Relojes y la Entrada . . . . . . . . . . . . . 5.2.6. Vigilando Sockets: Un Servidor Simple . . . . . . . . . 5.2.7. Vigilando Ficheros . . . . . . . . . . . . . . . . . . . . 5.2.8. Vigilando Manejadores de Fichero: Linux::Inotify2 . . 5.2.9. Vigilando Los Tiempos Ociosos . . . . . . . . . . . . . 5.2.10. Vigilando Variables . . . . . . . . . . . . . . . . . . . . 5.2.11. Vigilantes de Grupo . . . . . . . . . . . . . . . . . . . 5.2.12. Vigilando a los Vigilantes . . . . . . . . . . . . . . . . 5.2.13. Prctica: Clculo Paralelo con Event . . . . . . . . . . a a 5.2.14. Prctica: Talk con Event . . . . . . . . . . . . . . . . a 5.3. El Mdulo AnyEvent . . . . . . . . . . . . . . . . . . . . . . . o 5.4. El Mdulo IO::Event . . . . . . . . . . . . . . . . . . . . . . o 5.5. El Mdulo IO::Multiplex . . . . . . . . . . . . . . . . . . . o 5.6. Corutinas: El Mdulo Coro . . . . . . . . . . . . . . . . . . . o 5.6.1. Introduccin a Coro . . . . . . . . . . . . . . . . . . . o 5.6.2. El Mdulo Coro::State . . . . . . . . . . . . . . . . . o 5.6.3. Seales: Productor Consumidor . . . . . . . . . . . . . n 5.6.4. Semforos . . . . . . . . . . . . . . . . . . . . . . . . . a 5.6.5. Generadores . . . . . . . . . . . . . . . . . . . . . . . . 5.6.6. Un Ejemplo con Coro::Event y Coro::Util . . . . . 5.6.7. Usando Corutinas con LWP . . . . . . . . . . . . . . . 6. Open2 6.1. Comunicacin Bidireccional con Open2 . . . . . . . . o 6.1.1. Ejemplo: El Mdulo IPC::PerlSSH . . . . . . o 6.1.2. Prctica: Modicaciones a PerlSSH . . . . . . a 6.1.3. Ejemplo: Comunicacin Bidireccional con bc o 6.1.4. Un Ejemplo con Lecturas sin Bloqueo . . . . 6.1.5. Prctica: Calculo con Open2 . . . . . . . . . a 6.1.6. Prctica: Paralelismo de Granja . . . . . . . . a 6.2. Comunicacin Bidireccional con el Mdulo IPC::Run o o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7. Pseudoterminales 7.1. Pseudoterminales . . . . . . . . . . . . . . . . . . . . . . . . 7.1.1. Introduccin a la Programacin de Terminales . . . o o 7.1.2. Lectura de un Carcter sin Esperas Mediante POSIX a 7.1.3. La funcin ioctl . . . . . . . . . . . . . . . . . . . . o 7.1.4. El Mdulo IO::Pty . . . . . . . . . . . . . . . . . . o 3

7.1.5. 7.1.6. 7.1.7. 7.1.8. 7.1.9. 7.1.10.

Control de un Programa Externo con IO::Pty . . . . . Uso Avanzado de Seudoterminales . . . . . . . . . . . Automatizacin de Guiones Pty . . . . . . . . . . . . o Prctica: Calculo usando Seudoterminales . . . . . . . a Prctica: Granja con Seudoterminales . . . . . . . . . a Prctica: Instalacin de Pares Clave Pblica y Privada a o u

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . con Seudoterminales

. . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

217 222 225 235 235 236 237 237 237 240 241 241 242 242 242 242 243 247 247 247 247 250 250 251 252 254 255

8. Expect 8.1. Comunicacin Interactiva con Expect . . . . . . . . . . . . . . . . . . . . o 8.2. Una Introduccin a Expect . . . . . . . . . . . . . . . . . . . . . . . . . o 8.3. q-agent: Seguridad y Ficheros de Conguracin . . . . . . . . . . . . . o 8.4. Prctica: Conexin ssh . . . . . . . . . . . . . . . . . . . . . . . . . . . a o 8.5. Prctica: Conexin sftp . . . . . . . . . . . . . . . . . . . . . . . . . . . a o 8.6. Prctica: Preamble y Postamble . . . . . . . . . . . . . . . . . . . . . . . a 8.7. Prctica: Preamble y Postamble con Autenticacin Automtica . . . . a o a 8.8. Prctica: Pipes con Mquinas Remotas . . . . . . . . . . . . . . . . . . . a a 8.9. Prctica: Tneles Inversos . . . . . . . . . . . . . . . . . . . . . . . . . . a u 8.9.1. Automatizacin de una Conexin sftp . . . . . . . . . . . . . . . o o 8.9.2. Depuracin en Expect . . . . . . . . . . . . . . . . . . . . . . . . o 8.9.3. Prctica: Conexin sftp . . . . . . . . . . . . . . . . . . . . . . . a o 8.9.4. Prctica: Clave Pblica y Privada . . . . . . . . . . . . . . . . . a u 8.9.5. Usando Callbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.9.6. Prctica: Construyendo una Aplicacin en Mltiples Plataformas a o u 8.9.7. Cambiando de Automtico a Interactivo . . . . . . . . . . . . . . a 8.9.8. Controlando los Ecos . . . . . . . . . . . . . . . . . . . . . . . . . 8.9.9. Control de la Terminal Local . . . . . . . . . . . . . . . . . . . . 8.10. Prctica: Gestor de Colas . . . . . . . . . . . . . . . . . . . . . . . . . . a 8.10.1. Sugerencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . con Expect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

9. Servicios de Correos 257 9.1. El Mdulo WWW::GMail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 o 9.2. Uso de MailTools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 9.3. MIME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 10.LWP 10.1. Descargando Pginas . . . . . . . . . . . . . . . . . . a 10.2. Cargando un Mdulo Remoto . . . . . . . . . . . . . o 10.3. Bsqueda en formularios con get . . . . . . . . . . . u 10.4. Bsqueda en formularios con post y autenticacin . u o 10.5. WWW::Mechanize . . . . . . . . . . . . . . . . . . . . 10.6. WWW::Dictionary . . . . . . . . . . . . . . . . . . . 10.7. Buscando en Amazon . . . . . . . . . . . . . . . . . 11.CGI 11.1. Introduccin a CGI (Common Gateway Inteface) . o 11.2. Permisos y Conguracin del Servidor Apache . . . o 11.2.1. .htaccess . . . . . . . . . . . . . . . . . . . . 11.3. Hola Mundo . . . . . . . . . . . . . . . . . . . . . . 11.4. Depuracin . . . . . . . . . . . . . . . . . . . . . . o 11.5. Depuracin con netcat . . . . . . . . . . . . . . . o 11.6. Depuracin con ptkdb y nx . . . . . . . . . . . . . o 11.7. Procesos de Larga Duracin desde un CGI . . . . . o 11.7.1. Prctica: Control de Procesos desde un CGI a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 262 263 266 270 271 272 273 276 276 276 277 277 277 279 284 285 293

4

12.Hilos 12.1. Un Ejemplo con Threads . . . . . . . . . . . . . . . . 12.2. Seales y Esperas Condicionales . . . . . . . . . . . n 12.3. Colas de Estructuras Anidadas . . . . . . . . . . . . 12.4. Un Ejemplo Sencillo: Clculo de los Primos . . . . . a 12.5. Un Pipeline para Resolver el Problema de la Mochila 12.6. Mapping de un Pipeline Sobre un Anillo . . . . . . . 12.7. Prctica: Pipe con Threads . . . . . . . . . . . . . . a 13.Sockets y Servidores 13.1. Direcciones IP, Nmeros de Puertos y Sockets . u 13.2. Muestreo de Mquinas con nmap . . . . . . . . a 13.3. Traduccion entre Direcciones IP y Nombres . . 13.4. El Mdulo Net::DNS . . . . . . . . . . . . . . . o 13.5. El Mdulo IO::Socket . . . . . . . . . . . . . . o 13.6. Un Cliente HTTP . . . . . . . . . . . . . . . . 13.7. Multiplexado Usando Procesos . . . . . . . . . 13.8. Prctica: Escritura de un Servidor y un Cliente a 13.9. Convirtiendo un Programa en un Servicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . 0-1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

295 295 300 301 303 304 308 310 311 311 314 318 322 323 324 326 330 330 333 333 333 335 336 339 343 349 349 354 355 358 364 365 369 372 377 378 380 381 383 386 389 390 391 392 393 393 394 394

14.Demonios y Daemons 14.1. Como Convertirse en un Demonio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.1.1. Poniendo El Proceso en Background . . . . . . . . . . . . . . . . . . . . . . . . 14.1.2. Salvando el Identicador de Proceso . . . . . . . . . . . . . . . . . . . . . . . . 14.1.3. El Programa Completo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.1.4. Servicios de Log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.1.5. El Programa Servidor con Logs . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.1.6. Logs con warn y die . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.1.7. Cambiando el ID del Usuario y del Grupo . . . . . . . . . . . . . . . . . . . . . 14.1.8. Datos Manchados (Tainted data) . . . . . . . . . . . . . . . . . . . . . . . . . . 14.1.9. Manejo de Seales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . n 14.1.10.El Mdulo de Soporte: Versin con Log, Privilegios, chroot, Taint y Rearranque o o 14.2. Preforking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.2.1. Rutinas de Soporte para un Servidor HTTP Simple . . . . . . . . . . . . . . . 14.2.2. Un Servidor HTTP Simple:Cdigos . . . . . . . . . . . . . . . . . . . . . . . . . o 14.2.3. Servidor con Preforking Adaptativo: Programa Principal . . . . . . . . . . . . . 14.3. El Mdulo Net::Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 14.3.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 14.3.2. Un Servidor HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.3.3. Parametrizacin del Servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 14.3.4. Cdigo Completo del Servidor HTTP . . . . . . . . . . . . . . . . . . . . . . . o 14.3.5. Varios Protocolos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.4. Como Escribir un Servidor HTTP en Perl con HTTP::Deamon . . . . . . . . . . . . . . 14.5. Como Escribir un Servidor HTTP en Perl con HTTP::Server::Simple . . . . . . . . . 14.6. Como Escribir un Servidor HTTP en Perl con HTTP::Server::Brick . . . . . . . . . 14.7. El Mdulo HTTP::Server::Simple::Dispatched . . . . . . . . . . . . . . . . . . . . . o 14.8. Construccin de un Proxy con HTTP::Proxy . . . . . . . . . . . . . . . . . . . . . . . . o 14.9. El Mdulo Continuity: CGIs con Estado . . . . . . . . . . . . . . . . . . . . . . . . . o 14.10. lientes con IO::Socket::SSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C 14.11. l Mdulo Event::RPC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E o

5

15.Las Interioridades de Perl 15.1. Los Paquetes O y B . . . . . . . . . . . . . . . 15.2. El Mdulo O . . . . . . . . . . . . . . . . . . . o 15.3. Como Escribir un Mdulo B:: . . . . . . . . . o 15.4. El Mdulo B::Concise . . . . . . . . . . . . . o 15.5. Un Ejemplo: B::LintSubs . . . . . . . . . . . 15.6. El Mdulo P5NCI . . . . . . . . . . . . . . . . o 15.7. Introduccin a XS . . . . . . . . . . . . . . . o 15.8. Breve Introduccin a Inline . . . . . . . . . o 15.9. Argumentos de Salida en XS . . . . . . . . . 15.10. epresentaciones C de los Tipos de Perl . . . R 15.11. l Sistema de FLAGS de Perl . . . . . . . . . E 15.12. ipos de Escalares Perl . . . . . . . . . . . . T 15.13. so de la Pila de Argumentos . . . . . . . . . U 15.14. anejando Array Values . . . . . . . . . . . . M 15.15. epresentacin Interna de un AV . . . . . . . R o 15.16. rctica: Clculo de la Mediana . . . . . . . . Pa a 15.17. rctica: Reescribir Math::Factor . . . . . . Pa 15.18. a Directiva ALIAS: . . . . . . . . . . . . . . L 15.19. ypemaps . . . . . . . . . . . . . . . . . . . . T 15.20. as directivas INPUT:, PREINIT: y CLEANUP: L 15.21. l typemap T ARRAY . . . . . . . . . . . . . . E 15.22. eneracin de XS con h2xs . . . . . . . . . . G o 15.22.1.La Librer coord . . . . . . . . . . . a 15.22.2.Usando h2xs . . . . . . . . . . . . . . 15.22.3.El Cdigo Generado por h2xs . . . . . o

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

395 395 399 400 402 403 406 408 415 416 418 420 421 422 425 430 433 434 435 437 443 446 450 451 456 461

6

Indice de cuadros3.1. Tabla de Seales POSIX.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . n 73

5.1. Ejecucin coordinada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 o 7.1. Grabacin de una sesin con script . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 o o 7.2. Tabla de Modos Locales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213

7

A Juana

For it is in teaching that we learn And it is in understanding that we are understood

8

Agradecimientos/AcknowledgmentsId like to thank Damian Conway, Tom Christiansen, Simon Cozens, Francois Desarmenien, Richard Foley, Jerey E.F. Friedl, Joseph N. Hall, Tim Jennes, Andy Lester, Randal L. Schwartz, Michael Schwern, Peter Scott, Sriram Srinivasan, Linconl Stein, Nathan Torkington and Larry Wall for their books and/or their modules. Special thanks to Larry Wall for giving us Perl.

9

ErratasPor favor, ayudanos a mejorar. Haznos saber cualquier errata que encuentres relativa a los documentos que componen este material didctico ([email protected]). a

10

Como Obtener Estos ApuntesEste no es un curso completo de Perl (Probablemente es imposible escribir un curso completo de Perl). La versin PDF de este documento puede encontrarse en o http://nereida.deioc.ull.es/~pp2/perlexamples/perlexamples.pdf La correspondiente versin HTML en la web se encuentra en: o http://nereida.deioc.ull.es/~pp2/perlexamples/

11

Cap tulo 1

Ejecucion de Programas1.1. La funcin system o

La forma habitual de lanzar un proceso en Perl es a travs el comando system: e system echo $PATH En el ejemplo hemos usado comillas simples para impedir que Perl interpole la variable $PATH. Quien debe interpolarla es la shell que ejecutar el comando. Tambin es posible escribir: a e system "echo \$PATH" Redireccin y system o Cuando el comando usado como argumento no implica redireccin, canales (pipes), etc. el comando o es ejecutado por Perl. Perl crea un proceso hijo el cual ejecuta el comando. En caso contrario Perl llama a la shell para que ejecute el comando. En este segundo caso el comando se convierte en un proceso nieto del programa Perl. lhp@nereida:~/Lperl/src/perl_networking/ch2$ cat -n system.pl 1 system(ps -fu lhp); 2 system(echo -----------------); 3 system(ps -fu lhp | grep system); produce una salida como: lhp@nereida:~/Lperl/src/perl_networking/ch2$ perl system.pl UID PID PPID C STIME TTY TIME CMD ... .... .... . ..... ..... ........ ......... lhp 1556 1544 0 Mar01 pts/6 00:00:00 /bin/bash lhp 2932 15408 0 15:20 pts/10 00:00:00 perl system.pl lhp 2933 2932 0 15:20 pts/10 00:00:00 ps -fu lhp ----------------lhp 2854 5412 0 15:11 pts/4 00:00:00 /usr/bin/perl /usr/bin/perldoc -f system lhp 2932 15408 0 15:20 pts/10 00:00:00 perl system.pl !lhp 2935 2932 0 15:20 pts/10 00:00:00 sh -c ps -fu lhp | grep system lhp 2937 2935 0 15:20 pts/10 00:00:00 grep system Uso con mas de un Argumento Si se llama al comando system con mas de un argumento Perl no llamar a la shell, cualquiera que a sea la forma del comando. En ese caso, el primer argumento se interpreta como el nombre del comando y los siguientes como los argumentos para el mismo. Ningn metacarcter shell (redirecciones, pipes, u a etc.) ser interpretado. Por ejemplo: a

12

lhp@nereida:~/Lperl/src/perl_networking/ch2$ cat -n system2.pl 1 system(echo,hola,>,juan.txt); lhp@nereida:~/Lperl/src/perl_networking/ch2$ perl system2.pl hola > juan.txt El valor devuelto por system es el status del proceso hijo, tal y como lo devuelve la funcin wait (vea o la seccin 3.1). Para obtener el valor de retorno del programa hay que hacer un shift right 8 a ese o valor. lhp@nereida:~/Lperl/src/perl_networking/ch2$ cat -n status.pl 1 my $s = system(ls -l /chuchu); 2 print "$s\n"; lhp@nereida:~/Lperl/src/perl_networking/ch2$ perl status.pl ls: /chuchu: No existe el fichero o el directorio 256 La funcion system retorna -1 si el programa no se pudo arrancar. Seguridad y system Supongamos un guin cuya funcin es enviar un cierto chero $filename a una direccin de e-mail o o o $address que se lee desde un chero o un socket: chomp($address = ); system "/usr/sbin/sendmail $address < $filename"; Este guin tiene un hueco en su seguridad. Supongamos que un usuario malintencionado da como o entrada: [email protected] < /etc/passwd; cat > /dev/null esto resultar en la ejecucin de: a o system "/usr/sbin/sendmail [email protected] < /etc/passwd; cat > /dev/null < $file"; y el chero /etc/passwd ser enviado a [email protected]. a Obsrvese que esto no ocurre si el guin anterior se sustituye por: e o chomp($address = ); open STDIN, "< $filename"; system "/usr/sbin/sendmail", $address; dado que los s mbolos de redireccin pierden su valor como metas o mbolos. Ejercicio 1.1.1. Estudie e instale el mdulo Proc::Background. desde CPAN en su mquina. Explio a que su funcionamiento. Considera que el mdulo es able? Lea el chero Makefile.PL. Comntelo. o e Que hace la opcin PL_FILES? Explique el funcionamiento del ejecutable timed-process. Que hace o la opcin require_order de GetOpt::Long? o

1.2.

La funcin exec o

La funcin exec acta de manera anloga a system. La diferencia es que el proceso padre es o u a sustituido por el proceso a ejecutar y no se retorna al programa inicial: exec cat -n /etc/passwd; die "no se pudo ejecutar cat: $!"; El nuevo proceso tendr exactamente el mismo PID que el viejo. a 13

pp2@nereida:~/src/perl$ cat exec1.pl #!/usr/local/bin/perl -w use strict; print "$$\n"; exec /bin/echo $$ pp2@nereida:~/src/perl$ exec1.pl 8422 8422 Al igual que con system, si se usa la sintxis con lista de argumentos los metacaracteres shell no a son interpretados. $ cat exec.pl #!/usr/bin/perl -w exec /bin/echo, Los argumentos son: , @ARGV; Al ejecutar protegemos los argumentos con comillas simples de su interpretacin por la shell: o lhp@nereida:~/Lperl/src$ ./exec.pl uno | ls | who > quien Los argumentos son: uno | ls | who > quien Usando exec para Modicar el Entorno de Ejecucin de un Programa o Habitualmente usamos el comando de la shell source cuando queremos modicar las variables de entorno de la l nea de comandos desde un chero de comandos. La funcin exec puede servir para un propsito similar. o o Establecer el entorno de trabajo de un programa antes de su ejecucin: o pp2@nereida:~/alu/0506/alu8877$ cat ~/bin/alucd #!/usr/bin/perl -w use strict; my $alu = shift; my $lab = shift || ; chdir "$ENV{HOME}/alu/0506/$alu/$lab/"; exec("bash"); La nueva bash hereda las variables de entorno y comienza posicionada en el directorio que deseamos: pp2@nereida:/tmp/UnixProcess-Composition-Simple-0.01/script$ export TUTU=prueba pp2@nereida:/tmp/UnixProcess-Composition-Simple-0.01/script$ alucd alu8877 PreambleyPostamble pp2@nereida:~/alu/0506/alu8877/PreambleyPostamble$ env | grep -i tutu TUTU=prueba pp2@nereida:~/alu/0506/alu8877/PreambleyPostamble$ Ejercicio 1.2.1. En http://www.perlmonks.org/ apareci la siguiente pregunta (busque por el tpico o o calling Unix commands): Hi, Im trying write a script that will call a unix comand and either post the results or parse the results then post them. I thought perhaps I could accomplish this with exec or system. However, I havent been able to figure it out. Any insight would be much appreciated. Thanx Comente las respuestas. Estudie el mdulo Shell y discuta su implementacin. o o Explique la salida: pp2@nereida:~/Lbook$ perl -wde 0 main::(-e:1): 0 DB use Shell qw(echo cat ps cp) 14

DB s $foo = echo("howdy", "funny", "world") main::((eval 7)[/usr/share/perl/5.8/perl5db.pl:628]:3): 3: $foo = echo("howdy", "funny", "world"); DB s Shell::AUTOLOAD(/usr/share/perl/5.8/Shell.pm:132): 132: shift if ref $_[0] && $_[0]->isa( Shell ); DB n Shell::AUTOLOAD(/usr/share/perl/5.8/Shell.pm:133): 133: my $cmd = $AUTOLOAD; DB Shell::AUTOLOAD(/usr/share/perl/5.8/Shell.pm:134): 134: $cmd =~ s/^.*:://; DB p $cmd Shell::echo DB n Shell::AUTOLOAD(/usr/share/perl/5.8/Shell.pm:136): 136: *$AUTOLOAD = _make_cmd($cmd); DB n Shell::AUTOLOAD(/usr/share/perl/5.8/Shell.pm:137): 137: goto &$AUTOLOAD; DB x @_ 0 howdy 1 funny 2 world DB c DB p $foo howdy funny world

1.3.

Variables de entorno

El hash %ENV contiene las variables de entorno. Su modicacin implica la modicacin del entorno o o del programa. $ENV{PATH} = $ENV{PATH}:"/home/casiano/bin"; delete $ENV{DISPLAY}; system myls; En este ejemplo el program myls es ejecutado en un entorno en el cual el PATH incluye a /home/casiano/bin y la variable DISPLAY ha sido suprimida.

Ejercicio 1.3.1. En Perlmonks apareci la siguiente pregunta (puede encontrarla buscando en http://www.perlmon o por Environmental Settings. I require some assistance. I am writing a CGI script in Perl on Solaris that needs to run external commands using the system operator. These commands are part of a larger package that needs the system initialized (via a command) properly before execution, or else each individual command cannot interact with the other, like the following. 1: 2: 3: 4: system system system system "/PATH/initialize_system"; # init the environment "/PATH/skew.k ARG_FOR_FRAME_NUMBER"; # create image "/PATH/savegif.k FRAME_NUMBER"; # save image off "exit"; # exit the environment created with initialize_system

When running a command using system, the environment appears to only 15

lasts until the next line of Perl code, so line 2 cant talk to line 3 because the environment required for them to communicate isnt there which is initialized by line 1. The above code snippet would the way it is run from a command line. Any help would be appreciated. Thanks. Cul es su respuesta? a Ejercicio 1.3.2. Ejecute los comandos: $ set | grep "^[A-Z]" |wc $ perl -e print "$_ = $ENV{$_}\n" for sort keys %ENV; | wc A que se debe la diferencia?. Consulte el mdulo Env::Bash . Discuta su funcionalidad. o

1.4.

Uso de comillas de ejecucin (Backticks) o

Contexto Escalar Cuando se quiere capturar la salida de un programa utilizaremos las comillas hacia atrs (backa quotes o backticks): 1 #!/usr/local/bin/perl5.8.0 -w 2 3 my $who = shift; 4 my $options = shift; 5 my $users = who $options; 6 7 until ($users =~ m/$who/) 8 { $users = who $options; } 9 10 print $users; Como muestra el ejemplo, la cadena entre backquotes se interpola igual que una cadena de comillas dobles. Contexto de Lista Si se usan las backquotes en un contexto de lista se obtiene una lista cuyos elementos son las l neas de salida el programa. Veamos un ejemplo: #!/usr/bin/perl -w my @user = cat /etc/passwd; my (@name, @uid); my $x; for ($i=0; $i < @user; $i++) { ($name[$i], $x, $uid[$i]) = split :, $user[$i]; } @name = @name[ sort {$uid[$a] $uid[$b]} 0..$#name ]; print "@name\n"; Ejercicio 1.4.1. Que ocurre en un contexto de lista en una ejecucin con backticks si se ha redenido o $/? 16

Recolectando stderr Es posible recoger los contenidos de stderr: pp2@nereida:~/Lbook$ perl -wde 0 main::(-e:1): 0 DB $x = ls /tutu 2>&1 # stdout y stderr juntos DB p $x ls: /tutu: No existe el fichero o el directorio DB $y = (echo Tutu; ls /tutu) 2>&1 1>/dev/null # Eliminar stdout DB p $y ls: /tutu: No existe el fichero o el directorio qx y la Comilla Simple Ejercicio 1.4.2. Explique la siguiente salida: pp2@nereida:~/Lbook$ perl -wde 0 main::(-e:1): 0 DB @a = 1..5 DB p qx(echo @a) 1 2 3 4 5 DB p qxecho @a @a Que ocurre cuando el delimitador de qx es la comilla simple?. Consulte perldoc perlop.

1.5.

Salvando Manejadores de Fichero

Supongamos que queremos que la salida de una ejecucin mediante system vaya a un cierto chero. o Una solucin - independiente del sistema operativo - es re-abrir STDOUT a ese chero y volverlo a poner o a su antiguo valor despus de la ejecucin. Para ello debemos conservar el antiguo valor de STDOUT. e o Copia de Manejadores Se puede salvar un manejador de cheros sin mas que pasrselo como segundo argumento a open a prejado de una secuencia de la forma ">&" (escritura) o "&STDOUT"); 6 open (STDOUT,">test.txt") or die "Cant open test.txt: $!"; 7 print "STDOUT is redirected\n"; 8 system "date"; 9 open (STDOUT,">&SAVEOUT"); 10 print "STDOUT restored\n"; Vemos que en la salida estndar se produce la salida: a lhp@nereida:~/Lperl/src/perl_networking/ch1$ ./redirect.pl Redirecting STDOUT STDOUT restored 17

Y en el chero test.txt queda: lhp@nereida:~/Lperl/src/perl_networking/ch1$ cat test.txt STDOUT is redirected mar abr 18 13:16:45 WEST 2006 Atributos de la Copia La siguiente sesin de comandos con el depurador muestra que la copia mantiene los atributos del o original y no es afectado por los cambios a los que se someta al original: DB DB DB DB Hola DB Hola DB print() DB print() DB Hola open $f, ">&", STDOUT open STDOUT, "> /tmp/prueba.txt" print STDOUT "Hola\n" print $f "Hola\n" # # # # Salvamos STDOUT en $f Redirigimos STDOUT /tmp/prueba.txt contien "Hola\n" Salida a STDOUT

!! cat /tmp/prueba.txt

# !! Permite ejecutar un comando shell

close(STDOUT) on closed filehandle STDOUT at (eval 10) print "Hola" on closed filehandle STDOUT at (eval 11) print $f "Hola\n"

Obsrvese el formato de llamada a open en la l e nea 1 con tres argumentos. Duplicacin de Manejadores con IO::File o Una alternativa a este sistema la provee el mtodo fdopen en IO::Handle que permite reabrir un e chero existente, haciendo una copia en uno nuevo. Una llamada a este mtodo sigue el formato: e $io->fdopen ( $FD, $MODE ) La variable $FD debe ser un objeto IO::Handle o un chero normal o un descriptor numrico. El modo e $MODE debe casar con el original de $FD. En el siguiente ejemplo usamos el mtodo en conjuncin con new_from_fd (l e o nea 6) el cual crea un IO::Handle del mismo modo que lo hace new y luego llama a fdopen. lhp@nereida:~/Lperl/src/perl_networking/ch1$ cat -n redirectIO.pl 1 #!/usr/bin/perl 2 use strict; 3 use IO::File; 4 5 print "Redirecting STDOUT\n"; 6 my $SAVEOUT = IO::File->new_from_fd(\*STDOUT,">"); 7 open(STDOUT, ">test.txt") or die "Cant open test.txt: $!"; 8 print "STDOUT is redirected\n"; 9 system "date"; 10 STDOUT->fdopen($SAVEOUT, ">"); 11 print "STDOUT restored\n"; El efecto es el mismo: lhp@nereida:~/Lperl/src/perl_networking/ch1$ ./redirectIO.pl Redirecting STDOUT 18

STDOUT restored lhp@nereida:~/Lperl/src/perl_networking/ch1$ cat test.txt STDOUT is redirected mar abr 18 13:40:14 WEST 2006 lhp@nereida:~/Lperl/src/perl_networking/ch1$

1.6.

Pipes

Se puede utilizar open para lanzar un proceso en pipe con el programa actual: open $DATE, "date|" or die "Fall la creacin del pipe desde date: $!"; o o open $MAIL, "|mail [email protected]" or die "Fall el pipe hacia mail: $!"; o La barra al nal indica que la salida del proceso lanzado alimenta la entrada a nuestro programa a travs del manipulador. Del mismo modo, la barra al principio indica que la entrada del proceso e lanzado se alimenta de las salidas de nuestro programa hacia el correspondiente manipulador. Para leer desde el proceso ejecutando date basta usar el operador diamante sobre el manejador: my $now = ; y para escribir al proceso $MAIL hacemos: print $MAIL "Estimado alumno, ha obtenido usted un sobresaliente.\n"; Valor Retornado por open Cuando se abre un pipe, open devuelve el identicador del proceso del comando al otro lado del pipe. Este entero puede ser utilizado para monitorizar o enviar posteriormente seales al proceso. n Asegrese de comprobar los valores retornados por open y close cuando utilice un pipe. u Para entender la razn, piense que sucede cuando se arranca un pipe a un comando que no existe. o El xito del comando open reeja el hecho de que el fork pudo hacerse con xito. Pero en cuanto e e intentemos la escritura en el pipe se producir el error y se recibir una seal PIPE que deberemos a a n manejar. Si se trata de lectura Perl interpretar que se ha producido un nal de chero. a Ejercicio 1.6.1. Explique la diferencia de conducta entre estos dos ejemplos lhp@nereida:~/Lperl/src/perl_networking/ch2$ cat -n pipe2none 1 #!/usr/bin/perl -w 2 use strict; 3 4 open(FH, "|doesnotexist") or die "Cant open pipe: $!\n"; 5 print FH "Hi!\n" or die "Cant write to doesnotexist!: $!\n"; 6 close(FH) or die "Cant close doesnotexist!: $!\n. Status: $?"; Al ejecutar este programa tenemos la salida: lhp@nereida:~/Lperl/src/perl_networking/ch2$ perl -v This is perl, v5.8.7 built for i486-linux-gnu-thread-multi ... lhp@nereida:~/Lperl/src/perl_networking/ch2$ ./pipe2none Cant exec "doesnotexist": No existe el fichero o el directorio at ./pipe2none line 4. Cant open pipe: No existe el fichero o el directorio lhp@nereida:~/Lperl/src/perl_networking/ch2$ cat -n pipe2none2 1 #!/usr/bin/perl -w 2 use strict; 3 19

4 5 6 7

my $pid = open(FH, "| doesnotexist > tutu") or die "Cant open pipe: $!\n"; print "PID: $pid\n"; print FH "Hi!\n" or die "Cant write to doesnotexist!: $!\n"; close(FH) or die "Cant close doesnotexist!: $!\n. Status: $?";

Al ejecutar produce la salida: lhp@nereida:~/Lperl/src/perl_networking/ch2$ pipe2none2 PID: 18909 sh: doesnotexist: command not found Cant close doesnotexist!: . Status: 32512 at ./pipe2none2 line 7. Sincronizacin mediante close o Al cerrar un lehandle: close(MAIL); die "mail: salida errnea, $?" if $?; o nuestro proceso se sincroniza con el proceso lanzado, esperando a que este termine y obtener el cdigo o de salida, el cual queda almacenado en la variable $?. Esqueleto de un Pipe En general el esquema de uso para leer desde un programa en pipe es $pid = open($README, "program arguments | ") or die("Couldnt fork: $|\n"; while () { ... } close($README); # Check $? La variable $? La variable $? ($CHILD ERROR si se usa el mdulo English) contiene el estatus retornado por o el cierre de un pipe (close), la ejecucin de un comando bajo comillas, una llamada a wait o una o llamada a system. Un ejemplo de uso, comprobando el estatus es: if ($? == -1) { # $? es -1 si no se pudo ejecutar print "No se pudo ejecutar: $!\n"; } elsif ($? & 127) { printf "El proceso hijo a muerto con se~al %d, %s coredump\n", n ($? & 127), ($? & 128) ? con : sin; } else { # El valor de salida del proceso es $? >> 8 printf "Proceso hijo termina con estatus %d\n", $? >> 8; } Si quiere obtener mas informacin sobre $? lea perldoc perlvar. o Pipes con IO::File Una alternativa es usar objetos IO::File: pp2@nereida:~/LGRID_Machine/lib/GRID$ perl -wde 0 main::(-e:1): 0 DB use IO::File 20

DB $DATE = IO::File->new DB $DATE->open("date|") or die "Fall la creacin del pipe desde date: $!" o o DB p lun mar 3 12:17:57 WET 2008 Ejecucin de un Proceso Mediante Open con Pipe o Veamos un ejemplo: lhp@nereida:~/Lperl/src$ cat -n rwho.pl 1 #!/usr/bin/perl -w 2 use strict; 3 4 my $host = shift; 5 6 my $pid = open(my $WHOFH, "ssh $host who |") or die "No se pudo abrir who: $!"; 7 print "PID of pipe process: $pid\n"; 8 system(new(); 18 open $file, ">& STDOUT"; 19 tee(\*STDOUT, 1, @ARGV); 20 # Now any print goes to all the @files plus STDOUT 21 print "1) Hola Mundo\n"; 22 close(STDOUT); 23 24 25 open STDOUT,">&", $file; 26 # STDOUT only 27 print "2) Hola Mundo\n"; Sigue un ejemplo de ejecucin: o lhp@nereida:~/Lperl/src/perl_networking/ch2$ tee.pl one two three 1) Hola Mundo 2) Hola Mundo lhp@nereida:~/Lperl/src/perl_networking/ch2$ cat one two three 1) Hola Mundo 1) Hola Mundo 1) Hola Mundo 22

Transparencia en Open La sentencia open acta sobre procesos y cheros de manera trasparente. u Supongamos un programa que espera una secuencia de cheros en @ARGV como este: lhp@nereida:~/Lperl/src/perl_networking/ch2$ cat -n toupper 1 #!/usr/bin/perl -w 2 while () { 3 print "\U$_"; 4 } Este programa usa el operador diamante para leer los cheros pasados en @ARGV y pasar sus contenidos a maysculas. u Entonces podemos pasarle al programa en vez de una lista de cheros una lista en la que se mezclan pipes y cheros arbitrariamente: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 $ toupper toupper "sort toupper|" - "cat -n system.pl|" #!/USR/BIN/PERL -W WHILE () { PRINT "\U$_"; } } PRINT "\U$_"; #!/USR/BIN/PERL -W WHILE () { Esta linea la escrib interactivamente ESTA LINEA LA ESCRIB INTERACTIVAMENTE 1 SYSTEM(PS -FU LHP); 2 SYSTEM(ECHO -----------------); 3 SYSTEM(PS -FU LHP | GREP SYSTEM);

Las l neas 2-5 contienen el resultado de pasar el chero toupper a maysculas. Las l u neas 6-9 contienen el resultado de ordenar el chero alfabticamente y pasarlo a maysculas (sort toupper|"). e u Despus vienen una l e nea leida interactivamente, correspondiente al "-" en la l nea de argumentos y el resultado de ltrar el proceso "cat -n system.pl|". Pipes versus Backticks hacer con backticks: En muchos casos ocurre que lo que puedes hacer con un pipe lo puedes

pp2@nereida:~/LGRID_Machine/lib/GRID$ perl -wde 0 main::(-e:1): 0 DB print grep { /www/ } netstat -a 2>&1 tcp 0 0 *:www *:* LISTEN tcp 0 0 nereida:56001 mg-in-f83.google.co:www ESTABLISHED tcp 1 0 nereida:56003 mg-in-f83.google.co:www CLOSE_WAIT DB p $? 0 En general la versin pipe consume menos memoria, ya que se procesa una l o nea de cada vez y nos da la oportunidad, si conviene, de matar el proceso hijo antes de su terminacin. o Por otro lado, hay que reconocer la comodidad de usar backticks. Si adems se est cronometrando a a el programa lanzado, la versin pipe da lugar a sincronizaciones que pueden perturbar el proceso de o medicin de tiempos. o

23

Cierre Prematuro de un Pipe Si un proceso cierra un pipe de lectura antes de leer el EOF, el programa al otro lado recibir una seal PIPE en su siguiente intento de escribir en la salida estandard. a n En el siguiente ejemplo, tomado de [1] el siguiente proceso intenta escribir 10 l neas al proceso al otro lado del pipe: lhp@nereida:~/Lperl/src/perl_networking/ch2$ cat -n write_ten.pl 1 #!/usr/bin/perl -w 2 use strict; 3 use IO::Handle; 4 5 open (my $PIPE,"| read_three.pl") or die "Cant open pipe: $!"; 6 $PIPE->autoflush(1); 7 8 my $count = 0; 9 for (1..10) { 10 warn "Writing line $_\n"; 11 print $PIPE "This is line number $_\n" and $count++; 12 sleep 1; 13 } 14 close $PIPE or die "Cant close pipe: $!"; 15 16 print "Wrote $count lines of text\n" pero el proceso al otro lado slo lee las tres primeras: o lhp@nereida:~/Lperl/src/perl_networking/ch2$ cat -n read_three.pl 1 #!/usr/bin/perl -w 2 use strict; 3 4 my $line; 5 for (1..3) { 6 last unless defined($line = ); 7 warn "Read_three got: $line"; 8 } Al ejecutar write_ten.pl se produce la muerte prematura del proceso, el cual recibe un seal PIPE: n lhp@nereida:~/Lperl/src/perl_networking/ch2$ write_ten.pl Writing line 1 Read_three got: This is line number 1 Writing line 2 Read_three got: This is line number 2 Writing line 3 Read_three got: This is line number 3 Writing line 4 lhp@nereida:~/Lperl/src/perl_networking/ch2$ La solucin al problema est en instalar un manejador para la seal PIPE. Veremos como hacerlo en o a n la seccin 3.4.11. o

1.7.

Entrada/Salida sin Buers

Una fuente de problemas cuando se usan pipes entre procesos es el hecho de que la mayor parte de las funciones de entrada/salida usan buers intermedios. Para lograr que el mensaje llegue al proceso y no se estanque en buers intermedios es necesario activar el modo autoflush. 24

Mtodo Antiguo: La variable $| e El modo autoush es controlado mediante la variable $|. La variable slo afecta al chero de o salida estndar actualmente seleccionado. Por tanto, para poner un chero en modo autoflush se a hace primero un select, se pone la variable $| a 1 y se vuelve a hacer un select del chero anterior. La funcin select retorna el chero actualmente seleccionado. Por ejemplo, para poner en modo o autoflush el chero F hacemos: my $previousF = select(F); $| = 1; select($previousF); Que normalmente se resume en la siguiente frase hecha (idiom): select((select F, $| = 1)[0]); Mtodo Recomendado: El mdulo IO::Handle e o El mtodo autoflush de un objeto IO::Handle permite cambiar su estado de flush: e use IO::Handle; $F = new IO::Handle; $F->autoflush(1); Las Funciones sysread y syswrite Las funciones sysread y syswrite posibilitan la entrada/salida sin el uso de buers intermedios. Por ello su uso - cuando de procesos se trata - es mas conveniente que el de las correspondientes funciones de e/s con buers. El formato de sysread es: sysread FILEHANDLE,SCALAR,LENGTH,OFFSET sysread FILEHANDLE,SCALAR,LENGTH Se intenta una lectura del chero FILEHANDLE de LENGTH bytes para escribirlos en el buer SCALAR. No es buena idea mezclar la funcin con sus colegas con buer: print, write, seek, tell y eof. o Retorna el nmero de bytes que se pudieron leer. u El buer SCALAR crece o se contrae para contener exactamente hasta el ultimo byte le do. Si se especica, el OFFSET dice en que lugar de SCALAR se colocan los datos le dos. Para saber que hemos llegado al nal de la lectura compruebe que el nmero de bytes le u dos es cero. El formato de syswrite es: syswrite FILEHANDLE,SCALAR,LENGTH,OFFSET syswrite FILEHANDLE,SCALAR,LENGTH syswrite FILEHANDLE,SCALAR Intenta escribir LENGTH bytes de SCALAR en FILEHANDLE saltndose los buers de E/S. Si no se a especica LENGTH se escribe todo SCALAR.

1.8.

RepasoQue diferencia hay entre system echo $PATH y system "echo $PATH"

25

Que salida se obtiene al ejecutar: system(echo,hola,>,juan.txt); Que valor devuelve system? Que hace la asignacin *a = *b? o Que hace la asignacin *a = \$b? o Que hace la asignacin *a = \&Paquete::Con::Un::Largo::Nombre::resuelve? o Que hace la asignacin *a = \*STDOUT? o Cual es la salida en la siguiente sesin: o DB *a = \*STDOUT DB print a "hola" Explique que hace la llamada IO::File->new_from_fd(\*STDOUT,">");. Explique que hace la llamada STDOUT->fdopen($SAVEOUT, ">");. Consulte la documentacin de IO::Handle antes o de contestar. Que diferencias hay entre system y exec? Que contiene el hash %ENV? Que es un atado? En que consiste la ejecucin con backticks? o Que relacin hay entre interpolacin y backticks? o o Que ocurre si los backticks se ejecutan en un contexto de lista? Que hace el operador qx? Que hace el comando tee? Que error se produjo si $? == -1? Que error se produjo si $? & 127? Que contiene $? & 128? Que contiene la expresin $? >> 8? o Ejecute la siguiente sesin en el depurador. Explique la secuencia de eventos (el programa bc o implementa una calculadora): pp2@nereida:~/alu$ perl -wde 0 main::(-e:1): 0 DB $x = gcc noexiste.c gcc: noexiste.c: No existe el fichero o el directorio gcc: no hay ficheros de entrada DB x $? 0 256 DB printf "%b %x\n",$?,$? 100000000 100 DB x $? >> 8 0 1 DB q 26

Ejecute la siguiente sesin en el depurador. Explique la secuencia de eventos: o pp2@nereida:~/alu$ perl -wde 0 main::(-e:1): 0 DB open $F, "|bc" DB print $F "4*3\n" DB print $F "5*2\n" DB close($F) 12 10 DB Ejecute la siguiente sesin en el depurador. Explique la secuencia de eventos: o DB DB DB 12 DB 10 $F->autoflush(1) open $F, "|bc" print $F "4*3\n" print $F "5*2\n"

Abra un pipe con bc y alimente la calucladora usando syswrite. Que diferencias observa?

1.9.

Prctica: Ejecucin Controlada de Un Programa a o

Objetivos Se tiene una aplicacin app que se ejecuta de la forma: o app inputfile Produciendo sus resultados sin intervencin adicional por parte del usuario. Escriba un programa Perl o que ejecute app sobre un conjunto de cheros de entrada sobre los que se desea ejecutar la aplicacin. o El Fichero de Conguracin o El programa Perl deber tener un chero de conguracin en el que se especica como obtener la a o aplicacin, como obtener los cheros de entrada, etc. Lo mas cmodo posiblemente sea hacer que el o o chero de conguracin est escrito en lenguaje Perl. o e pp2@nereida:/tmp/p1_batch/Batch-Simple/script$ cat batch.conf $get_executable = \&get_executable; $get_input_files = \&Batch::Simple::get_input_through_glob; @params_for_input = qw(\/etc\/*.conf); sub get_executable { return "\/bin\/ls -l"; } Se le el chero de conguracin y se evala. Sigue un ejemplo: e o u if (-r $config_file) { # First read config file local $/ = undef; open CONFIG, "< $config_file"; my $config = ; eval $config; die "Errors in config file\n" if ($@); 27

} else { die help("Error: $config_file not found!\n"); } Controle las posibles situaciones de error de ejecucin de app mediante la variable $?. o Haga que la salida de la aplicacin se bifurque a chero y a STDOUT. o Leyendo las Opciones desde la L nea de Comandos Use los mdulos Getopt::Long y Pod::Usage. Probablemente tambin le sea util File::Basename o e para analizar los nombres de chero. Sigue un ejemplo de uso de Getopt::Long y Pod::Usage: pp2@nereida:/tmp/p1_batch/Batch-Simple/script$ cat batch #!/usr/bin/perl -w -I../lib use Carp; use Getopt::Long; use Pod::Usage; use Batch::Simple; my $config_file = batch.conf; GetOptions( config=s => \$config_file, output=s => \$output_file, verbose! => \$verbose, version => \&version, usage => \&usage, help => \&man, ) or croak usage(); &load_config($config_file); &exe_batch($output_file, $verbose); sub version { print "Batch::Simple version $Batch::Simple::VERSION\n"; exit; }

sub usage { print 2 28

); } Ahora podemos ejecutar el guin de mltiples formas: o u pp2@nereida:/tmp/p1_batch/Batch-Simple/script$ batch -v Option v is ambiguous (verbose, version) Supply the name of a configuration file Usage is: batch -c configfile [-o outputfile] [-verbose|-noverbose] pp2@nereida:/tmp/p1_batch/Batch-Simple/script$ batch -vers Batch::Simple version 0.01-7-mar-2007 pp2@nereida:/tmp/p1_batch/Batch-Simple/script$ batch -h

BATCH(1)

User Contributed Perl Documentation

BATCH(1)

NAME batch - Perl script that executes programs in background using Batch::Simple module SEE ALSO Batch::Simple etc., etc. La Documentacin o Para repasar como escribir la documentacin en formato pod consulte la seccin de los apuntes de LHP. o o __END__ =head1 NAME batch - Perl script that executes programs in background using Batch::Simple module =head1 SEE ALSO Batch::Simple =head1 SYNOPSIS .....

=head1 AUTHOR My name, [email protected] =head1 COPYRIGHT AND LICENSE Copyright (C) 2007 by My name

29

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.7 or, at your option, any later version of Perl 5 you may have available. =cut Creacin de la Jerarqu de Directorios o a Cree la estructura de directorios usando h2xs: pp2@nereida:~/src$ h2xs -X -A -n Batch::Simple Defaulting to backwards compatibility with perl 5.8.8 If you intend this module to be compatible with earlier perl versions, please specify a minimum perl version with the -b option. Writing Writing Writing Writing Writing Writing Batch-Simple/lib/Batch/Simple.pm Batch-Simple/Makefile.PL Batch-Simple/README Batch-Simple/t/Batch-Simple.t Batch-Simple/Changes Batch-Simple/MANIFEST

Aada un directorio para el ejecutable e incluya su presencia dndolo de alta en el chero Batch-Simple/MANIFEST n a y en la entrada EXE_FILES en la llamada a WriteMakefile en el chero Batch-Simple/Makefile.PL: pp2@nereida:~/src/Batch-Simple$ cat -n MANIFEST 1 Changes 2 Makefile.PL 3 MANIFEST 4 README 5 script/batch.pl 6 t/Batch-Simple.t 7 lib/Batch/Simple.pm pp2@nereida:~/src/Batch-Simple$ cat -n Makefile.PL 1 use ExtUtils::MakeMaker; 2 WriteMakefile( 3 NAME => Batch::Simple, 4 VERSION_FROM => lib/Batch/Simple.pm, # finds $VERSION 5 PREREQ_PM => {}, # e.g., Module::Name => 1.1 6 EXE_FILES => [ qw{script/batch.pl} ], 7 ); Hay varias formas de garantizar que durante el periodo de desarrollo de una librer los ejecutables a encuentran la librer Uno es aadir use blib en el ejecutable: a. n pp2@nereida:~/src/Batch-Simple/script$ cat -n batch.pl 1 #!/usr/local/bin/perl -w 2 use strict; 3 use Carp; 4 use Getopt::Long; 5 use Pod::Usage; 6 use blib; 7 use Batch::Simple; . ....................

30

el mdulo blib busca por un directorio de tipo blib hasta 5 niveles por encima del actual. Observa o que eso signica que trabajas con la copia en blib y no el original en lib. Por tanto debers hacer a make para asegurarte la actualizacin de la copia. Otra forma de garantizar que la librer se encuentra o a es incluirla en la variable PERL5LIB. Aplicacin para Las Pruebas o Puedes usar como ejemplo de aplicacin el tar.gz que implementa un producto de matrices en C o en la pgina asociada con estos apuntes (chero matrix.tar.gz) a Use Subversion: Creacin de un Repositorio o Parece que en banot esta instalado subversion. Para crear un repositorio emita el comando svnadmin create:

-bash-3.1$ uname -a Linux banot.etsii.ull.es 2.6.24.2 #3 SMP Fri Feb 15 10:39:28 WET 2008 i686 i686 i386 GNU/Linux -bash-3.1$ svnadmin create /home/loginname/repository/ -bash-3.1$ ls -l repository/ total 28 drwxr-xr-x 2 loginname apache 4096 feb 28 11:58 conf drwxr-xr-x 2 loginname apache 4096 feb 28 11:58 dav drwxr-sr-x 5 loginname apache 4096 feb 28 12:09 db -r--r--r-- 1 loginname apache 2 feb 28 11:58 format drwxr-xr-x 2 loginname apache 4096 feb 28 11:58 hooks drwxr-xr-x 2 loginname apache 4096 feb 28 11:58 locks -rw-r--r-- 1 loginname apache 229 feb 28 11:58 README.txt Una alternativa a considerar es ubicar el repositorio en un dispositivo de almacenamiento portable (pendriver) A adiendo Proyectos n Ahora esta en condiciones de aadir proyectos al repositorio creado usando svn import: n [loginname@tonga]~/src/perl/> uname -a Linux tonga 2.6.24.2 #1 SMP Thu Feb 14 15:37:31 WET 2008 i686 i686 i386 GNU/Linux [loginname@tonga]~/src/perl/> pwd /home/loginname/src/perl [loginname@tonga]~/src/perl/> ls -ld /home/loginname/src/perl/Grammar-0.02 drwxr-xr-x 5 loginname Profesor 4096 feb 28 2008 /home/loginname/src/perl/Grammar-0.02 [loginname@tonga]~/src/perl/> svn import -m Grammar Extended Module \ Grammar-0.02/ \ svn+ssh://banot/home/loginname/repository/Grammar A~adiendo n Grammar-0.02/t A~adiendo n Grammar-0.02/t/Grammar.t A~adiendo n Grammar-0.02/lib A~adiendo n Grammar-0.02/lib/Grammar.pm A~adiendo n Grammar-0.02/MANIFEST A~adiendo n Grammar-0.02/META.yml A~adiendo n Grammar-0.02/Makefile.PL A~adiendo n Grammar-0.02/scripts A~adiendo n Grammar-0.02/scripts/grammar.pl A~adiendo n Grammar-0.02/scripts/Precedencia.yp A~adiendo n Grammar-0.02/scripts/Calc.yp A~adiendo n Grammar-0.02/scripts/aSb.yp A~adiendo n Grammar-0.02/scripts/g1.yp A~adiendo n Grammar-0.02/Changes 31

A~adiendo n

Grammar-0.02/README

Commit de la revisin 2. o En general, los pasos para crear un nuevo proyecto son: * * * * * *

mkdir /tmp/nombreProyecto mkdir /tmp/nombreProyecto/branches mkdir /tmp/nombreProyecto/tags mkdir /tmp/nombreProyecto/trunk svn mkdir file:///var/svn/nombreRepositorio/nombreProyecto -m Crear el proyecto nombreProye svn import /tmp/nombreProyecto \ file:///var/svn/nombreRepositorio/nombreProyecto \ -m "Primera versin del proyecto nombreProyecto" o

Obtener una Copia de Trabajo La copia en Grammar-0.02 ha sido usada para la creacin del proyecto, pero no pertenece an al o u proyecto. Es necesario descargar la copia del proyecto que existe en el repositorio. Para ello usamos svn checkout:

[loginname@tonga]~/src/perl/> rm -fR Grammar-0.02 [loginname@tonga]~/src/perl/> svn checkout svn+ssh://banot/home/loginname/repository/Grammar G A Grammar/t A Grammar/t/Grammar.t A Grammar/MANIFEST A Grammar/META.yml A Grammar/lib A Grammar/lib/Grammar.pm A Grammar/Makefile.PL A Grammar/scripts A Grammar/scripts/grammar.pl A Grammar/scripts/Calc.yp A Grammar/scripts/Precedencia.yp A Grammar/scripts/aSb.yp A Grammar/scripts/g1.yp A Grammar/Changes A Grammar/README Revisin obtenida: 2 o Ahora disponemos de una copia de trabajo del proyecto en nuestra mquina local: a [loginname@tonga]~/src/perl/> tree Grammar Grammar |-- Changes |-- MANIFEST |-- META.yml |-- Makefile.PL |-- README |-- lib | -- Grammar.pm |-- scripts | |-- Calc.yp | |-- Precedencia.yp | |-- aSb.yp | |-- g1.yp 32

| -- grammar.pl -- t -- Grammar.t 3 directories, 12 files [loginname@tonga]~/src/perl/> [loginname@tonga]~/src/perl/> cd Grammar [loginname@tonga]~/src/perl/Grammar/> ls total 44 drwxr-xr-x 6 loginname Profesor 4096 feb drwxr-xr-x 5 loginname Profesor 4096 feb -rw-r--r-- 1 loginname Profesor 150 feb drwxr-xr-x 3 loginname Profesor 4096 feb -rw-r--r-- 1 loginname Profesor 614 feb -rw-r--r-- 1 loginname Profesor 229 feb -rw-r--r-- 1 loginname Profesor 335 feb -rw-r--r-- 1 loginname Profesor 1196 feb drwxr-xr-x 3 loginname Profesor 4096 feb drwxr-xr-x 6 loginname Profesor 4096 feb drwxr-xr-x 3 loginname Profesor 4096 feb

-la 28 28 28 28 28 28 28 28 28 28 28 2008 2008 2008 2008 2008 2008 2008 2008 2008 2008 2008 . .. Changes lib Makefile.PL MANIFEST META.yml README scripts .svn t

Observe la presencia de los subdirectorios de control .svn. Actualizacin del Proyecto o Ahora podemos modicar el proyecto y hacer pblicos los cambios mediante svn commit: u loginname@tonga]~/src/perl/Grammar/> svn rm META.yml D META.yml [loginname@tonga]~/src/perl/Grammar/> ls -la total 40 drwxr-xr-x 6 loginname Profesor 4096 feb 28 2008 . drwxr-xr-x 5 loginname Profesor 4096 feb 28 12:34 .. -rw-r--r-- 1 loginname Profesor 150 feb 28 12:34 Changes drwxr-xr-x 3 loginname Profesor 4096 feb 28 12:34 lib -rw-r--r-- 1 loginname Profesor 614 feb 28 12:34 Makefile.PL -rw-r--r-- 1 loginname Profesor 229 feb 28 12:34 MANIFEST -rw-r--r-- 1 loginname Profesor 1196 feb 28 12:34 README drwxr-xr-x 3 loginname Profesor 4096 feb 28 12:34 scripts drwxr-xr-x 6 loginname Profesor 4096 feb 28 2008 .svn drwxr-xr-x 3 loginname Profesor 4096 feb 28 12:34 t [loginname@tonga]~/src/perl/Grammar/> echo "Modifico README" >> README [loginname@tonga]~/src/perl/Grammar/> svn commit -m Just testing ... Eliminando META.yml Enviando README Transmitiendo contenido de archivos . Commit de la revisin 3. o Observe que ya no es necesario especicar el lugar en el que se encuentra el repositorio: esa informacin o esta guardada en los subdirectorios de administracin de subversion .svn o El servicio de subversion parece funcionar desde fuera de la red del centro. Vase la conexin desde e o una maquina exterior:

pp2@nereida:/tmp$ svn checkout svn+ssh://[email protected]/home/loginname/repositor [email protected] password: [email protected] password: 33

A Grammar/t A Grammar/t/Grammar.t A Grammar/MANIFEST A Grammar/lib A Grammar/lib/Grammar.pm A Grammar/Makefile.PL A Grammar/scripts A Grammar/scripts/grammar.pl A Grammar/scripts/Calc.yp A Grammar/scripts/Precedencia.yp A Grammar/scripts/aSb.yp A Grammar/scripts/g1.yp A Grammar/Changes A Grammar/README Revisin obtenida: 3 o Comandos Bsicos a Aadir y eliminar directorios o cheros individuales al proyecto n svn add directorio_o_fichero svn remove directorio_o_fichero Guardar los cambios svn commit -m "Nueva version" Actualizar el proyecto svn update Referencias Consulte http://svnbook.red-bean.com/ . Vea la pgina de la ETSII http://www.etsii.ull.es/svn . a En KDE puede instalar el cliente grco KDEsvn. a Autenticacin Automtica o a Para evitar la solicitud de claves cada vez que se comunica con el repositorio establezca autenticacin SSH automtica. Para ver como hacerlo puede consultar las instrucciones en: o a http://search.cpan.org/ casiano/GRID-Machine/lib/GRID/Machine.pod#INSTALLATION Consulte tambin las pginas del manual Unix de ssh, ssh-key-gen, ssh_config, scp, ssh-agent, e a ssh-add, sshd

1.10.

El Mdulo IPC::Run3 o

Hay un buen nmero de mdulos Perl que permiten controlar la redireccin no slo de stdin u o o o y stdout sino tambin de stderr y que constituyen una alternativa a system y qx. Entre estos se e encuentra IPC::Run3. El mdulo no forma parte del ncleo de Perl y hay que descargarlo desde CPAN: o u pp2@nereida:~/src/perl/pipesconnombre$ perl -MIPC::Run3 -wd pi_pipenamed_cas.pl main::(pi_pipenamed_cas.pl:15): my ($nprocs, $nblocks); DB run3([ls, -l]) # usa STDIN, STDOUT, STDERR total 36 -rwx------ 1 pp2 pp2 14058 2006-03-27 23:33 pi 34

-rw------- 1 pp2 pp2 488 2006-03-27 23:33 pi.c -rwx------ 1 pp2 pp2 1902 2006-03-28 18:25 pi_pipe_con_nombre.pl -rwxr-x--- 1 pp2 pp2 6677 2007-03-10 09:19 pi_pipe_con_nombre.tar.gz -rwx------ 1 pp2 pp2 2589 2007-03-12 09:21 pi_pipenamed_cas.pl DB open $err, > errores.txt # errores a $err DB run3([ls, -l, chuchu], undef, undef, $err) DB !!cat errores.txt # Mostremos los contenidos del fichero ls: chuchu: No existe el fichero o el directorio DB run3([ls, -l], undef, \undef) # STDOUT a /dev/null DB DB run3([ls, -l, chuchu], undef, undef, undef) ls: chuchu: No existe el fichero o el directorio DB sub out { print "handler: @_" } # Manejador para STDOUT DB run3([ls, -l], undef, \&out) handler: total 40 handler: -rw-r--r-- 1 pp2 pp2 49 2007-03-12 10:55 errores.txt handler: -rwx------ 1 pp2 pp2 14058 2006-03-27 23:33 pi handler: -rw------- 1 pp2 pp2 488 2006-03-27 23:33 pi.c handler: -rwx------ 1 pp2 pp2 1902 2006-03-28 18:25 pi_pipe_con_nombre.pl handler: -rwxr-x--- 1 pp2 pp2 6677 2007-03-10 09:19 pi_pipe_con_nombre.tar.gz handler: -rwx------ 1 pp2 pp2 2589 2007-03-12 09:21 pi_pipenamed_cas.pl run3 retorna TRUE si el comando pudo ejecutarse. En caso contrario provoca la muerte del programa. Deja $? con la informacin intacta para su consulta. o

1.11.

Prctica: Uso de IPC::Run3 a

Reescriba la prctica Ejecucin Controlada de Un Programa 1.9 usando IPC::Run3. Para ello haga a o parametrizable el cdigo de ejecucin. Esto es, en el chero de conguracin gura un escalar $execute o o o que contiene una referencia a una subrutina que se encarga de la ejecucin. Dicha subrutina recibe o como parmetros: el comando del ejecutable, el (los) parmetro(s) para la ejecucin asi como una a a o referencia a un array de parmetros adicionales. En el caso de la ejecucin con run3 de IPC::Run3 la a o subrutina recibe como parmetros los cheros a los que redirigir STDIN, STDOUT y STDERR. a Se deben proporcionar en el mdulo Batch::Simple una serie de manejadores de ejecucin prefao o bricados: uno para ejecucin con system otro con backqoutes otro con IPC::Run3, etc. o

1.12.

Pipes con nombre

Un pipe con nombre es un viejo mecanismo Unix para la comunicacin entre procesos en la misma o mquina. Funciona como un pipe normal. Su utilidad se revela a la hora de conectar procesos no a relacionados. Para hacer un pipe con nombre, en Unix escribimos: $ mkfifo /tmp/mozilla.ps $ ls -l /tmp/mozilla.ps prw-r--r-- 1 lhp lhp 0 2006-03-06 18:33 /tmp/mozilla.ps Ejemplo de Uso de Pipes con Nombre Cuando uso mozilla y quiero imprimir una pgina solo se ofrecen dos opciones: mandarlo a a impresora (lo que slo hago cuando estoy seguro que el texto me interesa mucho) o guardarlo como un o postscript (que ocupa muchos megas). Una solucin es ejecutar antes de hacerlo el siguiente programa: o

35

nereida:~# cat -n /usr/local/bin/mozilla2pdf 1 #!/usr/bin/perl -w 2 use strict; 3 4 my $visualpdf = "xpdf"; # gpdf acroread 5 my $pipe = (shift || /tmp/mozilla.ps); 6 my $pdf = (shift || /tmp/mozilla.pdf); 7 unless (-p $pipe) { 8 unlink $pipe; 9 system("mkfifo $pipe"); 10 die "Cant execute mkfifo" if $?; 11 } 12 13 while (1) { 14 system("ps2pdf - $pdf < $pipe"); 15 die "Pipe with ps2pdf didnt work" if $?; 16 system("$visualpdf $pdf"); 17 die "Error executing " if $?; 18 } 19 20 =head1 NAME mozilla2pdf 21 22 =head1 SYNOPSIS 23 24 mozilla2pdf ps_pipe pdf_file 25 26 =head1 DESCRIPTION 27 28 Print from your browser the HTML page to postscript file C. 29 It will be saved as a C. 30 If C isnt specified defaults to C. 31 If C isnt specified defaults to C. 32 33 =head1 AUTHOR 34 35 Casiano Rodriguez Leon Despus de ejecutar este programa seleccionamos la opcin imprimir a chero de Mozilla. Le e o indicamos que lo haga en el chero /tmp/mozilla.ps. Nos avisa que ya existe, le decimos que adelante y el pipe comienza a trabajar. Al nalizar la conversin de la l o nea 8 se abre un visualizador (hemos usado xpdf) para mostrar el aspecto del .pdf. Parece que no es posible utilizar con garant pipes con nombre en un sistema de archivos NFS. as

1.12.1.

Prctica: Calculo Usando Pipes con Nombre a1 1+x2 1 0

El rea bajo la curva y = a

entre 0 y 1 nos proporciona un mtodo para calcular : e

4 dx = 4 arctan(x)|1 = 4( 0) = 0 2) (1 + x 4N 1

Esta integral puede aproximarse por la suma: i=0

4 N 1 + ( i+0,5 )2 N

(1.1)

La suma puede hacerse en paralelo. El siguiente programa C calcula una parte de la suma: 36

lhp@nereida:~/Lperl/src/perl_networking/ch2$ cat -n pi.c 1 #include 2 #include 3 4 main(int argc, char **argv) { 5 int id, N, np, i; 6 double sum, left; 7 8 if (argc != 4) { 9 printf("Uso:\n%s id N np\n",argv[0]); 10 exit(1); 11 } 12 id = atoi(argv[1]); 13 N = atoi(argv[2]); 14 np = atoi(argv[3]); 15 for(i=id, sum = 0; if0 &);\ (pi 1 1000000 4 f1 &); (pi 2 1000000 4 f2 &); (pi 3 1000000 4 0 } @ARGV; Para llamar a la funcin unixpipe necesita preparar los comandos para que incluyan a los argumentos. o Para el programa de clculo de ser algo as a a : @commands = map { "$command $_ $nblocks $nprocs" } 0..$nprocs-1; my $pipe = unixpipe(@commands); system $pipe or die "Cant execute $pipe"; Utilice IPC::Run3 para la ejecucin si est instalado. Compare los tiempos obtenidos usando o a la funcin timethese del mdulo Benchmark para las comparaciones. Cuando entregue la prctica o o a acompaela de todos los cheros necesarios. n

38

Cap tulo 2

SSH: Secure Shell2.1.2.1.1.

Conexiones con sshIntroduccin o

SSH es un protocolo de red y un conjunto de estndares que permiten una conexin encriptada a o entre dos computadoras. Usa criptograf de clave pblica para autenticar al computador y al usuario. a u Por defecto suele usar el puerto TCP 22. SSH soporta autenticacin basada en RSA. RSA fu el primer algoritmo publicado que permite o e el encriptado y la rma digital. Se cree que es seguro si las claves son lo sucientemente largas. Se usa an en comercio electrnico. Una opcin alternativa es DSA que corresponde a Digital Signature u o o Algorithm. DSA es propiedad del gobierno de los Estados Unidos de America. Hay criptosistemas -a los que RSA pertenece - en los cuales el encriptado y desencriptado se hace utilizando claves separadas y no es posible derivar la clave de desencriptado del conocimiento de la clave de encriptado. El cliente utiliza un par de claves pblica/privada para la autenticacin. El servidor u o slo conoce la clave pblica. Funciona como una pareja llave/cerradura en la que el conocimiento de o u la cerradura no permite deducir la forma de la llave.

2.1.2.

Conexin Segura a Una mquina por Primera Vez o a

En SSH1 y OpenSSH las claves de mquinas se mantienen en etc/ssh_knownhosts y en el direca torio del usuario ~/.ssh/known_hosts. Es posible cambiar la ubicacin de estos cheros usando en el o chero de conguracin ~/.ssh/config la opcin UserKnownHostsFile. o o Al establecer por primera vez una conexin con ssh o sftp se nos avisa de la posibilidad de que o la mquina no sea quien aparenta: a nereida:~> sftp [email protected] Connecting to machine.ull.es... The authenticity of host machine.ull.es (193.312.112.190) cant be established. RSA key fingerprint is ... Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added machine.ull.es (RSA) to the list of known hosts. [email protected] password: sftp> bye El cliente ssh mantiene en ~/.ssh/known_hosts una base de datos conteniendo las mquinas a las a que el usuario se ha conectado. Cualquier nuevo hosts es aadido al chero del usuario: n nereida:~> grep machine.ull.es ~/.ssh/known_hosts machine.ull.es ssh-rsa KEY..... Si la relacin entre la IP de la mquina y su nombre cambian ssh nos avisa. Si conamos en el o a cambio podemos borrar la entrada en el chero ~/.ssh/known_hosts. De otro modo ssh se negar a a efectuar la conexin. o 39

2.1.3.

Claves P blica y Privada: Estableciendo Autenticacin No Interactiva u o

Recordemos como se establece una autenticacin por clave pblica-privada. La generacin de una o u o pareja de claves pblica-privada se realiza ejecutando en el cliente ssh-keygen: u $ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/user/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/user/.ssh/id_rsa. Your public key has been saved in /home/user/.ssh/id_rsa.pub. The key fingerprint is: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@machine Las claves se almacenan por defecto en ~/.ssh/, quedando el directorio as : $ ls -l total 12 -rw-------rw-r--r--rw-r--r--

1 user user 883 2005-08-13 14:16 id_rsa 1 user user 223 2005-08-13 14:16 id_rsa.pub 1 user user 1344 2005-08-04 02:14 known_hosts

Los cheros id_rsa e id_rsa.pub contienen respectivamente las claves privada y pblica. El chero u known_hosts contiene la lista de las claves pblicas de las mquinas reconocidas. u a Ahora se debe copiar la clave pblica al servidor, al chero ~/.ssh/authorized_keys. Para ello u se utiliza el comando ssh-copy-id: $ssh-copy-id -i ~/.ssh/id_rsa.pub user@machine1 $ssh-copy-id -i ~/.ssh/id_rsa.pub user@machine2 ssh-copy-id es un script que se conecta a la mquina y copia el archivo (indicado por la opcin a o -i) en ~/.ssh/authorized_keys, y ajusta los permisos a los valores adecuados. Si no se dispone del programa ssh-copy-id se puede realizar una copia manual a la mquina a remota del chero conteniendo la clave pblica (por ejemplo usando scp o sftp) y aadir su contenido u n al chero ~/.ssh/authorized_keys. Ahora la conexin deber funcionar sin necesidad de introducir la clave. Si no es as es posible o a que sea un problema de permisos en los cheros. Los permisos correctos deben ser similares a estos: $ chmod go-w $HOME $HOME/.ssh $ chmod 600 $HOME/.ssh/authorized_keys Ejercicio 2.1.1. Copie el chero de clave privada de su cuenta de usuario u1 en m1 a otra cuenta u2 en la mquina m1. Intente ahora conectarse siendo el usuario u2 de m1 a la mquina rm en la que a a situ la clave pblica como usuario ru: o u u2@m1:~/$ ssh ru@rm Sigue funcionando la autenticacin automtica? o a Ejercicio 2.1.2. Copie ahora el chero de clave privada de su cuenta de usuario u1 en m1 a otra cuenta w1 en una mquina distinta mw. Conctese desde mw a rm en la que situ la clave pblica como a e o u usuario ru: mw@w1:~/$ ssh ru@rm

40

Funciona? Como afectan los resultados a su percepcin de la seguridad de las comunicaciones con o ssh? Ejercicio 2.1.3. Considere una intranet en la que su HOME de usuario esta en un sistema de archivos compartido. Genere (si no la ha echo ya) su pareja de claves privada y pblica. Publique la clave u usando $ssh-copy-id o bien - si $ssh-copy-id no est disponible - copiando la clave pblica en el a u chero authorized_keys. Se obtiene autorizacin automtica entre dos mquinas cualesquiera de la o a a red?

2.1.4.

Ejecucin de un Comando v ssh o a

Una vez que se ha establecido un esquema de autenticacin automtica es trivial ejecutar un o a comando en la mquina remota: a pp2@nereida:/tmp$ ssh remotename@machine uname -a Linux machine 2.6.8-2-686 #1 Tue Aug 16 13:22:48 UTC 2005 i686 GNU/Linux

2.1.5.

Transferencia por sftp

Si se establece autenticacin no interactiva es posible usar sftp en modo batch: o ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected] pp2@nereida:~/Lbook$ cat -n instituto.sftp 1 cd asignas/asignas/PRGPAR2/perlexamples 2 lcd /home/pp2/public_html/perlexamples/ 3 put * pp2@nereida:~/Lbook$ sftp -b instituto.sftp [email protected] >/dev/null Net::SFTP::Foreign El mdulo Net::SFTP::Foreign provee de una interface para la conexin sftp con una mquina o o a que ofrezca el servicio sftp: pp2@nereida:/tmp/Batch-Simple-0.01/t/matrix$ perl -MNet::SFTP::Foreign::Compat -wde 0 main::(-e:1): 0 DB $sftp = Net::SFTP::Foreign::Compat->new(beowulf, user => casiano) DB $sftp->put(mm.c, mminbeowulf.c) DB $sftp->ls(./, sub { $_ = $_[0]->{filename}; print "$_\n" if /\.c$/ }) pi.c mminbeowulf.c DB @a = grep {$_->{filename} =~ /\.c$/ } $sftp->ls(./) DB x @a 0 HASH(0x85b4ed8) a => Net::SFTP::Foreign::Attributes=HASH(0x85b4df4) atime => 1151066274 flags => 15 gid => 1001 mtime => 1150193739 perm => 33188 size => 415 uid => 1001 filename => pi.c longname => -rw-r--r-1 casiano casiano 415 Jun 13 2006 pi.c 1 HASH(0x85b5898) a => Net::SFTP::Foreign::Attributes=HASH(0x85b57b4) atime => 1173889173 41

flags => 15 gid => 1001 mtime => 1173275731 perm => 33188 size => 2851 uid => 1001 filename => mminbeowulf.c longname => -rw-r--r-1 casiano

casiano

2851 Mar

7 13:55 mminbeowulf.c

La creacin de la conexin da lugar a la peticin de la clave. Lea la seccin 7.1.10 para ver como omitir o o o o la necesidad de entrar la clave.

2.1.6.

Copia Segura de un Fichero

Para hacer una copia segura entre dos mquinas usamos scp: a nereida:~> scp mm.c orion:/tmp/ mm.c Entre otros, el mdulo Net::SCP permite tener una API de acceso a las funcionalidades de scp: o pp2@nereida:~$ perl -MNet::SCP -wde 0 main::(-e:1): 0 DB $scp = Net::SCP->new({ host => "machine", user => "loginname" } ) DB $scp->put("hello.txt", "helloremote.txt") or die $scp->{errstr} DB q pp2@nereida:~$ ssh loginname@machine ls -ltr | tail -1 -rw-r--r-1 loginname loginname 12 2007-03-21 12:46 helloremote.txt pp2@nereida:~$ ssh loginname@machine cat helloremote.txt hello machine

2.1.7.

El chero authorized keys

Cada l nea del chero SSH1 authorized keys (habitualmente en ~/.ssh/authorized_keys) contiene una clave pblica. Tiene el siguiente formato: Cada entrada va en una sla l u o nea. Los campos se separan por comas. Las l neas en blanco y las que empiezan por # se ignoran. Primero van las opciones, separadas por comas, por ejemplo: from="pattern-list" command="command" environment="NAME=value" nopty Este campo es opcional. Su presencia se detecta viendo si la l nea comienza por un nmero o no u La clave pblica: bits, exponente y mdulo u o Un comentario ([email protected]) en el ejemplo que sigue Sigue un ejemplo de l nea: # Pruebas para ver las opciones en authorized_keys command="ls" ssh-rsa AAA...VQ== [email protected] La presencia de la opcin comando permite dar acceso a nuestra cuenta a usuarios restringiendo o el uso de los comandos que pueden utilizar. 42

someone@localhost:~$ ssh -l user machine.domain.es Algorithm-Knap01DP-0.25 doc Algorithm-Knap01DP-0.25.tar doctorado Desktop HTML2LATEX Connection to machine.domain.es closed. Es posible obtener lo escrito en la l nea de comandos por el cliente. Vea el siguiente programa (en la mquina remota) que utilizaremos como comando forzado: a [email protected]:~/bin$ cat -n rssh.pl 1 #!/usr/bin/perl -w 2 use strict; 3 my $args = $ENV{SSH_ORIGINAL_COMMAND} || ; 4 5 print "Usted escribi:\n"; o Cuando se fuerza en authorized_keys y se ejecuta la conexin se obtiene: o someone@localhost:~$ ssh -l user machine.domain.es one two three Usted escribi: o Ejercicio 2.1.4. Establezca un comando forzado para una clave dada de manera que la conexin con o la mquina remota de lugar a un cat de los cheros especicados por el usuario. a Ejercicio 2.1.5. Establezca un comando forzado para una clave dada de manera que la conexin con o la mquina remota de lugar aa una conesin ssh con una segunda mquina remota a o a

2.1.8.

Restriccin del Intrprete Perl o e

El mdulo Safe permite restringir los comandos disponibles en Perl: o Ejemplo pp2@nereida:~/src/perl/safe$ cat -n example.pl 1 #!/usr/bin/perl -w 2 use strict; 3 4 use Safe; 5 6 my $compartment = new Safe; 7 8 $compartment->permit(qw(time :browse)); 9 10 my $unsafe_code = ; 11 my $result = $compartment->reval($unsafe_code); 12 13 print $result."\n"; Ejecucin o pp2@nereida:~/src/perl/safe$ example.pl time 1209976546 pp2@nereida:~/src/perl/safe$ example.pl print "Hola\n" Hola 43

1 pp2@nereida:~/src/perl/safe$ example.pl system("uname -a") Use of uninitialized value in concatenation (.) or string at ./example.pl line 13, line 1.

2.1.9.

Acceso Slo Via scp o

Una pregunta frecuente es Cmo permito el acceso via scp/sftp pero desabilitando ssh? o El problema es que scp y sftp ejecutan ssh como subproceso. Una forma sencilla es crear usar una clave con comando forzado. En SSH2 es muy simple: # SSH2 [remote:~/.ssh2/authorization] key users_key.pub command /usr/local/bin/sftp-server En SSH1 la cosa es mas complicada pues el cliente scp modica los argumentos pasados al lado remote scp. Observe lo que ocurre cuando se usa scp con el programa anterior rssh.pl como programa forzado: [email protected]:~/bin$ cat -n rssh.pl 1 #!/usr/bin/perl -w 2 use strict; 3 my $args = $ENV{SSH_ORIGINAL_COMMAND} || ; 4 5 print "Usted escribi:\n"; o Al ejecutar scp en la mquina local vemos que los argumentos se reciben modicados en el remoto: a someone@localhost:~$ scp prueba.txt [email protected]:trasladado.txt Usted escribi: o someone@localhost:~$ scp [email protected]:trasladado.txt local.txt Usted escribi: o someone@localhost:~$ scp * [email protected]:/home/user/bin/ Usted escribi: o

El siguiente programa Perl (este programa es una modicacin del que se encuentra en http://www.snailbook.co o acta como wrapper, asegurando la presencia de los parmetros, que los cheros objeto no casan con u a las expresiones regulares en ~/.ssh/not_allowed y lanzando scp: [email protected]:~/bin$ cat -n reversecopy.pl 1 #!/usr/bin/perl -w 2 use strict; 3 use List::MoreUtils qw(firstidx any); 4 5 # location of the server-side scp we want to run 6 my $scp_server = which scp; 7 chomp($scp_server); 8 9 # File with regexps: If any target matches a regexp the transfer will be 10 # cut 11 my @not_allowed = cat $ENV{HOME}/.ssh/not_allowed; 12 chomp(@not_allowed); 13 14 # Allow comments and empty lines 44

15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

@not_allowed = grep { $_ !~ /^#|^\s*$/ } @not_allowed; # Since this script is called as a forced command, need to get the # original scp command given by the client. my $command = $ENV{SSH_ORIGINAL_COMMAND} || die "Environment variable SSH_ORIGINAL_COMMAND # Split the command string to make an argument list, and remove the first # element (the command name; well supply our own); my ($c, @args) = split /\s+/, $command; # Complain if the command is not "scp". die "Account restricted: only scp allowed ($c)" unless $c eq scp; # Ensure that either -t or -f is on the command line, to enforce running # scp in server mode. # if were OK, run our desired "scp" with arguments. No redirections allowed my $i = firstidx { /^-[tf]$/ } @args; die "Account Restricted; only server mode allowed." unless defined($i); $i++; my $file = $args[$i]; die "Cant make transference" unless defined($file); die "Transference of $file not allowed" if any { $file =~ qr{$_} } @not_allowed; exec($scp_server, @args); En el chero ~/.ssh/authorized_keys:

command="/home/user/bin/reversecopy.pl" ssh-rsa AA...VQ== [email protected] Estos son los contenidos del chero ~/.ssh/not_allowed: [email protected]:~/.ssh$ cat not_allowed known_hosts|authorized_keys|id_rsa # Comentario: La siguiente line es en blanco bin [email protected]:~/.ssh$ Ahora al ejecutar la conexin los intentos de escribir en bin son rechazados: o someone@localhost:~$ scp prueba.txt [email protected]:trasladado.txt prueba.txt 100% 7 0.0KB/s 00:00 someone@localhost:~$ scp prueba.txt [email protected]:bin/trasladado.txt Transference of bin/trasladado.txt not allowed at /home/user/bin/reversecopy.pl line 42. lost connection Una solucin mas robusta, si se es el administrador de la mquina remota, es crear un usuario que o a slo puede usar una shell restringida como rssh. o Ejercicio 2.1.6. Establezca una identidad que tiene acceso slo v scp con la mquina remota o a a 45

2.1.10.

Deshabilitar la Asignacin de una TTY o

Normalmente, cuando nos conectamos via SSH-1 el servidor abre una seudoterminal. Esto no es asi si se ejecuta un comando no interactivo. La variable de entorno SSH_TTY contiene el nombre de la terminal asignada. La asignacin ocurre incluso si se ha congurado un comando forzado Por ejemplo, o si en authorized_keys tenemos: command="echo SSH_TTY is [$SSH_TTY]" ssh-rsa AAA... Tenemos: someone@localhost:~$ ssh -l user machine.domain.es SSH_TTY is [/dev/pts/5] Connection to orion closed. someone@localhost:~$ ssh -l user machine.domain.es echo "tutu" SSH_TTY is [] Use la opcin no-pty para deshabilitar la asignacin de TTY. Esto funciona incluso si el cliente utiliza o o la opcin -t para requerir una TTY. o

2.1.11.

Agentes SSH

Un agente SSH es un programa que guarda las claves privadas y responde a consultas autenticadas de los clientes SSH. Los programas que se usan son ssh-agent y ssh-add. El agente ssh-agent acta u como un deamon. El programa ssh-add permite aadir, listar y suprimir claves de la cache del agente: n someone@localhost:~/.ssh$ ssh-add ~/.ssh/conpass Enter passphrase for /home/someone/.ssh/conpass: ********** Identity added: /home/someone/.ssh/conpass (/home/someone/.ssh/conpass) someone@localhost:~/.ssh$ ssh-add -l 2048 da:13:....:ee /home/someone/.ssh/conpass (RSA) Una vez establecida la clave en el agente es posible conectarse sin necesidad de proporcionar la clave: someone@localhost:~/.kde/shutdown$ ssh remote.machine Linux remote.machine 2.6.8-2-686 #1 Tue Aug 16 13:22:48 UTC 2005 i686 GNU/Linux The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Tue Mar 11 14:03:59 2008 from localhost.deioc.ull.es [email protected]:~$ Hay dos formas bsicas de ejecutar el agente. La primera es: a eval ssh-agent Esto se hace asi porque el resultado retornado por ssh-agent es una cadena conteniendo un script con las variables de entorno necesarias para poder conectar con el agente. En efecto, observe el resultado de una ejecucin sin eval ni backticks: o $ ssh-agent SSH_AUTH_SOCK=/tmp/ssh-jaDVTd5583/agent.5583; export SSH_AUTH_SOCK; SSH_AGENT_PID=5584; export SSH_AGENT_PID; echo Agent pid 5584; 46

El pid proporcionado nos permite eliminar al agente mediante kill. Sin embargo una llamada a kill no elimina las variables de entorno establecidas. La forma correcta de terminar el agente es usando la opcin -k de ssh-agent: o pp2@localhost:~/Lbook$ eval ssh-agent Agent pid 5606 pp2@localhost:~/Lbook$ env | grep -i ssh SSH_AGENT_PID=5606 SSH_AUTH_SOCK=/tmp/ssh-ALUJyJ5605/agent.5605 CVS_RSH=/usr/bin/ssh pp2@localhost:~/Lbook$ eval ssh-agent -k Agent pid 5606 killed pp2@localhost:~/Lbook$ env | grep -i ssh CVS_RSH=/usr/bin/ssh pp2@localhost:~/Lbook$ Lo habitual es arrancar el agente tan pronto como se inicia la sesin y eliminarlo a la salida de o la misma. Esto puede hacerse a nivel de sesin grca o bien a nivel de sesin de usuario (chero o a o .profile). Por ejemplo, el siguiente esquema funciona si su entorno grco es KDE: a Cree /.kde/env/ssh-agent.sh mkdir ~/.kde/env vim ~/.kde/env/ssh-