Sshrc fait planter sftp et scp

bonjour
Sur un VPS géré avec Yunohost et DEBIAN 9 à jour, j’ai un soucis avec le fichier sshrc
Dès que j’en crée un sur le serveur (/etc/shh/sshrc), cela fonctionne bien (il sert à me notifier les éventuelles connexions ssh ; cf https://cbiot.fr/dokuwiki/doku.php?id=ssh-fail2ban#avoir_un_rapport_de_connexion_ssh ) pour l’accès ssh mais les accès sftp et scp sont bloqués…
(j’ai lu des choses similaires sur la présence de ce fichier sur le web mais pas de réelles solutions)
Auriez vous des idées ? D’avance merci

Bonjour,

Je crois avoir saisi le problème.

Ton fichier /etc/ssh/sshrc doit produire une sortie standard.
Et cela empêche sftp et scp de fonctionner ; d’établir la connexion.

Pourrais-tu nous fournir ton fichier /etc/ssh/sshrc ?

Il n’y a aucun message ?


Encore une fois, aucun script RC n’est autorisé à produire une sortie sur stdout lors de l’utilisation de SFTP, sinon cela ruinerait la connexion. Si un script RC produit une sortie, il doit être redirigé vers un journal système, dans un fichier ou envoyé à stderr au lieu de stdout. Les connexions SSH interactives classiques ne sont pas perturbées par l’utilisation de stdout et le client n’affiche que ce qui est envoyé.
Voir la page de manuel de sshd (8) dans la section “SSHRC” pour plus d’informations.

https://en.wikibooks.org/wiki/OpenSSH/Logging_and_Troubleshooting#Debugging_RC_Scripts_Interfering_with_SFTP_Sessions

Merci de ta réponse :wink:
Alors voilà le fichier sshrc

$ cat /etc/ssh/sshrc
#!/bin/sh
. /home/admin/scripts/send-notification.sh

Et le fichier send-notification.sh : on peut le trouver là : https://cbiot.fr/dokuwiki/doku.php?id=ssh-fail2ban#avoir_un_rapport_de_connexion_ssh

Le send-notification.sh comporte des commandes avec une sortie standard.
ainsi qu’un appel à .freemobile-smsapi qui peut également en comporter.

Je ne suis pas assez en forme pour tenter de l’adapter :sleeping: :hushed::roll_eyes:
@choops ferait probablement une bonne analyse du pb et peut-être une adaptation :sunglasses:

Tu peux tenter de modifier /etc/ssh/sshrc qui appelle le script send-notification.sh :
(sans garantie)

#!/bin/sh
. /home/admin/scripts/send-notification.sh > /dev/null

2019-07-21T09:41:00Z
Préservation de send-notification.sh et de send-notification-data.txt
https://cbiot.fr/dokuwiki/doku.php?id=ssh-fail2ban#avoir_un_rapport_de_connexion_ssh

send-notification.sh
#!/bin/sh
 
# Données utilisateur
. /home/admin/TOTO/send-notification-data.txt
 
# ========================================================
 
DATE=$(date "+%d.%m.%Y--%Hh%Mm")
IP=$(echo $SSH_CONNECTION | awk '{print $1}')
REVERSE=$(dig -x $IP +short)
MSG="Connexion de $(echo $USER) sur $(hostname -s)
IP: $IP
ReverseDNS: $REVERSE
Date: $DATE"
 
 
##
## La fonction d'envoi SMS
##
fctEnvoiSms() 
{
# Script d'envoi de notification SMS via l'API Free Mobile
# https://github.com/C-Duv/freemobile-smsapi-client
# Auteur:v
# modification crust@crust.ovh
 
readonly PROGNAME=$(basename $0)
readonly PROGDIR=$(readlink -m $(dirname $0))
 
usage_error () {
    echo "ERROR: ${1}" >&2
    echo ""
    usage_help
    exit 1
}
 
usage_help () {
    echo "Possible usages:"
    echo "* ${PROGNAME} [options] [message]"
    echo "* echo \"All your base are belong to us\" | ${PROGNAME} [options]"
    echo ""
    echo "Options:"
    echo "* -c file    specify configuration file"
    echo "* -h         display this help"
}
 
CONFIG_FILE=""
while getopts "c:h" option; do
    case "$option" in
        c) CONFIG_FILE=${OPTARG} ;;
        :) usage_error "Invalid arguments" ;;
        h) usage_help ; exit 0 ;;
    esac
done
shift $((OPTIND-1))
 
 
##
## Configuration système
##
 
# Caractère de fin de ligne
# (http://en.wikipedia.org/wiki/Percent-encoding#Character_data)
NEWLINE_CHAR="%0D" # Valeurs possibles : %0A, %0D et %0D%0A
 
# URL d'accès à l'API
SMSAPI_BASEURL="https://smsapi.free-mobile.fr"
 
# Action d'envoi de notification
SMSAPI_SEND_ACTION="sendmsg"
 
# Texte qui sera ajouté AVANT chaque message envoyé
MESSAGE_HEADER="$(date "+%d.%m.%Y--%Hh%Mm"):
"
 
# Texte qui sera ajouté APRÈS chaque message envoyé
MESSAGE_FOOTER="
--
$(hostname -s)"
 
 
##
## Fichier de configuration
##
 
if [ -n "${CONFIG_FILE}" ]; then
    if [ -e "${CONFIG_FILE}" ]; then
        . "${CONFIG_FILE}"
    else
        echo "ERROR: Configuration file \"${CONFIG_FILE}\" does not exists." >&2
        exit 2
    fi
else
    if [ -e "${PROGDIR}/.freemobile-smsapi" ]; then
        . "${PROGDIR}/.freemobile-smsapi"
    elif [ -e "${HOME}/.freemobile-smsapi" ]; then
        . "${HOME}/.freemobile-smsapi"
    fi
fi
 
 
##
## Vérifications des paramètres requis
##
 
if [ -z "${USER_LOGIN}" ] \
    || [ -z "${API_KEY}" ] \
    || [ -z "${SMSAPI_BASEURL}" ] \
    || [ -z "${SMSAPI_SEND_ACTION}" ] \
; then
    echo "ERROR: Either USER_LOGIN, API_KEY, SMSAPI_BASEURL or " \
         "SMSAPI_SEND_ACTION is not set" >&2
    exit 2
fi
 
 
##
## Traitement du message
##
 
MESSAGE_TO_SEND=""
if [ "${1}" ]; then # Message en tant qu'argument de la ligne de commande
    MESSAGE_TO_SEND="${1}"
else # Message lu de STDIN
    while read line
    do
        MESSAGE_TO_SEND="${MESSAGE_TO_SEND}${line}\n"
    done
    MESSAGE_TO_SEND=${MESSAGE_TO_SEND%"\n"} # Retire le dernier saut de ligne
fi
 
# Assemble header, message et footer
FINAL_MESSAGE_TO_SEND="${MESSAGE_HEADER}${MESSAGE_TO_SEND}${MESSAGE_FOOTER}"
 
##
## Appel à l'API (envoi)
##
 
# echo "Will send the following to ${USER_LOGIN}:" #DEBUG
# echo "${FINAL_MESSAGE_TO_SEND}" #DEBUG
 
# Converts newlines to $NEWLINE_CHAR
FINAL_MESSAGE_TO_SEND=$(\
    echo -n "${FINAL_MESSAGE_TO_SEND}" | \
    sed '{:q;N;s/\n/'${NEWLINE_CHAR}'/g;t q}'\
)
# echo "Newline encoded message:" #DEBUG
# echo "${FINAL_MESSAGE_TO_SEND}" #DEBUG
 
# Particularités de l'appel de curl et la/les options associées :
# * Renvoi le code réponse HTTP uniquement :
#       --write-out "%{http_code}" --silent --output /dev/null
#
HTTP_STATUS_CODE=$(\
    curl \
        --write-out "%{http_code}" \
        --silent \
        --output /dev/null \
        --get "${SMSAPI_BASEURL}/${SMSAPI_SEND_ACTION}" \
        --data "user=${USER_LOGIN}" \
        --data "pass=${API_KEY}" \
        --data "msg=${FINAL_MESSAGE_TO_SEND}" \
)
 
# Codes réponse HTTP possibles
# 200 : Le SMS a été envoyé sur votre mobile.
# 400 : Un des paramètres obligatoires est manquant.
# 402 : Trop de SMS ont été envoyés en trop peu de temps.
# 403 : Le service n'est pas activé sur l'espace abonné, ou login / clé
#       incorrect.
# 500 : Erreur côté serveur. Veuillez réessayez ultérieurement.
 
if [ "${HTTP_STATUS_CODE}" -eq 200 ]; then
    # echo "API responded with 200: exiting with 0" #DEBUG
    exit 0
    echo "Error: API responded with ${HTTP_STATUS_CODE}"
else
    exit 1
fi
}
 
 
##
## ENVOI SMS / MAIL
##
 
 
# QUOI QU'IL EN SOIT ON ENVOIE UN MAIL
  echo "$MSG" | mail -s "$(echo $DATE) : Connexion de $(echo $USER) sur $(hostname -s)" $DEST
 
# GESTION DES IP AUTORISEES / SMS
  if echo "$IP" | egrep $IP_AUTHORIZED ; then
    echo "MATCH NO SEND SMS";
  else 
    fctEnvoiSms "Connexion SSH de $(echo $USER) ; IP : $(echo $IP)"
  fi
send-notification-data.txt
##
## IP A AUTORISER SANS ALERTE SMS
##
 
# Décommenter cette variable et saisir l'IP de connexion permise sans alerte
# SMS. Si plusieurs IP, les séparer d'un espace
  IP_AUTHORIZED='12.345.67.890';
 
 
##
## NOTIFICATION SMS
##
 
# Login utilisateur / identifiant Free Mobile (celui utilisé pour accéder à
# l'Espace Abonné)
  USER_LOGIN="123456789"
 
# Clé d'identification (générée et fournie par Free Mobile via l'Espace Abonné,
# "Mes Options" : https://mobile.free.fr/moncompte/index.php?page=options)
  API_KEY="aBcDeFgHiJkL" 
 
 
##
## NOTIFICATION MAIL
##
 
# Nom du destinaire de la notification  par mail
  DEST=mon.mail@domaine.com

Tu es notifié par SMS ou bien par mail ?

ça dépend du PC depuis lequel je me connecte
Si c’est l’ip de mon domicile qui se connecte qu’une notification mail sinon notification ET mail
merci pour ton intérêt

Un grand merci, j’ai installé la redirection > /dev/null et ça marche tip top.
Résolu
Encore merci, j’ai pourtant lu la doc mais avais zappé le truc.

1 J'aime

Super ! :wink:

Oops… J’avais pas vu que j’étais cité.
Même si c’est déjà résolu, je vais jeter un oeil au script quand j’aurai un peu de temps, voir si ça ne peut pas s’opimiser un poil. :wink:

1 J'aime

merci :wink:

Ben, c’est déjà pas mal propre et super documenté comme code.

[mode tatillon on]

Quelques petites questions de forme, mais c’est sans importance pour le comportement du script:

Dans ‘send-notification.sh’:

  1. Perso, je réserve la notation de variables tout en majuscules aux variables d’environnement. Pour des variables ‘standard’ je préfère du tout minuscule. (éventuellement, j’irais juste mettre en majuscule les variables sourcées parce qu’elles sont extérieures au script, mais la plupart du temps je m’en tiens à la distinction ‘variables du script et de ses sources en minuscule’ / ‘variables d’environnement en majuscule’, mais ça reste une convention perso)
  2. Le décalage vers la droite de 2 espaces pour les 2 dernier blocs n’a pas d’utilité.

Dans ‘send-notification-data.txt’:

  1. Le ‘;’ derrière la valeur de IP_AUTHORIZED n’a pas d’utilité réelle.
  2. De même pour le décalage vers la droite de 2 espaces avant chaque définition de variable.

[mode tatillon off]

Un grand merci pour ces précisions
:wink: