ssh secure shell laptop

SSH : Host key verification failed

Voici la solution pour le problème “authenticity of host ‘example.com can’t be established” ou “Host key verification failed” lors d’une session SSH sous Linux, MacOS ou Windows.

J’ai récemment travaillé sur un site WordPress multisite hébergé sur WPEngine. Lorsque j’ai voulu me connecter au site en SSH, j’ai reçu une drôle d’erreur:

The authenticity of host 'example.ssh.wpengine.net (xxx.xxx.xxx.xxx)' can't be established.
RSA key fingerprint is SHA256:T8IoIg6/q7i3pVfZipYtxow4.
This host key is known by the following other names/addresses:
    ~/.ssh/known_hosts:38: 1.ssh.wpengine.net
    ~/.ssh/known_hosts:42: 2.ssh.wpengine.net
    ~/.ssh/known_hosts:47: 3.ssh.wpengine.net
    ~/.ssh/known_hosts:52: 4.ssh.wpengine.net
    ~/.ssh/known_hosts:54: 5.ssh.wpengine.net
    ~/.ssh/known_hosts:56: 6.ssh.wpengine.net
    ~/.ssh/known_hosts:76: 7.ssh.wpengine.net
    (2 additional names omitted)
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Host key verification failed.Code language: PHP (php)

Comme vous pouvez le voir, il y a déjà pas mal de domaines connus dans mon trousseau SSH, qui appartiennent à ssh.wpengine.net.

Pour une raison obscure toutefois, le nouveau sous-domaine n’est pas admis, contrairement aux sous-domaines précédents qui n’avaient posé aucun problème.

Solution: ajouter la clé au trousseau manuellement

Si la clé ne peut être ajoutée automatiquement, ajoutons-la manuellement et tentons de nous connecter.

Concrétement, il faut donc insérer la clé RSA du serveur dans le fichier /home/user/.ssh/known_hosts de la machine qui se connecte en SSH au serveur distant.

Nous pouvons faire cela en une seule commande:

ssh-keyscan -t rsa example.ssh.wpengine.net >>  ~/.ssh/known_hosts
# example.ssh.wpengine.net:22 SSH-2.0-GoCode language: PHP (php)

Voici ce que fait la commande:

  • ssh-keyscan -t rsa SSH.EXAMPLE.COM : cela récupère la clé RSA de l’hôte SSH.EXAMPLE.COM
  • >> ~/.ssh/known_hosts : cela copie la clé et l’insère dans le répertoire .ssh du dossier personnel de notre utilisateur, à la fin du fichier known_hosts qui contient tous les hôtes et clés RSA pour SSH.

Lire la suite

lastfm scrobbler for icecast

Soumettre à Last.fm les chansons d’un flux Icecast

Voici le script python que j’ai écrit pour soumettre automatiquement à Last.fm les chansons qui sont diffusées sur ma radio Icecast.

Au fil du temps, j’ai publié dans ces colonnes différents tutoriels pour gérer une radio avec Icecast, à l’aide de Winamp, VirtualDJ, et SAM Broadcaster dont on pouvait créer un fichier texte qui pouvait ensuite être filtré puis utilisé avec un script PHP pour soumettre les chansons à Last.fm.

Il y a quelques semaines, Stéphan m’a contacté pour m’informer que le script PHP que j’utilisais jusqu’alors pour scrobbler les titres était maintenant incompatible avec PHP8, et qu’il lui fallait installer PHP7.4 spécifiquement pour le faire tourner.

Le script n’utilisait pas les dernières API de Last.fm non plus, donc c’était le bon moment de moderniser tout cela. J’en ai d’ailleurs profité pour servir le serveur Icecast en HTTPS.

Le choix de Python

Après de multiples essais, je me suis vite rendu compte que PHP n’était pas du tout adapté au scrobbling : la plupart des librairies PHP sont maintenant obsolètes (PHP8) ou ne sont plus maintenues car Last.fm est en perte de vitesse (par rapport à ce que c’était il y a quelques années).

Python, au contraire, est très simple à utiliser et il existe une librairie spécifique dédiée à l’API Last.fm qui nous permet de soumettre les titres simplement: pylast.

Enfin, l’avantage de python est qu’il est installé et mis à jour sur toutes les distributions Linux et MacOS nativement et donc cela rend le code portable et facile à transporter.

Outre Python 3, vous avez besoin du gestionnaire de paquets pip :

apt install python3-pip

Vous avez également besoin de quelques modules supplémentaires, que l’on installe avec pip :

python3 -m pip install --upgrade pip
pip3 install pylast requests

C’est tout ce qu’il vous faut au niveau des dépendances. Plus besoin de PHP ni de ses librairies, plus besoin de stocker le nom des titres dans un fichier texte, tout va se faire en direct depuis le serveur Icecast.

Last.FM Scrobbler for Icecast

Le script Last.FM Scrobbler for Icecast vérifie le statut du server Icecast toutes les 30 secondes. Si le serveur est démarré et que la radio joue, il récupère les informations de la chanson et les soumet à Last.fm, tout en vérifiant bien que la chanson n’est pas la même que la précédente. Cela évite tout doublon, ce qui fausserait les soumissions du compte.

Si le serveur Icecast n’est pas démarré, le script vous avertit et attend 5 minutes.

Si le serveur Icecast est démarré mais que le fichier status-json.xsl ne contient pas les informations nécessaires, le script vous avertit et vous recommande de redémarrer votre webradio car la connexion avec Icecast est perdue.

On crée notre script:

nano /home/scripts/lastfm-scrobbler-icecast.py

Et on y ajoute:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#-----------------------------------------------------------------------
# Script name : Last.FM Scrobbler for Icecast
# Created By  : Matt Biscay
# Created Date: 2023/01/24
# Author URI  : https://www.skyminds.net
# Version     : 1.0.0
# Copyright   : 2023 SkyMinds.Net
# ---------------------------------------------------------------------- 
"""
This script will check the status of the icecast server every 30 sec and if the server is running, it will check for the currently playing track and scrobble it to LastFM if it's different from the last scrobbled track.
If the server is not running, the script will wait for 5 minutes before retrying.
It uses the pylast library to interact with the LastFM API.

@param API_KEY: the LastFM API key
@param API_SECRET: the LastFM API secret
@param username: the LastFM username
@param password: the LastFM password
@param icecast_url: the URL of the icecast server status page
"""

import pylast
import time
import requests
import json
# --------------------------------------------------
# --------- EDIT CONFIGURATION HERE ----------------
# --------------------------------------------------
# Your LastFM API key and secret
API_KEY = "LASTFM_API_KEY"
API_SECRET = "LASTFM_API_SECRET"

# The username and password of the user you want to authenticate 
# and scrobble the track for
username = "LASTFM_USER"
password = "LASTFM_PWD"

# The URL of the Icecast server's status-json.xsl page
icecast_url = "http://icecast.example.com:8000/status-json.xsl"

# ------------------------------------------------
# ---------- END OF CONFIGURATION  ---------------
# ------------------------------------------------

# Create a new LastFM network object
network = pylast.LastFMNetwork(api_key=API_KEY, api_secret=API_SECRET,
                               username=username, password_hash=pylast.md5(password))

# The previously scrobbled track name
previous_track = ""

print("# ------------------------------------------ #")
print("#  Script: Last.FM Scrobbler for Icecast     #")
print("#  Author: Matt Biscay                       #")
print("#  URL   : https://www.skyminds.net          #")
print("# ------------------------------------------ #")
print("")

while True:

    try:
        # Make a GET request to the status-json.xsl page
        response = requests.get(icecast_url)
    except requests.exceptions.ConnectionError as e:
        print("Error: Icecast server is down.")
        # Wait for 5 minutes before retrying
        time.sleep(5*60)
        continue

    if response.status_code != 200:
        print("Error: Icecast server is not running or there is some other error")
        # Wait for 5 minutes before retrying
        time.sleep(5*60)
        continue

    # Parse the JSON response
    data = json.loads(response.text)

    # Get the currently playing track information
    if "icestats" in data and "source" in data["icestats"] and "artist" in data["icestats"]["source"] and "title" in data["icestats"]["source"]:
        artist = data["icestats"]["source"]["artist"]
        track = data["icestats"]["source"]["title"]
        current_track = f'{artist} - {track}'
        if current_track != previous_track:
            # Scrobble the track
            try:
                timestamp = int(time.time())
                network.scrobble(artist=artist, title=track, timestamp=timestamp)
                print(f"Track scrobbled successfully: {current_track}")
                previous_track = current_track
            except pylast.WSError as e:
                print("Error:", e)
        # Wait for 30 seconds before checking for new tracks
        time.sleep(30)
    else:
        print("Error: Icecast XML does not contain the required information. Restart your webradio.")
        # Wait for 1 minutes before retrying
        time.sleep(60)
        continueCode language: PHP (php)

Editez les variables dans la partie EDIT YOUR CONFIGURATION: vous avez besoin de votre clé API last.fm ainsi que la clé API secret, de votre nom d’utilisateur et mot de passe last.fm, et enfin l’adresse complète du fichier XML d’Icecast, status-json.xsl.

Lire la suite

lycee gabriel guisthau nantes

Section Européenne Anglais au Lycée Guist’Hau

Qu’est-ce qu’une section européenne?

La section européenne permet aux élèves de renforcer la maîtrise de l’anglais, à l’oral comme à l’écrit, grâce à la pédagogie bilingue.

En dehors des cours de langue classiques avec ses objectifs linguistiques et culturels, les élèves suivent des cours d’Histoire-Géographie ou de Physique-Chimie en langue étrangère.

Au terme des trois années, les élèves se présentent au baccalauréat à l’épreuve de “section européenne” et peuvent obtenir une mention européenne.

Qu’est ce que la DNL?

Dans les cours de DNL (Discipline Non-Linguistique), les élèves communiquent en langue étrangère tout en restant concentrés sur une question d’Histoire, de Géographie ou de Physique-Chimie.

A titre d’exemple en Histoire-Géographie, on adopte un regard anglophone sur des questions au programme. Les cours de DNL renforcent ainsi non seulement la pratique de la langue, mais aussi les connaissances sur la culture anglophone. Les élèves apprennent à lire, expliquer et analyser des documents authentiques,

En Physique-Chimie, à partir de supports variés, les élèves vont produire des cartes mentales, des posters, réaliser des exposés, des vidéos en langue anglaise traitant des différentes parties du programme. Certains thèmes peuvent également être traités de façon expérimentale. Le but étant de savoir décrire et expliquer des phénomènes scientifiques en anglais, et éventuellement d’émettre son point de vue.

Au lycée Guist’hau, les élèves sont affectés dans les groupes de DNL (Histoire-Géographie et Physique-Chimie) de manière aléatoire, de manière à créer des groupes de DNL équilibrés au niveau du nombre d’élèves. Un réajustement est effectué en Première afin d’affiner la cohérence avec les spécialités choisies.

Quels sont les projets en section européenne?

La section européenne vise l’acquisition d’un niveau de langue soutenu et souhaite favoriser l’ouverture européenne et internationale des élèves.

La section européenne Anglais organise un voyage culturel pendant l’année de première. En terminale, les élèves passent le Cambridge English Certificate (CEC).

Quel est le cursus en section européenne?

Seconde européenne3h Anglais + 1h DNL (Histoire-Géographie ou Physique-Chimie)
Première européenne2h30 Anglais + 1h DNL
Terminale européenne2 h Anglais + 1h DNL
Horaires hebdomadaires en section Européenne Anglais

Notez bien qu’il n’est pas possible pour les élèves de choisir la matière de DNL: les élèves sont intégrés à la DNL Histoire-Géographie ou Physique-Chimie de manière aléatoire, pour former des groupes équilibrés.

Qu’est ce que la mention européenne?

Actuellement, la mention européenne pour le baccalauréat est validée si la note à l’épreuve écrite de langue est égale ou supérieure à 12/20 et si la note à l’épreuve orale de la discipline non linguistique est égale ou supérieure à 10/20.

La mention européenne donne une valeur ajoutée au diplôme de baccalauréat et représente un plus pour le parcours post-bac quelles que soient les études supérieures visées.

A qui s’adresse la section européenne?

Aux élèves motivés par la langue et la culture anglophone qui ont un bon niveau de langue et qui aiment s’impliquer en classe. Elle est ouverte aux élèves issus de sections européennes, mais aussi à ceux qui n’ont pas eu cette opportunité.

Le programme en anglais européen est identique à celui du tronc commun d’une classe classique. Cependant, le rythme de travail y est plus soutenu et les exigences renforcées, notamment en termes d’autonomie.

Lire la suite