GNU/Linux - Hilo general

AikonCWD

Hola, sigo con mis problemas de n00b con linux, veréis...

Quiero ejecutar un comando nada más loguear un usuario. He puesto el comando en /etc/rc.local, pero por alguna razón se ejecuta "antes" del login del usuario y obtengo efectos no deseados (por ejemplo la aplicacion no puede hacer poweroff y genera una carpeta tipo "profile" dentro de /root/ en lugar de /home/pi/).

Una vez logueado con el user pi, si ejecuto el mismo comando entonces puedo hacer poweroff desde dentro y la carpeta de configs se genera donde toca (/home/pi/). De que otro modo puedo ejecutar un comando tras el login sin recurrir al rc.local?

Gracias

1 respuesta
Saphyel

#5521 estas seguro que sabes cuando se ejecuta el rc.local? https://www.raspberrypi.org/documentation/linux/usage/rc-local.md

1 respuesta
AikonCWD

#5522 Si, según mis pruebas y esa wiki... el comando que meta en rc.local se ejecuta antes de iniciar sesión con algún usuario, al parecer lo ejecuta "root" por eso la aplicación genera su carpeta en /roo/ en lugar de /home/user, tras finalizar el comando que se ha ejecutado desde rc.local me pide el login

Así que está claro que no tengo que utilizar rc.local, de que otro modo podría auto-ejecutar un comando DESPUÉS de iniciar sesión en la raspberry? (Debian)

3 respuestas
Saphyel

#5523 jesuschrist, pero usa google! => http://unix.stackexchange.com/questions/122424/execute-a-command-on-user-logon

1 respuesta
D

#5523 rc.local se ejecuta despues de levantar todos los seevicios configurados en /etc/init.d, no cuando un user hace login

B

#5523 iba a decirte que /home/user/.xinitrc pero supongo que ya lo tendras... Tambien es posible que el windowmanager que usas tenga algun script/cfg de autoarranque por usuario, del cual te dejo el goce de descubrir su nombre puesto que no se que wm usas. Lo normal es que la ruta sea tipo /home/user/.archivo

1 respuesta
AikonCWD

#5524 #5526 Tampoco me sirve del todo, una vez he iniciado sesión... si me da por entrar por SSH, se vuelve a ejecutar el comando que ponga en .profile

1 respuesta
maxmalkav

#5527 primero tienes que tener en cuenta qué entorno de escritorio estás usando. Dependiendo de esto, la mayoría dan opciones en su configuración para ejecutar los comandos que quieras cuando inicias sesión se usuario (KDE, Xfce, fluxbox, i3 y un largo etc te lo permiten, cada uno de una forma u otra, de ahí la importancia de saber de qué entorno estamos hablando).

La otra solución, más genérica es la que comenta ccoKee, tirar ce .xinitrc o bien .xsessionrc que estará localizado (o tendrás que crear) en el $HOME del usuario donde quieras que ocurra la magia. El "problema" de usar .xinitrc .xsession etc es que cada gestor de sesión (lightdm, kdm, gdm, etc) puede darle por tener uno u otro en cuenta, también hay pequeñas diferencias entre distribuciones, etc. En consecuencia, que requiren algo de prueba y error para ver si lo que pones en uno se ejecuta o no.

1 respuesta
AikonCWD

#5528 Entiendo, pues voy a hacer pruebas. Me consta que en la distro Debian Jessie existe el /home/user/.profile

Si pongo el comando se ejecuta tras hacer login, pero se ejecuta también cuando hago login por SSH. Miraré a ver las otras opciones. Gracias

1 respuesta
maxmalkav

#5529 a ver, ten en cuenta que tienes dos tipos de sesiones:

  • sesión "en línea de comandos/shell", que siempre recurrirá al .profile (no sólo en Debian si no en la mayoría de los benditos Unix) y dependiendo de tu shell de archivos como .bashrc o .bashprofile. Teniendo en cuenta que una sesión SSH es una sesión shell remota, así que también recurre al .profile (aunque creo que esto es configurable)

  • sesión gráfica (que es la que parece que te interesa a ti), los archivos por defecto usados por X.org son .xinitrc y/o .xsession o .xsessionrc. Aparte de esto, cada entorno de escritorio/gestor de ventana suele dar opciones para lanzar lo que más coraje te de al iniciar sesión gráfica.

Me parece muy bien que te conste que existe el .profile, pero decide en qué tipo de sesión (gráfica o shell) necesitas lanzar el script/comando/loquesea, y elige en consecuencia la forma más "natural" de atacar el problema.

1 respuesta
AikonCWD

#5530 Gracias por tu paciencia. Tengo Raspbian (debian) Jessie Little, hasta donde yo se es una distro minima sin X (solo consola), así que .xinitrc y compañía no serían interpretados.

Atacaré el problema desde otro punto de vista. He probado a machacar root (sudo passwd root) y ahora puedo iniciar sesion como root en la rpi (en lugar de utilizar el usuario pi). La aplicacion la ejecuto desde rc.local, la config de la aplicacion me la guarda en /root/.kodi y ahora esa carpeta es accesible por sFTP.

Así que problema resuelto. Me cago el usuario pi y toda su home y dejo la imagen con un unico usuario root y toda la config colgará de /root/

Si lo pienso en frio, es como funciona openELEC, el unico usuario es root y toda la config cuelga de esa carpeta. Mañana le dare duro a las aplicaciones (kodi, retropie, emulationstation) a ver si responden bien ejecutándose bajo root.

Gracias :)

2 respuestas
FMartinez

#5520

Tampoco es tan dificil, arch si se caracteriza es por tener una comunidad y guias muy buenas... yo en su dia instalé Gentoo siguiendo el handbook en el mismo dia, y compilando el kernel a mano, quitando incluso opciones que no utilizaba

1 respuesta
maxmalkav

#5531 mi primera instalación de Raspbian llevaba entorno gráfico (no recuerdo si lo elegías al realizar la instalación). Si la RP la estás usando sin entorno gráfico, como bien dices, los .xinitrc y compañía no te servirán para nada.

Por aclarar un poco, qué problema tenías exactamente lanzando tu script desde /etc/rc.local y qué problema al colocarlo en .profile (también te podría servir .bashrc o .bash_profile dependiendo de tu configuración)?

Si ejecutando todo como root te resuelve el problema, está bien, aunque no es una solución muy elegante. Una vez que se le coge el truco, el sistema de permisos y usuarios de Linux no está mal.

1 respuesta
B

#5531 que estas haciendo? lo digo porque conectar un RPi a la red y tener usuario root 'de facil acceso' no es nada seguro. ni en RPi ni en cualquier sistema operativo.

ya nos detallaras que estas liando chumacho :P

2 respuestas
AikonCWD

#5533 #5534 Os explico con detalle:

Raspbian por defecto tiene root con password "secreto" y no accesible y un usuario llamado pi con password raspbian.

Lo correcto es loguear con pi y hacer sudo de los comandos que necesites, hasta ahí todo correcto. Quiero auto-iniciar kodi al arrancar la raspberry. Si añado kodi al rc.local, éste se ejecuta ANTES de iniciar sesión con el usuario pi, eso significa que kodi se ejecuta con el usuario root. Puedo confirmar eso debido a que kodi me crea la carpeta .kodi dentro de /root/.kodi. Cuando me logueo por SFTP o SSH con el usuario pi, no puedo acceder a /root/.kodi.

Lo siguiente que he probado es auto-ejecutar kodi usando el fichero .profile
Todo parece funcionar bien, kodi se auto-ejecuta tras hacer login con "pi" y la carpeta .kodi se genera en /home/pi/.kodi ¿Cúal es el problema? Que si abro un putty contra la raspberry, se vuelve a ejecutar una segunda instancia de kodi, el login a traves de SSH tambien procesa el .profile y vuelve a ejecutar kodi.

Mi "solución": Meto un sudo passwd root y establezco un password a root, borro el user "pi" pues no lo voy a necesitar. Configuro rc.local para que se auto.ejecute kodi. Kodi se ejecuta y me deja la carpeta .kodi dentro de /root/.kodi, inicio sesion por SSH o por SFTP con el usuario root y ahora sí puedo acceder a /root/.kodi

Problema resuelto :) A no ser que me indiquéis otro modo de hacerlo.

2 respuestas
Kaiserlau

#5535 tu solucion es un poco meh xdxd con una simple cabezera en tu scrtpt q compruebe si el proceso esta iniciado o no lo arreglabas.

algo asi:

#!/bin/sh

SERVICE="$1"
RESULT=`ps -a | sed -n /${SERVICE}/p`

if [ "${RESULT:-null}" = null ]; then
    echo "not running"
else
    echo "running"
fi

http://stackoverflow.com/questions/2903354/bash-script-to-check-running-process

2 respuestas
B

#5534 Se que es un caso ridiculo, pero mejor un unico user root con una contraseña custom que un usuario default con pw default que puede hacer sudo por toda la rasp no? XD

#5535 lo de #5536 me parece mas elegante

1 respuesta
AikonCWD

#5536 Me mola, pero ese script tendría que ser algo más profundo, me explico:

Imagínate que he cerrado kodi a proposito porque quiero ejecutar otra app (moonlight, retropie, etc....) y en ese momento accedo por SSH. Con ese script se volvería a ejecutar kodi al hacer login por SSH debido a que kodi estaba cerrado. Si cierro kodi, me pongo a jugar con moonlight e inicio sesión por SSH, me levantará kodi encima de moonlight y la RAM de la raspberry se irá de vacaciones xD

El script ideal sería que compruebe si el login es via SSH o consola (bash?) y ejecute kodi en el segundo caso.

De todas formas no te preocupes, como dice #5537 creo que tener un único usuario root con password configurable es mejor que tener el usuario pi con password genérico. La conocida distribución openELEC funciona incluso "peor" que mi "solución".

En openELEC solo existe un usuario root con password = openelec y NO lo puedes cambiar xD

Lee ésto y alucina: http://wiki.openelec.tv/index.php?title=OpenELEC_FAQ#How_do_I_change_the_SSH_password.3F

3 respuestas
Kaiserlau

#5538 ¿primero que servicio o app quieres tener arriba por defecto en el inicio? lo q veo sq de todas todas te vas a tener q hacer algo custom en bash o en python q te haga de manager.

1 respuesta
B

#5538 ps te puede indicar si estas en una sesion ssh para que las sesiones ssh no ejecuten nada del .profile:

ps -o comm= -p $PPID

Lo pones en un condicional para comprobar si el valor es sshd o no y a partir de ahi actuas

2 respuestas
AikonCWD

#5539 Lo que quiero es que nada más encender la rasp y hacer login, se auto ejecute kodi. Luego es posible que el usuario ciere kodi para ejecutar otra app (moonlight por ejemplo).

La opción de #5540 creo que me servirá, si puedo discriminar cuando estoy en SSH o bash entonces podré decidir abrir kodi o no desde .profile.

Gracias a todos, me habéis ayudado como siempre

maxmalkav

#5538 :facepalm: AikonCWD, si kodi no es entorno gráfico y tira de X.org, no sé que es lo que es ..

Lo que quieres hacer es ejecutar kodi en modo standalone.

Si quieres que Kodi se ejecute como servicio al arrancar la máquina, aquí están descritos todos los pasos
http://kodi.wiki/view/HOW-TO:Autostart_Kodi_for_Linux

Puede que incluso más sencillo sea tener un gestor de sesión (como lightdm) e indicarle que cuando arranque, la sesión por defecto y sin pedir contraseña sea la del entorno gráfico que denominaremos "Kodi". Aquí tienes la configuración para el gestor de sesión lightdm
https://github.com/xbmc/XBMCbuntu/blob/master/configFiles/includes.chroot/etc/lightdm/lightdm.conf

2 respuestas
AikonCWD

#5542 Si hago eso (que ya lo he probado) en las opciones de power (dentro de kodi) no me aparece la opción de hacer reboot o poweroff, solo me permite hacer exit y salir a la consola. En cambio, si ejecuto kodi desde un usuario, el menu interno de kodi se extiende y me deja hacer reboot o poweroff.

Y evidentemente tengo que dejar al usuario apagar la rasp desde el propio menu de kodi sin necesidad de pasar por la consola y escribir sudo poweroff

3 respuestas
maxmalkav

Añado detalles:

  • si quieres optar por la opción lightdm (creo que es la más sencilla), pon tu fichero de configuración para lightdm (con los permisos adecuados) en /usr/share/xsessions

  • mirando el anterior directorio en mi máquina debian .. sorpresa! mira lo que tengo
    kodi.desktop:

[Desktop Entry]
Name=Kodi
Comment=This session will start Kodi Media Center
Exec=kodi-standalone
TryExec=kodi-standalone
Type=Application

1
maxmalkav

#5543 lo que comentas el power off tiene pinta de ser relativamente fácil de solucionar, está claro que es por una diferencia en la configuración entre un modo y otro

http://forum.kodi.tv/showthread.php?tid=130419

En serio, prueba el modo lightdm que van a ser 2 segundos, tienes más papeletas de que lightdm te deje todo preparado para que kodi te muestre lo que tenga que mostrar. Además lightdm hace caso del $HOME/.xsessionrc, que es una pequeña ventaja.

1 respuesta
AikonCWD

#5545 Lo probaré, lightdm consumo mucho? Cuanto menos mierdas tenga corriendo en la rasp mejor...

2 respuestas
B

#5542 No se si a lo que se refería aikon es que OPENelec no usaba Xorg para arrancar xbmc/kodi (al menos en su epoca algo asi entendi) pero tampoco pasaba en el resto de distros de rasp

#5543 ese problema me parece raro que lo tuvieras ejecutandolo como root, suele ser porque el usuario que ejecuta no tiene permisos para los comandos de tipo shutdown/halt/s2ram/reboot etc y en todo caso se soluciona metiendo al usuario en el grupo de los mismos.

#5546 si quieres que ocupe lo menos posible usa xdm, ahora es feo de cojones (creo que es el que te salio cuando instalaste arch en la vm) y darle aspecto no es grato... de ahi que se suela montar lightdm o slim sobre xdm, pero xdm tambien gestiona sesiones.

1 respuesta
AikonCWD

#5547 Supongo que sí, pero vamos, no me quiero complicar demasiado... Optaré por follarme al usuario pi, habilitar el acceso por root y con el password configurable. Yo lo veo mucho más seguro que publicar una imagen con un usuario pi y password genérico. Me ahorro instalar más cosas a la rasp (lightdm, etc) y me ahorro pelearme con los permisos y grupos.

No es la opción más correcta, lo se, pero es la más fácil y más comoda para mi. no? xD

maxmalkav

#5546 no, es relativamente ligero y tiene pocas dependencias, ten en cuenta que se limita a dar paso a un entorno de escritorio u otro

Markitos_182

#5543 Con la opción 3 o 4 debería dejarte apagar el sistema. Es el método normal de arranque en OSMC o RaspBMC si no recuerdo mal.