Arrêter la connexion SSH de l’impression motd à partir du client?

44

SSH est configuré sans mot de passe, mais il imprime le MoTD lorsqu'il se connecte. Est-il possible d'empêcher que cela se produise côté client?

J'ai essayé ssh -qmais ça ne marche pas. Je ne veux pas utiliser ~/.hushloginet je ne veux pas changer la configuration du serveur. La seule chose qui peut fonctionner est de calmer toutes les sorties, avec >/dev/null 2>&1. Cependant, je ne veux pas ignorer les erreurs au cas où il y aurait un problème. Même faire >/dev/nullne fonctionne pas, car sshsemble imprimer le motd au stderr.

Mise à jour et raisonnement J'effectue une sauvegarde dans un cron. Je ne veux pas recevoir d'email cron sauf si une erreur est survenue. Cependant, si le motd est imprimé, je recevrai tout le temps un courrier électronique.

Je veux garder le motd en cours d’impression car cela a des implications juridiques. Le motd dit "accès non autorisé interdit". Vous devez disposer de ce type de déclaration afin d'empêcher légalement les personnes d'y accéder (comme un panneau interdisant l'intrusion). Par conséquent, je ne veux pas masquer le désactiver tout le temps.

Rory
la source
1
Pouvez-vous ajouter quelques détails sur le travail cron ...
Kyle Brandt
1
Le motd n'est imprimé que pour les sessions interactives. Je viens de le tester, et il en est ainsi:> hôte $ ssh → MOTD imprimé> hôte $ ssh ls → imprime uniquement le contenu du répertoire de base. En d'autres termes, vous faites quelque chose de très mauvais; avez-vous même essayé?
niXar
Il est également intéressant de noter l’archivage /etc/profile.dde tous les scripts pouvant s’y exécuter et d’imprimer une sortie sur la console lors de la connexion.
Dave
4
Existe-t-il vraiment une loi qui vous oblige à dire "accès non autorisé interdit"? Je pensais que le DMCA rend illégal toute tentative de casser tout type de système électronique ( peu importe le degré de protection ), aussi longtemps que vous avez une sorte d’exigence de mot de passe / clé SSH, cela ressemble à du pur habillage de fenêtre.
Nick T

Réponses:

58

Je ne sais pas pourquoi vous avez une aversion à le faire correctement - soit sur le serveur à la

PrintMotd no
PrintLastLog no

et

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

Ou en ajoutant ~ / .hushlogin pour chaque utilisateur.

Astuce, pour ~ / .hushlogin, ajoutez-le à / etc / skel afin que de nouveaux répertoires personnels d’utilisateur soient créés avec le fichier.

Mise à jour:

Sans plus d'informations sur votre tâche cron de sauvegarde, ma seule autre suggestion est de rediriger le résultat de la commande vers un fichier (ou de le laisser capturer par courrier électronique) et le résultat de la session ssh vers / dev / null. Quelque chose comme:

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

Ou

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

Il faudrait que je joue un peu avec les commandes, mais cela devrait vous aider à démarrer.

jtimberman
la source
3
J'aime le "faire correctement".
Benoit
14
Je ne souhaite pas le supprimer du serveur car je dois conserver un avis d'interdiction d'accès autorisé pour des raisons juridiques.
Rory
3
Fwiw, la notification n’empêche pas les accès non autorisés, elle indique simplement aux personnes que vous pouvez (et devez) prendre les mesures juridiques appropriées et peut-être surveiller leur utilisation, tout comme une notification concernant l’enregistrement d’une conversation téléphonique.
jtimberman
En outre, il serait très utile que vous colliez le travail cron que vous utilisez.
jtimberman
3
.hushloginis nice
andrewtweber
16

Si vous le souhaitez, utilisateur par utilisateur, faites-en un touch ~/.hushloginet vous êtes prêt avec OpenSSH.

Mise à jour : comme indiqué ailleurs, pam_motdpeut être configuré pour ne pas utiliser un utilisateur spécifique .hushlogin; vérifier /etc/login.defspour HUSHLOGIN_FILE. Il peut être configuré pour que tous les utilisateurs soient répertoriés /etc/hushloginsou similaires.

vers
la source
2
J'ai essayé ça, mais ça n'a pas marché. Comme d'autres l'ont fait remarquer, le motd pourrait être imprimé à partir de pam
Rory
11

@note Tous les exemples supposent que vous ayez défini une variable connectionStringavec quelque chose comme connectionString=user@server.

Comment je suis arrivé à la solution

Utiliser ssh -Tdevrait fonctionner pour des commandes simples. Par exemple, cela n’affiche aucune information supplémentaire:

ssh -T $connectionString "echo 'blah'"

Le problème est lorsque vous essayez d'utiliser here-doc pour exécuter de nombreuses commandes. Par exemple - ci-dessous ne fonctionnera PAS - cela fera écho au message du jour (MoTD) et pourrait également vous montrer "stdin: n'est pas un tty".

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

Pour résoudre le problème, vous devez d’abord enregistrer les commandes dans une variable locale, puis les envoyer au serveur distant.

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

Mais c'est désordonné ...

Solution finale

Créez une fonction universelle (notez qu’elle peut prendre une chaîne ou HEREDOC comme commandes).

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

Exemples

Utilisez ceci comme suit:

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

Ou comme si:

silentSsh $connectionString "echo 'blah'"

Ou comme si:

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

Ou même comme ça:

silentSsh $connectionString < getlines.sh
Nux
la source
J'aimerais avoir plus de votes positifs pour cela. Très utile pour comprendre certains scripts sur-ssh que nous devions faire.
Csexton
Réponse fantastique !! Merci beaucoup!!
Scottie H
10

Que diriez-vous de ce hack? ;-P

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

Ce qui suit n'est pas valide:

Passer -Tà ssh pour désactiver l’allocation de tty:

ssh -T machineName 'echo foo'
Kyle Brandt
la source
3
ssh utilisateur @ machine 'votre commande ici' ne montre pas le motd de toute façon (ce n'est pas un shell interactif).
Marie Fischer
Oh bien, point ....
Kyle Brandt
mais ce que cela signifie "ce n'est pas un shell interactif" puisque j'ai essayé et que je peux exécuter des commandes, que me manque-t-il avec-t
Ciasto piekarz le
veuillez noter que l'ajout de "-t" modifie le comportement (il s'affiche en fonction de vos paramètres TERM, ajoute des caractères de contrôle si nécessaire, etc.). Cela peut changer le résultat de certaines commandes (cela pourrait par exemple introduire des erreurs dans: ssh -t somehost "tar cf - quelques fichiers"> local.tar # NE PAS utiliser -t ici ... surtout si vous ssh un hôte Unix depuis un windows one., mais beaucoup d'autres problèmes peuvent survenir dans d'autres cas). Voir la réponse merveilleuse de @StephaneChazelas: unix.stackexchange.com/questions/151916/…
Olivier Dulac le
3

Quel est le système d'exploitation? Sur certains systèmes (comme Ubuntu), le motd n'est pas imprimé par le serveur ssh (PrintMotd dans / etc / ssh / sshd_config), mais par pam avec pam_motd. Si tel est le cas, vous ne pourrez probablement pas le contrôler depuis le client.

theotherreceive
la source
vous ne pouvez pas le contrôler dans le client ssh, mais vous pouvez à coup sûr du côté client :) .. voir ma réponse pour plus de détails
drAlberT
Non, vous avez proposé un hack assez intéressant / intelligent autour du motd en cours d’impression, pas une solution pour empêcher son impression par le client, telle était la question.
theotherreceive
2

Vous devez le faire sur le serveur:

PrintMotd no
PrintLastLog no

Sur debian / ubtuntu, hachez également la ligne avec pam_motd.so:

#/etc/pam.d/ssh
# Print the message of the day upon successful login.
# session    optional     pam_motd.so
ThorstenS
la source
Non tu ne le fais pas. Voir la réponse de Kyle Brandt ci-dessous.
Stobor
-1 - La réponse ne reflète pas la question modifiée. N'est plus pertinent.
Romandas
2

N'exécutez pas la commande ssh directement par cron.

Créez à la place un script d'aide bash , exécutant le travail ssh et récupérant la sortie, les erreurs et le code d'erreur si nécessaire; éventuellement les analyser afin de supprimer les chaînes non désirées des messages d'erreur (le MoTD dans votre cas), puis réimprimez sur la sortie du script bash et l'erreur diffuse ce que vous avez obtenu de cette manière.

Alors mettez ce script bash dans cron et vivez heureux :)

Note: Ceci est une solution générale, et doit travailler quel que soit le travail que vous devez effectuer via ssh. C’est uniquement le côté client également, ce qui devrait répondre à vos besoins ... la seule dépendance du client vis-à-vis de la configuration du serveur est la connaissance du message exact que vous voulez supprimer de la commande std err ou du client ssh

drAlberT
la source
2
Ce n'est pas une solution qui est une solution de contournement.
niXar
Je ne peux pas être d'accord avec toi désolé. IMHO c'est la façon dont les choses devraient être faites proprement ... J'étais d'accord avec vous s'il y avait un moyen de configurer explicitement le client ssh pour qu'il ignore le motd, mais cela ne peut pas exister, tout simplement parce qu'il n'est pas sous le contrôle de sshd !
drAlberT
2

Juste une note de bas de page (cela aurait été un commentaire, si je pouvais poster ça): Le contenu de motd est affiché après une connexion réussie au système. Si je veux empêcher légalement les gens d'accéder à une boîte, je préférerais le faire avec une "bannière" dans sshd_config. Le contenu est affiché après la saisie du nom d'utilisateur mais avant l'authentification.


la source
4
oui, mais vous pouvez désactiver la bannière à l'aide de -q sur le client ssh, je ne peux donc pas accepter votre note
drAlberT
1
Oh, je le vois bien, "-q" défaisant toute la défense de l'équipe juridique spécialisée dans le crack, travaillant pour Dynacorp Inc. Mon dieu! Ils ne l'avaient pas vu venir. Obtenez réel. Si quelqu'un qui est censé voir la bannière l'évite délibérément ... la bannière est toujours contraignante, car vous deviez le savoir pour l'éviter.
niXar
2

Soit vous n’avez pas essayé ce que vous décrivez, soit vos serveurs sont mal configurés!

Voici ce que je viens d'essayer sur 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 ~ $ 

Je suppose que vous n'avez pas besoin que l'avertissement soit envoyé aux shells non interactifs, n'est-ce pas? (Si quelqu'un prétend le faire, faites-moi une faveur, donnez-lui un coup de pied.) C'est précisément la raison pour laquelle il existe une distinction entre les coquilles interactives et les coquilles non interactives.

Mais dans tous les cas, voici ce que je fais parce que je n'aime pas le courrier de cron: je dirige la sortie vers le consignateur. Il suffit de le glisser dans la queue pour supprimer les premières lignes (disons 3) de votre clause de non-responsabilité en tant que telle (code non testé, je n’ai pas accès à mes scripts):

( tail -n +3 | logger -i -t mycronjob -s -p cron.crit ) <&6 &
exec 2>&6
cron_fsckin_job
niXar
la source
Si vous regardez dans man sshd, vous verrez qu'il est écrit: PROCESSUS DE CONNEXION Lorsqu'un utilisateur se connecte avec succès, sshd procède comme suit: 1. Si la connexion est établie sur un terminal et qu'aucune commande n'a été spécifiée, affiche l'heure de la dernière connexion. et / etc / motd (sauf si empêché par le fichier de configuration ou par ~ / .hushlogin; voir la section FILES). 2. ... Notez que si une commande est entrée répertoire dans le login SSH, aucun MOTD n'est affiché
katriel
Je sais, c'est ce que je démontrais. À quoi veux-tu en venir?
NiXar
1

Si je vous comprends bien, vous avez besoin de motd pour d'autres raisons, mais vous n'avez pas besoin de motd pour la sauvegarde. Dans la configuration de sshd, vous ne pouvez pas le configurer par utilisateur, mais globalement. Par conséquent, vous devez résoudre la suppression motd du côté client. Mais il n'y a pas de différence entre le texte de motd et les messages d'erreur du logiciel de sauvegarde. Les deux sont du texte dans le terminal. La seule solution que je vois pour faire la différence entre ces deux messages filtre ensuite celui de motd. Comme les messages du logiciel sont difficiles à modifier, je suggère de modifier le texte de motd. Par exemple, mettez un cadre autour de:

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

motd message

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

Ensuite, vous devriez filtrer le texte entre le cadre et le déposer.

Saabi
la source
1

SOLUTION ICI:

Si vous n'êtes pas en charge du serveur et que vous ne pouvez pas modifier motd ou sshd config, utilisez la commande suivante:

Réorientez STDERR vers STDOUT pour une ou plusieurs commandes distantes afin de pouvoir le voir. Et redirigez ensuite STDERR of ssh vers / dev / null. MOTD va à STERR et se termine dans / dev / null. Tout message d'erreur AND standard de la commande à distance sera affiché (comme il est envoyé à STDOUT)

Variante 1 - si vous vous souciez de l'état de sortie de la commande exécutée à distance:

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 vous voulez ignorer le code de sortie de la commande distante - exécutez simplement true comme dernière commande distante

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

Exemples de messages d'erreur:

Exemple 1:

ssh remotehost " failed_ remote_command 2> & 1" 2> / dev / null || echo La connexion SSH a échoué ou la commande à distance a renvoyé un code de sortie différent de zéro.
 bash: failed_remote_command: commande introuvable
Échec de la connexion ou de la commande à distance SSH - l'un ou l'autre a renvoyé un code de sortie autre que zéro 127

Exemple 2:

ssh remotehost " failed_ remote_command 2> & 1; true " 2> / dev / null || echo connexion SSH a échoué
 bash: failed_remote_command: commande introuvable

Exemple 3a:

ssh remotehost " failed_ remote_command 2> & 1; true" 2> / dev / null || echo connexion SSH a échoué
 # aucun message n'est affiché

Exemple 3b:

ssh nonexistinghost " failed_ remote_command 2> & 1; true" 2> / dev / null || echo SSH connection failed La
 connexion SSH a échoué
Chris
la source
0

Avez-vous essayé de supprimer le texte dans le fichier motd? Juste une pensée.

Hint: /etc/motd
Joseph Kern
la source
4
Il a dit du côté client, du paramètre serveur PrintMotd à non dans sshd_config serait probablement mieux
Kyle Brandt
0

Qu'essayez-vous de faire et pourquoi le ministère des Transports vous dérange-t-il? Je devine en train d'exécuter une commande à distance et d'analyser la sortie? Si tel est le cas, cela peut être effectué de différentes manières sans invoquer un shell interactif (ce qui entraîne l'affichage du motd).

Marie Fischer
la source
Oh, comme? Je préférerais vraiment utiliser la pensée ssh ..
Rory Le