¿Detener ssh login de imprimir motd desde el cliente?


44

Tengo una configuración SSH sin contraseña, sin embargo, imprime el MoTD cuando inicia sesión. ¿Hay alguna forma de evitar que eso suceda desde el lado del cliente?

Lo he intentado ssh -qpero eso no funciona. No quiero usar ~/.hushloginni quiero cambiar la configuración del servidor. Lo único que puede funcionar es silenciar toda la salida, con >/dev/null 2>&1. Sin embargo, no quiero ignorar los errores en caso de que realmente haya un problema. Incluso hacer >/dev/nullno funciona, ya que sshparece imprimir el motd en el stderr.

Actualización y razonamiento Estoy ejecutando copia de seguridad en un cron. No quiero recibir un correo electrónico cron a menos que se haya producido un error. Sin embargo, si se imprime el motd, recibiré un correo electrónico todo el tiempo.

Quiero que se imprima el motd porque eso tiene implicaciones legales. La motd dice "acceso no autorizado prohibido". Debe tener este tipo de declaración para evitar legalmente que las personas accedan a ella (como un letrero de no traspaso). Por lo tanto, no quiero deshabilitarlo todo el tiempo.


1
Se puede añadir algunos detalles acerca de la tarea cron ...
Kyle Brandt

1
El motd solo se imprime para sesiones interactivas. Lo acabo de probar y es así:> $ ssh host → MOTD impreso> $ ssh host ls → imprime solo el contenido del directorio de inicio. En otras palabras, está haciendo algo muy mal; ¿lo has intentado?
niXar

También vale la pena señalar si /etc/profile.dhay secuencias de comandos que puedan ejecutarse allí e imprimir algunos resultados en la consola al iniciar sesión.
Dave

44
¿Existe realmente una ley que requiera que usted diga "acceso no autorizado prohibido"? Pensé que la DMCA hace que sea ilegal romper cualquier tipo de sistema electrónico ( no importa cuán mal esté protegido ), por lo tanto, siempre que tenga algún tipo de requisito de contraseña / clave SSH, esto parece un simple escaparate.
Nick T

Respuestas:


58

No estoy seguro de por qué tienes aversión a hacer esto correctamente, ya sea en el servidor a la

PrintMotd no
PrintLastLog no

y

#/etc/pam.d/ssh
# Print the message of the day upon successful login.
# session    optional     pam_motd.so

O agregando ~ / .hushlogin para cada usuario.

Sugerencia, para ~ / .hushlogin, agréguelo a / etc / skel para que se creen nuevos directorios de inicio de usuario con el archivo.

Actualizar:

Sin más información sobre su trabajo cron de respaldo, mi única otra sugerencia es redirigir la salida del comando a un archivo (o dejar que cron lo capture en el correo electrónico) y la salida de la sesión ssh a / dev / null. Algo como:

0 0 * * * ssh backuphost "backup_script_that_writes_to_a_log" >/dev/null

O

0 0 * * * ssh backuphost "backup_command 2>&1" >/dev/null

Tendría que jugar un poco con los comandos, pero eso debería ayudarlo a comenzar.


3
Me gusta el "hacer correctamente".
Benoit el

14
No quiero eliminarlo del servidor ya que necesito mantener un aviso de "acceso autorizado prohibido" por razones legales.
Rory el

3
Además, el aviso no impide el acceso no autorizado, simplemente notifica a las personas que usted puede (y tomará) las acciones legales apropiadas, y puede estar monitoreando su uso, al igual que la notificación sobre la grabación de una conversación telefónica.
jtimberman

Además, sería de gran ayuda si pegaras el trabajo cron que estás usando.
jtimberman

3
.hushlogines agradable
andrewtweber

16

Si desea esto por usuario, simplemente haga una touch ~/.hushloginy ya está todo listo con OpenSSH.

Actualización : como se señaló en otra parte, pam_motdse puede configurar para que no use un usuario .hushlogin; comprobar /etc/login.defspara HUSHLOGIN_FILE. Se puede configurar para tener a todos los usuarios enumerados /etc/hushloginso similares.


2
Lo intenté, pero no funcionó. Como otros han señalado, el motd podría imprimirse desde pam
Rory

11

@note Todos los ejemplos suponen que ha establecido una variable connectionStringcon algo así connectionString=user@server.

Como llegué a la solución

Usar ssh -Tdebería funcionar para comandos simples. Por ejemplo, esto no imprime ninguna información adicional:

ssh -T $connectionString "echo 'blah'"

El problema es cuando intentas usar here-doc para ejecutar muchos comandos. Por ejemplo, abajo NO funcionará, hará eco del mensaje del día (MoTD) y también podría mostrarle "stdin: no es un tty".

somethingLocal='something local'
ssh -T $connectionString <<EOC
    echo 'blah'
    echo "blah $somethingLocal"
EOC

Para solucionar el problema, primero debe guardar los comandos en la variable local y luego enviarlos al servidor remoto.

somethingLocal='something local'
read -r -d '' commands <<EOC
    echo 'blah'
    echo "blah $somethingLocal"
EOC
ssh -T $connectionString "$commands"

Pero eso es desordenado ...

Solución final

Haga una función universal (tenga en cuenta que puede tomar una cadena o HEREDOC como comandos).

function silentSsh {
    local connectionString="$1"
    local commands="$2"
    if [ -z "$commands" ]; then
        commands=`cat`
    fi
    ssh -T $connectionString "$commands"
}

Ejemplos

Use esto así:

somethingLocal='something local'
silentSsh $connectionString <<EOC
    echo 'blah'
    echo "blah $somethingLocal"
EOC

O así:

silentSsh $connectionString "echo 'blah'"

O así:

silentSsh $connectionString <<'EOC'
    echo 'blah'
    somethingRemote=`echo 'whatever'`
    echo "blah $somethingRemote"
EOC

O incluso así:

silentSsh $connectionString < getlines.sh

Desearía tener más votos a favor para esto. Muy útil para descubrir algunas secuencias de comandos over-ssh que necesitábamos hacer.
csexton

Fantástica respuesta !! ¡¡Muchas gracias!!
Scottie H

10

¿Qué tal este truco? ;-PAGS

ssh -t user@machineName '/bin/bash'

Lo siguiente no es válido:

Pasando -Ta ssh para deshabilitar la asignación de tty:

ssh -T machineName 'echo foo'

3
ssh user @ machine 'su comando aquí' no muestra el motd de todos modos (no es un shell interactivo).
Marie Fischer el

Oh bueno, punto ....
Kyle Brandt

pero lo que significa que "no es un shell interactivo", ya que he intentado y puedo ejecutar comandos ¿qué estaría usando faltante-t
ciasto Piekarz

tenga en cuenta que agregar "-t" cambia el comportamiento (se muestra de acuerdo con la configuración de TERM, agrega caracteres de control cuando sea necesario, etc.). Puede cambiar el resultado de algunos comandos (podría, por ejemplo, introducir errores en: ssh -t somehost "tar cf - algunos archivos"> local.tar # NO use -t aquí ... especialmente si ssh es un host unix de uno de Windows, pero pueden surgir muchos otros problemas en otros casos). Vea la maravillosa respuesta de @StephaneChazelas: unix.stackexchange.com/questions/151916/…
Olivier Dulac

3

¿Qué sistema operativo es este? En algunos sistemas (como ubuntu) el servidor ssh no imprime el motd (PrintMotd en / etc / ssh / sshd_config), sino mediante pam con pam_motd. Si este es el caso, entonces probablemente no pueda controlarlo desde el cliente.


no puede controlarlo en el cliente ssh, pero puede estar seguro del lado del cliente :) .. vea mi respuesta para más detalles
drAlberT

No, usted ha propuesto un truco bastante interesante / inteligente alrededor del motivo que se está imprimiendo, no una solución para evitar que el cliente lo imprima, esa fue la pregunta.
theotherrecibido el

2

Tienes que hacerlo en el servidor:

PrintMotd no
PrintLastLog no

En debian / ubtuntu también hash la línea con pam_motd.so:

#/etc/pam.d/ssh
# Print the message of the day upon successful login.
# session    optional     pam_motd.so

No, no lo haces. Vea la respuesta de Kyle Brandt a continuación.
Stobor

-1 - La respuesta no refleja la pregunta editada. Ya no es relevante.
romandas

2

No ejecute el comando ssh directamente por cron.

Cree un script bash auxiliar en su lugar, ejecute el trabajo ssh y obtenga la salida, los errores y el código de error si es necesario; finalmente, analícelos para eliminar cadenas no deseadas de los mensajes de error (el MoTD en su caso) y luego vuelva a imprimir en la salida del script bash y las secuencias de error que haya obtenido de esa manera.

Que poner este script bash en cron y vivir feliz :)

Nota: Esta es una solución general y tiene que funcionar sea cual sea el trabajo que debe realizar a través de ssh. También es solo del lado del cliente, lo que debe satisfacer sus necesidades ... la única dependencia del cliente en la configuración del servidor es el conocimiento del mensaje exacto que desea cortar del std err o del cliente ssh


2
Esa no es una solución, es una solución alternativa.
niXar

No puedo estar de acuerdo contigo, lo siento. En mi humilde opinión, esa es la forma en que las cosas deben hacerse limpiamente ... Estuve de acuerdo con usted si hubiera una forma de configurar explícitamente el cliente ssh para ignorar el motd, pero no puede existir, simplemente porque no está bajo el control sshd !
drAlberT

2

Solo una nota al margen (habría sido un comentario, si pudiera publicar eso): el contenido de motd se muestra después de iniciar sesión con éxito en el sistema. Si quisiera evitar legalmente que las personas accedan a un cuadro, prefiero hacerlo con un "Banner" en sshd_config. El contenido se muestra después de ingresar el Nombre de usuario pero antes de la autenticación.


44
Sí, pero se puede desactivar el uso de la bandera -q en el cliente ssh, así que no puedo estar de acuerdo con su nota
drAlberT

1
Oh chico, puedo verlo totalmente, "-q" derrotando a toda la defensa del equipo legal de crack que trabaja para Dynacorp Inc. ¡Cielos! No lo habían visto venir. Ser realistas. Si alguien que se supone que ve la pancarta lo evade a propósito ... la pancarta sigue siendo vinculante, ya que tenía que saberlo para evadirla.
niXar

2

¡O no has probado lo que estás describiendo, o tus servidores están configurados incorrectamente!

Esto es lo que acabo de probar en RHEL5:

workstation ~ $ ssh root@server
server ~ # echo "MOTD" > /etc/motd
server ~ # ^D
workstation ~ $ ssh root@server
MOTD
server ~ # ^D
workstation ~ $ ssh root@server echo notice the lack of motd
notice the lack of motd
workstation ~ $ 

Supongo que no necesita que se envíe el descargo de responsabilidad a los shells no interactivos, ¿verdad? (Si alguien dice que sí, hágame un favor, déjelos en paz). Porque es exactamente por eso que hay una distinción entre shells interactivos y no interactivos.

Pero en cualquier caso, esto es lo que hago porque no me gusta el correo de cron: canalizo la salida al registrador. Simplemente colóquelo a través de la cola para eliminar las primeras líneas (digamos 3) de su descargo de responsabilidad sin sentido como tal (código no probado, no tengo acceso a mis scripts):

( tail -n +3 | logger -i -t mycronjob -s -p cron.crit ) <&6 &
exec 2>&6
cron_fsckin_job

Si observa man sshd, verá que dice: PROCESO DE INICIO DE SESIÓN Cuando un usuario inicia sesión con éxito, sshd hace lo siguiente: 1. Si el inicio de sesión está en un tty y no se ha especificado ningún comando, imprime el último tiempo de inicio de sesión y / etc / motd (a menos que se evite en el archivo de configuración o por ~ / .hushlogin; consulte la sección ARCHIVOS). 2. ... Observe que si se ingresa un comando en el directorio en el inicio de sesión ssh, no se muestra MOTD
katriel

Lo sé, eso es lo que estaba demostrando. ¿Cual es tu punto?
niXar

1

Si te entiendo, necesitas motd por otras razones, pero no necesitas motd como respaldo. En la configuración de sshd no se puede configurar por usuario solo globalmente. Por lo tanto, necesita resolver la supresión de motd en el lado del cliente. Pero no hay diferencia entre el texto de motd y los mensajes de error del software de respaldo. Ambos son texto en la terminal. La única solución que veo para marcar la diferencia entre estos dos mensajes es filtrar el mensaje de Motd. Debido a que los mensajes de software son difíciles de modificar, sugiero modificar el texto de motd. Por ejemplo, ponga un marco alrededor:

*** BEGIN message from the machine room ***

motd message

*** END message from the machine room ***

Luego, debe filtrar el texto entre el marco y soltarlo.


1

SOLUCIÓN AQUÍ:

En caso de que no esté a cargo del servidor y no pueda cambiar la configuración de motd o sshd, use un comando como el siguiente:

Redireccione STDERR a STDOUT para comando (s) remoto (s) para que lo vea. Y luego redirija STDERR de ssh a / dev / null. MOTD va a STERR y termina en / dev / null. Se mostrará cualquier mensaje estándar Y de error del comando remoto (a medida que va a STDOUT)

Variante 1: si le importa el estado de salida del comando ejecutado de forma remota:

ssh remotehost "(remote_command1 && remote_command2; remote_command3) 2>&1" 2>/dev/null || echo SSH connection or remote command failed - either of them returned non-zero exit code $?

Variante 2: si desea ignorar el código de salida del comando remoto, simplemente ejecute true como el último comando remoto

ssh remotehost "(remote_command; true) 2>&1" 2>/dev/null || echo SSH connection failed

Ejemplos de mensajes de error:

Ejemplo 1:

ssh remotehost " fail_ remote_command 2> & 1" 2> / dev / null || echo La conexión SSH falló o el comando remoto devolvió un código de salida distinto de cero
 bash: failure_remote_command: comando no encontrado
La conexión SSH o el comando remoto fallaron: cualquiera de ellos devolvió el código de salida no cero 127

Ejemplo 2

ssh remotehost " fail_ remote_command 2> & 1; true " 2> / dev / null || echo Conexión SSH fallida
 bash: fail_remote_command: comando no encontrado

Ejemplo 3a:

ssh remotehost " fail_ remote_command 2> & 1; true" 2> / dev / null || echo SSH falló la conexión
 # no se muestra ningún mensaje

Ejemplo 3b:

ssh nonexistinghost " failure_ remote_command 2> & 1; true" 2> / dev / null || echo La conexión
 SSH falló La conexión SSH falló

0

¿Has intentado eliminar el texto en el archivo motd? Solo un pensamiento.

Hint: /etc/motd

44
Dijo que desde el lado del cliente, desde el lado del servidor establecer PrintMotd en no en sshd_config, probablemente sería mejor
Kyle Brandt

0

¿Qué estás tratando de hacer y por qué te molesta el MoTD? ¿Supongo que ejecutar un comando remoto y analizar la salida? Si es así, esto podría hacerse de varias maneras sin invocar un shell interactivo (lo que hace que se muestre el motd).


Oh, como? Realmente preferiría usar ssh pensamiento ..
Rory

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.