Comando attach
Inyecta el Agente Peeka en el proceso Python objetivo y establece un canal de diagnóstico.
Tabla de Contenidos
- Descripción General
- Uso en TUI
- Sintaxis
- Ejemplos de Uso
- Requisitos de Permisos
- Formato de Salida
- Resolución de Problemas
- Consideraciones de Seguridad
- Comandos Relacionados
- Referencias
Descripción General
El comando attach es el primer paso para usar Peeka, inyecta el código del Agente Peeka en el proceso objetivo y inicia el servidor Unix Domain Socket, estableciendo un canal de comunicación para los comandos de diagnóstico posteriores.
Principio de Funcionamiento
Python 3.14+:
- Usa la API
sys.remote_exec()de PEP 768 - Seguro, eficiente, soporte oficial
Python 3.8.1-3.13:
- Usa GDB + ptrace en Linux
- Usa LLDB + dlopen en macOS
- Alternativa de compatibilidad
Uso en TUI
TUI se adjunta automáticamente al iniciar: Simplemente ejecuta el comando peeka para iniciar TUI, y mostrará automáticamente el selector de procesos:
- Ejecuta
peeka(sin parámetros) - Selecciona el proceso objetivo en el selector de procesos
- Presiona Enter para adjuntar automáticamente y entrar en la interfaz principal
Características de TUI:
- Lista de procesos se actualiza en tiempo real
- Muestra PID del proceso, línea de comandos, uso de CPU/memoria
- Soporta filtrado de búsqueda (ingresa palabras clave para filtrar)
- Verifica permisos automáticamente (muestra disponibilidad de PEP 768, GDB o LLDB)
Equivalente CLI: Todos los ejemplos a continuación usan comandos CLI para demostrar, TUI proporciona una interfaz gráfica con la misma funcionalidad.
Sintaxis
peeka-cli attach <pid> [options]
Parámetros
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
pid |
int | ✅ | PID del proceso objetivo |
Opciones
| Opción | Descripción | Valor por defecto |
|---|---|---|
--timeout |
Tiempo de espera para adjunte (segundos) | 30 |
--socket-dir |
Directorio de archivos Socket | /tmp |
Ejemplos de Uso
Adjunte Básico
# Adjuntar al proceso 12345
peeka-cli attach 12345
Salida:
{"type":"status","level":"info","message":"Attaching to process 12345"}
{"type":"status","level":"info","message":"Using PEP 768 remote_exec"}
{"type":"success","command":"attach","data":{"pid":12345,"socket":"/tmp/peeka_12345.sock"}}
Encontrar PID del proceso
# Usa ps para encontrar
ps aux | grep python
# Usa pgrep
pgrep -f "my_app.py"
# Usa pidof
pidof python3
Adjuntar y ejecutar comando inmediatamente
# Adjuntar y observar inmediatamente
peeka-cli attach 12345 && peeka-cli watch "app.func"
Requisitos de Permisos
Sistema Linux
Mismo Usuario
La forma más simple es usar el mismo usuario para ejecutar Peeka:
# El proceso objetivo y Peeka se ejecutan con user1
user1$ python my_app.py # PID: 12345
user1$ peeka-cli attach 12345 # ✅ Éxito
Diferente Usuario (necesita sudo)
# El proceso objetivo se ejecuta con user1, necesita sudo
user1$ python my_app.py # PID: 12345
user2$ sudo peeka-cli attach 12345 # ✅ Éxito
Configuración ptrace_scope
Verifica la configuración actual:
cat /proc/sys/kernel/yama/ptrace_scope
| Valor | Descripción | Disponibilidad de Peeka |
|---|---|---|
| 0 | Sin restricción (no recomendado) | ✅ Todos los usuarios pueden adjuntar |
| 1 | Solo procesos padre-hijo o CAP_SYS_PTRACE | ✅ Configuración recomendada |
| 2 | Solo CAP_SYS_PTRACE | ✅ Necesita sudo |
| 3 | Totalmente deshabilitado | ❌ No se puede usar |
Modificación temporal (para pruebas):
echo 1 | sudo tee /proc/sys/kernel/yama/ptrace_scope
Modificación permanente:
echo "kernel.yama.ptrace_scope = 1" | sudo tee /etc/sysctl.d/10-ptrace.conf
sudo sysctl -p /etc/sysctl.d/10-ptrace.conf
Contenedores Docker
Necesitas agregar la capability SYS_PTRACE:
# Agregar al ejecutar el contenedor
docker run --cap-add=SYS_PTRACE your-image
# docker-compose.yml
services:
app:
cap_add:
- SYS_PTRACE
security_opt:
- seccomp=unconfined
Sistema SELinux
Verifica el estado de SELinux:
getenforce # Enforcing, Permissive, Disabled
Permitir ptrace temporalmente:
sudo setsebool -P deny_ptrace off
Formato de Salida
Respuesta Exitosa
{
"type": "success",
"command": "attach",
"data": {
"pid": 12345,
"socket": "/tmp/peeka_12345.sock",
"python_version": "3.12.0",
"attach_method": "remote_exec"
}
}
Respuesta de Error
{
"type": "error",
"command": "attach",
"error": "Operation not permitted: ptrace access denied"
}
Resolución de Problemas
Error: Operation not permitted
Causa: Permisos insuficientes
Solución:
- Usa el mismo usuario o sudo
- Verifica la configuración de ptrace_scope
- Verifica la configuración de SELinux
# Verificar propietario del proceso
ps -o user= -p 12345
# Usa sudo
sudo peeka-cli attach 12345
# Relajar restricción ptrace (para pruebas)
echo 1 | sudo tee /proc/sys/kernel/yama/ptrace_scope
Error: Process not found
Causa: El PID no existe o ya terminó
Solución:
# Confirmar que el proceso existe
ps -p 12345
# Volver a buscar el PID
pgrep -f "my_app.py"
Error: Python debugging symbols not found (Linux, Python < 3.14)
Causa: Faltan símbolos de depuración de Python (requeridos por la alternativa GDB en Linux)
Solución:
# Debian/Ubuntu
sudo apt-get install python3-dbg
# RHEL/CentOS
sudo yum install python3-debuginfo
Error: GDB not found (Linux, Python < 3.14)
Causa: GDB no está instalado
Solución:
# Debian/Ubuntu
sudo apt-get install gdb
# RHEL/CentOS
sudo yum install gdb
Error: LLDB not found (macOS, Python < 3.14)
Causa: Xcode Command Line Tools no está instalado
Solución:
xcode-select --install
Error: Timeout attaching to process
Causa: Tiempo de espera agotado (el proceso objetivo puede estar bloqueado)
Solución:
# Aumentar tiempo de espera
peeka-cli attach 12345 --timeout 60
# Verificar estado del proceso objetivo
ps -p 12345 -o stat=
Consideraciones de Seguridad
Aislamiento de Procesos
- Peeka solo puede adjuntar a procesos locales
- No soporta adjunte remoto
- Unix Domain Socket solo es accesible localmente
Mínimos Permisos
- En entorno de producción se recomienda usar el mismo usuario para ejecutar
- Evita usar permisos de root
- Desadjunta (detach) procesos que ya no necesitan diagnóstico oportunamente
Seguridad de Inyección de Código
- El código del Agente solo ejecuta funciones de diagnóstico
- No modifica la lógica de negocio
- Todas las inyecciones se pueden restaurar mediante el comando reset
Comandos Relacionados
- detach - Desadjuntar del proceso
- watch - Observar llamadas a funciones
- reset - Restablecer inyección