“Too many authentication failures” in ssh

Onlangs kwam ik een vreemde foutmelding tegen toen ik met ssh wilde inloggen op een Linux-server met gebruik van ssh-certificaten (zie de workshop “Je eigen certificaatautoriteit voor ssh” in het vorige nummer). Ik bleef maar de melding “Too many authentication failures” krijgen, terwijl ik er zeker van was dat ik met de juiste identiteit inlogde.
Ik probeerde daarop de ssh-verbinding opnieuw, maar deze keer met de optie -v om meer uitvoer te zien. En zo ontdekte ik dat de OpenSSH-client allerlei identiteiten uitprobeerde, namelijk alle sleutels die ssh-agent kende, en dat waren er na enkele experimentjes met de gebruikerscertificaten van step-ca wel wat. Uiteraard verbrak de server de verbinding nadat hij enkele sleutels aangeboden kreeg die niet geldig waren.

Gelukkig kun je dit gedrag eenvoudig aanpassen met de optie IdentitiesOnly, bijvoorbeeld op de opdrachtregel:
ssh -o IdentitiesOnly=yes gebruiker@server
Dan gebruikt de ssh-client alleen identiteiten die je expliciet op de opdrachtregel opgeeft (bijvoorbeeld met -i id_ecdsa) of die in het configuratiebestand van de ssh-client opgegeven staan. Als ssh-agent extra identiteiten aanbiedt, worden die genegeerd. En zo kon ik plots wel inloggen.
Dit gedrag kun je standaard instellen met de volgende configuratie in /.ssh/config:
Host *
IdentitiesOnly=yes
Specifieke identiteiten voor servers kun je dan nog altijd op de opdrachtregel opgeven, of in het configuratiebestand /.ssh/config op de volgende manier:
Host server1
IdentityFile ~/.ssh/id_ecdsa

Verwerk json in de terminal
Unix-programma’s verwerken vaak eenvoudige ongestructureerde tekst, maar op het web zijn andere formaten gebruikelijk, zoals json (JavaScript Object Notation). Ook meer en meer moderne commandlinetools geven de mogelijkheid om uitvoer in de vorm van json te doen. Download je dus zaken op het web of krijg je uitvoer van een programma in json, dan heb je een manier nodig om dit te verwerken.
Het programma jq kan je daarbij helpen: je kunt ermee json-data filteren en transformeren. Je installeert het eenvoudig als het pakket jq en je kunt het ook eenvoudig online uitproberen op https://jqplay.org/ als je er gewoon eens wat mee wilt experimenteren.
jq omschrijft zichzelf als “sed for JSON data” en dat is dan ook het grote voordeel: het werkt net zoals andere Unix-programma’s eenvoudig met pipes samen. Zo download je bijvoorbeeld informatie over alle GitHub-repository’s van een gebruiker in json-formaat en filter je daaruit de url’s van de repository’s:

curl https://api.github.com/users/koenvervloesem/repos | jq ‘.[].html_url’
Wat doet dit? Daarvoor dien je eerst de uitvoer van de curl-opdracht te bekijken, zonder de pipe erachter dus. Je ziet dan dat in de json-data een array zit met voor elke repository een object. Elk van deze objecten bestaat uit een groot aantal attributen met een waarde. We zijn geïnteresseerd in het attribuut html_url. De jq-opdracht ‘.[].html_url’ betekent dus: haal uit elk object uit de array de waarde van het attribuut html_url.
Je kunt ook de json-data transformeren. Bijvoorbeeld als volgt:

curl https://api.github.com/users/koenvervloesem/repos | jq ‘.[] | {url: .html_url, license: .license.name}’
Hiermee haal je dus elk object uit de array en maak je voor elk object een nieuw object aan met een attribuut url dat de waarde krijgt van het attribuut html_url uit het originele object en een attribuut license dat de waarde krijgt van het attribuut name van het attribuut license van het originele object.
Zelfs als je niets wilt verwerken of filteren is jq handig: standaard toont het programma attributen en waarden in zijn uitvoer immers in kleur. Bijvoorbeeld attribuutnamen in het blauw, strings in het groen en getallen in het wit. Ook worden de accolades en attributen standaard ingesprongen in plaats van zonder spaties allemaal vlak na elkaar te komen. Krijg je dus json-data binnen en wil je ze wat overzichtelijker weergeven, pipe de uitvoer dan gewoon naar jq.
Het zou ons te ver voeren om hier alle mogelijkheden van jq te tonen, maar bekijk zeker de man-pagina eens, want jq is een krachtige tool als je json in de terminal dient te verwerken.

Met jq verwerk je eenvoudig json-data in de terminal.
https://stedolan.github.io/jq/
Sensors van je laptop
Sensorgegevens zoals de temperatuur van je processor of de spanning van je batterij kun je eenvoudig uitlezen met het pakket lm-sensors. Na installatie voer je eerst het programma sensors-detect uit. Dit heeft rootrechten nodig voor toegang tot je hardware:
sudo sensors-detect
Daarna krijg je de vraag welke sensors je wilt detecteren. Nadien weet het programma welke sensors er in je systeem bekend zijn. Daarna kun je de sensorwaardes opvragen met:
sensors
In de praktijk gebruik je het programma sensors niet rechtstreeks, maar heel wat andere programma’s kunnen je deze sensordata tonen via de onderliggende bibliotheek libsensors. Wil je zelf in de shell sensordata uitlezen, dan is de optie -j handig, die json-uitvoer geeft:
sensors -j
Je kunt die uitvoer ook beperken tot een specifieke sensor, bijvoorbeeld:
sensors -j coretemp-isa-0000
Deze json-uitvoer kun je nu verder filteren, bijvoorbeeld met jq om alleen de waarde van de kerntemperatuur te zien:
sensors -j coretemp-isa-0000|jq ‘.”coretemp-isa-0000″.”Package id 0″.temp1_input’

Met de opdracht sensors vraag je de temperatuur van je processor op.
https://github.com/lm-sensors/lm-sensors
Plot getallen in de terminal met lipl
Wie bepaalde waardes in de terminal in het oog wil houden, gebruikt daarvoor vaak watch. Wil je bijvoorbeeld de kerntemperatuur van je processor in het oog houden, dan voer je iets als het volgende uit:
watch -n 5 “sensors -j coretemp-isa-0000|jq ‘.\”coretemp-isa-0000\”.\”Package id 0\”.temp1_input'”
Een alternatief is lipl: de naam staat voor ‘LIve PLot’ en het doet wat de naam zegt: het plot getallen in de terminal. Als je in de vorige opdracht watch vervangt door lipl, krijg je een live plot van je processortemperatuur te zien.
Je installeert lipl met brew:
brew install yxdunc/tools/lipl
En als je die pakketbeheerder niet hebt, kun je op de GitHub-pagina een binaire release voor Linux downloaden.
Het programma kan alles wat een getal als uitvoer geeft plotten. Je kunt dus zelfs berekeningen uitvoeren in de shell en laten plotten, zoals veeltermen:
lipl -n 1 ‘echo “x=$(($(date +%s) % 30 – 15)); echo $(($x * $x + $x))” | sh’
In de meeste gevallen kun je lipl ter vervanging van watch gebruiken als de uitvoer die je wilt zien in de vorm van een getal komt. De optie -n om het aantal seconden van het interval aan te duiden, is bij beide opdrachten zelfs hetzelfde. Voer lipl –help uit om de andere opties te zien.


Het programma lipl is een ‘grafische’ tegenhanger van watch in de terminal.
https://github.com/yxdunc/lipl