Ich habe in meinem Netz des öfteren für kurze Zeit irgendwelche Server, die ich einrichte. Diese bekommen ihre IP-Adresse per DHCP und ich arbeite per SSH auf ihnen. Natürlich beschwert sich SSH dann des öfteren, dass der Rechner hinter der IP-Adresse sich geändert hat:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
1d:7b:30:b5:74:bb:17:f6:d7:02:45:51:d5:e2:55:e8.
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending key in /root/.ssh/known_hosts:73
RSA host key for 10.11.4.24 has changed and you have requested strict checking.
Host key verification failed.
Was „im wirklichen Leben“ ja eine sinnvolle Warnung ist ist in meinem Fall unsinnig und ich will den Key aus der known_hosts löschen. Also Editor an, Zeile suchen, löschen, speichern, etc. Aber das ist mir zu umständlich. Deshalb habe ich ein kleines Script geschrieben :-) Sein Name ist „Offending“, weil dann kann man einfach die Zeile
Offending key in /root/.ssh/known_hosts:73
Absetzen und bekommt den entsprechenden Key aus der entsprechenden Datei gelöscht. Da ich leider nur PHP kann ist das Script in PHP, aber egal. Hier isses:
#!/usr/bin/php5
< ?php
// Offending key in /root/.ssh/known_hosts:76
function usage($str=""){
if($str){
echo "Error: ".$str."\n\n";
}
echo "Delete Offending keys from a known_hosts-file\n";
echo "\n";
echo "Usage:\n";
echo "Simply copy the warning e.g.\n";
echo "Offending key in /root/.ssh/known_hosts:76\n";
echo "first parameter must be 'key'\n";
echo "second parameter must be 'in'\n";
echo "third parameter is filename:linenumer\n";
die();
}
if($argc!=4) usage("argument-count is not 3");
if($argv[1]!="key") usage("argument 1 is not 'key'");
if($argv[2]!="in") usage("argument 2 is not 'in'");
$parts = explode(":",$argv[3]);
$filename = trim($parts[0]);
$linenumber = trim($parts[1])-1;
if(!strstr($filename,"known_hosts")) usage("filename doesn't contain 'known_hosts'");
if(!file_exists($filename)) usage("file $filename does not exist");
$cont = file($filename);
unset ($cont[$linenumber]);
if(!$fp=fopen($filename,"w"))die("cannot open file");
foreach ($cont as $line) fwrite($fp,$line);
fclose($fp);
Ich habe das unter /usr/local/bin gespeichert, damit man das einfach ohne Pfad aufrufen kann...