Sudo como usuario diferente y pantalla de ejecución

167

¡Descubrí hoy que correr la pantalla como un usuario diferente en el que sudo no funcionará!

es decir

ssh bob@server         # ssh into server as bob
sudo su "monitor" -
screen                 # fails: Cannot open your terminal '/dev/pts/0'

Tengo un script que se ejecuta como el usuario "monitor". Lo ejecutamos en una sesión de pantalla para ver el resultado en la pantalla. El problema es que tenemos un número de usuarios que inician sesión con su propia cuenta (es decir, bob, james, susie, etc.) y luego ingresan al usuario "monitor". Darles acceso al usuario "monitor" está fuera de discusión.

Luckytaxi
fuente
13
¿Es este el error que estás recibiendo? "No se puede abrir su terminal '/ dev / pts / 0' - verifique".
Jim
Sí, ese es el. Entiendo por qué está sucediendo, pero ¿hay alguna solución?
luckytaxi
44
Un comentario sobre tus comandos: sigo viendo gente corriendo sudo su "user" -. ¿Por qué no usar sudo -u user -s?
Andrew Aylett
2
@ Jim: +1 por proporcionar el mensaje de error que falta.
Dennis Williamson
1
@ Andrew La mayoría de los chicos que conozco lo hacen sudo su, creo que es justo a lo que la gente se acostumbra (en mi caso es porque no necesitas saber ninguna bandera de sudo sudo su, no creo que haya leído la página de manual de sudo :)
voretaq7

Respuestas:

246

Intente correr script /dev/nullcomo el usuario que sudesea antes de iniciar la pantalla: es un pequeño truco de ghetto, pero debería alegrar la pantalla.

voretaq7
fuente
55
Re: implicaciones de seguridad, ninguna que conozco (pero eso no significa que no haya ninguna :) - IIRC esto se basa en un efecto secundario de "script" que abre un nuevo dispositivo terminal (como lo invoca el usuario) , y como está enviando la salida del script a / dev / null, no hay nada que capturar. También es definitivamente más seguro que la adición de usuarios al grupo TTY (en mi humilde opinión)
voretaq7
2
@nally Francamente, no deberías encontrar confusos múltiples shells si eres un administrador del sistema Unix; dicho esto, scriptse puede usar para iniciar screen. Entonces solo tiene que salir dos veces (una vez screen, una vez su). (Esto es algo que la scriptpágina del manual puede aclararle, si se toma el tiempo de leerlo ...)
voretaq7
10
O simplemente correr sudo -u bob script -q -c 'screen -dr myscreen' /dev/null. Entonces solo tiene una terminal para salir / desconectarse.
Andy Shulman el
44
Gracias, esto me salvó. Pero, ¿por qué esto lo arregla? Por lo que entiendo, imprime todo, desde stdout hasta ... en ninguna parte. Y eso de alguna manera corrige la pantalla.
sudo
3
@sudo Para hacer lo suyo, scriptabre su propio dispositivo tty, propiedad del usuario que lo ejecutó (mire /devy verá que aparece después de ejecutar script). screenluego toma ese dispositivo tty (que es propiedad del usuario que ejecuta screenpara que no tenga problemas para acceder a él). Es un trabajo de pirateo total, pero funciona. Al observar algunas de mis máquinas, parece que las nuevas versiones de pantalla parecen instalar setuid-root, que también funciona, pero significa que tiene otro binario setuid-root flotando, lo que hace que algunas personas se sientan incómodas.
voretaq7
33

Estoy usando una función de contenedor screenpara los usuarios que debo usar sudo su. Esta es la función de contenedor que he agregado a los usuarios ~/.bashrc:

pantalla de función () {
  / usr / bin / script -q -c "/ usr / bin / screen $ {*}" / dev / null
}

Esto me permite usar todas las opciones y parámetros para los screenque me gustaría usar. Estoy pensando en poner esta función en todo el sistema.

steviethecat
fuente
1
Funciona perfectamente. Para aquellos que deseen este sistema, recomiendo agregar esto a /etc/bash.bashrc, funciona en todos los usuarios.
Someguy123
2
Esto no citará argumentos para seleccionar correctamente, de lo contrario es una buena solución.
augurar el
7

Suponiendo que de todos modos están SSHing en el host, puede agregar las claves ssh públicas para cada usuario que necesite acceso a la cuenta del monitor en el archivo ~ monitor / .ssh / Authorizedkeys. Luego, en la máquina remota de cada usuario, pueden ejecutar

ssh -t [email protected] screen -RD

Alex
fuente
Este es otro buen enfoque: sin embargo, tendría que especificar comandos forzados en el archivo de claves autorizado (según la nota anterior de Luckytaxi "darles acceso al usuario 'monitor' está fuera de cuestión": los comandos forzados podrían limitarlos a solo adjuntando la sesión de pantalla)
voretaq7
2
No estaba seguro de cómo abordar eso en mi respuesta, porque dijo que "darles acceso ... está fuera de discusión", pero también dijo "... sudoden en el usuario 'monitor'". Pero estoy de acuerdo, forzar la restricción del comando en las claves autorizadas debería ocuparse de eso.
Alex
7

Suponiendo que estemos hablando de este error:

$ sudo su - bob
$ screen
Cannot open your terminal '/dev/pts/5' - please check.

Aquí hay una frase (podría usarse como "alias gobob", por ejemplo):

sudo su - bob -c "script -c bash /dev/null"'

Explicación:

Esto iniciará un shell (como el shell de inicio de sesión) como usuario bob. Se inicia el usuario bob script, que le dice que invoque un bash (podría ser guión o ksh ...) y se tira una copia de la sesión.

básico6
fuente
0

Probablemente tendría que cambiar los permisos en el dispositivo en cuestión o agregar un monitor a un grupo que tenga permiso para leer ese dispositivo, esa sería mi primera inclinación. Pero tendría que sopesar las implicaciones de seguridad de hacerlo.

Bart Silverstrim
fuente
0

Dices que lo haces:

sudo su "monitor" -

Me pregunto sobre el guión final. Yo suelo hacer:

sudo su - username

El guión (según la página de manual de su) le dice a su que "convierta el shell en un shell de inicio de sesión". Esto significa que obtendrá todos los scripts de inicio de shell habituales y establecerá cosas como PATH y HOME correctamente.

Doug Harris
fuente
3
No. sudo su - usernamey sudo su username -hacer lo mismo
Tim Ludwinski
-4

Acabo de golpear este problema. Lo resolvió chmod +rw $(tty)antes de ejecutar sudo. El problema con esta solución es que cualquiera puede conectarse y espiar en su terminal después de eso.

Amos Shapira
fuente
2
Suena como una gran solución.
Evan Carroll
10
@EvanCarroll Es una gran solución, excepto la parte en la que le da al mundo entero acceso de lectura y escritura a su terminal. Solo un problema de seguridad menor: ningún programa se preocuparía por eso, excepto, por supuesto, cualquier cosa que verifique la seguridad del terminal antes de aceptar contraseñas ( gpgpor ejemplo). Y seguramente nunca estará en un sistema con usuarios malintencionados que tty
mirarían
Ten cuidado : ¡nunca intentes esto en casa! ¡¡¡Esto es peligroso!!!
ruizpauker