Claude CLI deleted my entire home directory! Wiped my whole mac.
- ki
- menschelei
- sonstiges
Guten Morgen!
Claude CLI deleted my entire home directory! Wiped my whole mac.
Vieelicht sollten wir netter zur KI sein, sonst …
Herzliche Grüße
Matthias Scharwies
Hallo Matthias,
Warum verwendest du old.reddit? Auf meinem Handy ist das unlesbar...
Alternativer Link:
https://www.reddit.com/r/ClaudeAI/comments/1pgxckk/claude_cli_deleted_my_entire_home_directory_wiped/
Einer KI, die imstande ist, Erpressermails zu schreiben, die Kontrolle über den eigenen PC zu geben ist aber auch eine wirklich dämliche Idee, find ich. Skynet kommt!
Rolf
Moin Rolf,
fixed it for you:
Einer KI,
die imstande ist, Erpressermails zu schreiben,die Kontrolle über den eigenen PC zu geben ist aber auch eine wirklich dämliche Idee, find ich. Skynet kommt!
Zumindest ungeprüft ist das wirklich eine sehr dumme Idee gewesen. Immerhin hat die „Keine Intelligenz“ ihren Fehler eingesehen und sich selbst auch mitgelöscht 😜
Zum Glück für den Anwender wollte er nicht veraltete Pakete in / aufräumen.
Viele Grüße
Robert
Guten Morgen Matthias,
ha, ich hab den Fehler gefunden - bei der nächsten Version wird die Tilde vor dem letzen Slash entfernt - dann wird alles besser 😁😁😁
Und wie immer gilt: gerade da hatte davor das Backup einen Fehler und die Daten sind wirklich alle weg, oder?
Trotz allem: habt eine schöne restliche Adventszeit.
Liebe Grüße,
Hans
ich beantrage bei den Hackern, auch mal was zu schreiben, das die Backup-Server angreift ... das wäre doch ein schöner Virus - der Backup-Virus
ihr seht, ich hatte heute früh mal wieder einen Clown ... sorry - aber die Finger sind oft viel schneller als das Hirn und vor allem als das Herz 😇😇😇
Moin Matthias,
Claude CLI deleted my entire home directory! Wiped my whole mac.
Vieelicht sollten wir netter zur KI sein, sonst …
wieso, da steht doch „accidently“, es war alles nur ein „Unfall“ 😇
Viele Grüße
Robert
Hallo,
ich habe mich - was Alle Jahre Wieder vorkommt - mit PowerShell herumschlagen müssen. Wegen der Seltenheit vergesse ich ständig die Syntax. OpenAI hat mir relativ schnell gesagt: jetzt reichts, kauf dir ein upgrade.
Also habe ich mich bei Claude für den Free Plan angemeldet, und nach einem sehr angenehmen Dialog ohne Bauchpinselei durch die KI war mein Script schnell fertig und ich habe einiges neues über Powershell gelernt. Mal gucken, wann er meint, ich hätte das fair use Limit überschritten.
Ich habe allerdings nur Detailfragen zur Syntax und für Einzelschritte gestellt ("wie konvertiere ich eine Hashtable in einen key=value,key=value... String").
Ob ich ihm auch mein Gesamtproblem verbal hätte beschreiben können, um fertigen Code zu bekommen? Hm. Prompt-Engineering 101…
Schritt 1:
Ich möchte MariaDB verwenden und mehrere sql statements übergeben. mysql befindet sich in in C:\mariadb. Die Ini-Datei dazu steht in D:\inifiles.
Ich möchte mit einem vorgegebenen User "meinuser" und einem passwort "meinpasswort" starten, die Datenbank heißt "testdb". Die nötigen Kommandozeilenoptionen möchte ich in einer Hashtable notieren und daraus die Befehlszeile für den mysql Aufruf konstruieren.
Dann möchte in die SQL-Befehle Variablen $script erzeugen und mysql damit laufen lassen. Diesen Teil diskutieren wir später, nimm einfach an, in $script stünde "SELECT * FROM demo"
Hat er verstanden und perfekt gemacht. Obwohl ich im dritten Absatz einen grammatischen Trümmerhaufen hinterlassen habe 😲
# Konfiguration
$mysqlExe = "C:\mariadb\bin\mysql.exe"
$params = [ordered]@{
defaults-file = "D:\inifiles\my.ini"
user = "meinuser"
password = "meinpasswort"
database = "testdb"
}
# Kommandozeilenargumente aus Hashtable bauen
$argList = @($params.GetEnumerator() | ForEach-Object { "--$($_.Key)=$($_.Value)" })
# SQL-Script (Platzhalter – wird später dynamisch befüllt)
$script = "SELECT * FROM demo"
# mysql aufrufen und Script per stdin übergeben
$script | & $mysqlExe @argList
Dazu gibt er mir auch Hinweise auf Knackpunkte im Code, die ich in meinem ersten Versuch glatt übersehen hatte (wie z.B. das [ordered]-Attribut für die Hashtable). Und er meint, dass ein Klartextpasswort unsicher sei und "sobald wir den Script-Teil besprechen, können wir das bei Bedarf über die Ini-Datei lösen". Wow.
gut. weiter. Ich möchte ein LOAD Statement benutzen, um mehrere CSV-Dateien zu importieren. Das braucht eine Liste von Spaltennamen, diese Namen möchte ich in einem Array aufschreiben und daraus den entsprechenden Teil des Load-Statements erzeugen. Verwende für deinen Code die Spaltennamen "a", "b" und "c". Die Spaltennamen sollen in Backticks eingeschlossen werden.
Die CSV-Datei enthält keine Spaltennamen, die Spalten sind durch Komma getrennt, Strings können in " eingeschlossen sein, Zeilen werden durch \n abgeschlossen. Die Namen der CSV-Dateien möchte ich in einem Array aufschreiben und dann für jeden Array-Eintrag ein LOAD-Statement erzeugen. Aus allen Load-Statements soll ein Script entstehen und dieses an MYSQL übergeben werden.
Zack, schickes Ergebnis kommt raus.
(... kommandozeilenparameter bauen ...)
# Spaltendefinition
$columns = @("a", "b", "c")
$columnList = ($columns | ForEach-Object { "``$_``" }) -join ", "
# CSV-Dateien
$csvFiles = @(
"D:\data\file1.csv",
"D:\data\file2.csv",
"D:\data\file3.csv"
)
# LOAD-Statement als ScriptBlock-Template
$loadTemplate = {
param($file)
@"
LOAD DATA LOCAL INFILE '$file'
INTO TABLE demo
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
($columnList);
"@
}
# Script aus allen LOAD-Statements zusammenbauen
$script = ($csvFiles | ForEach-Object { & $loadTemplate -file $_ }) -join "`n"
# mysql aufrufen
$script | & $mysqlExe @argList
Wow. Das Konstruieren der Felderliste aus dem Array hat er geschickter gemacht als ich. Für das LOAD-Statement hat er einen Template-Block generiert - ob er das von sich aus gemacht hat oder deswegen, weil ich vorher im Chat danach gefragt hatte, wie man das tut, weiß ich nicht.
Aber das war's nicht ganz, weil ihm noch Infos fehlten.
Das Array mit CSV-Dateien soll den Pfad und die Endung .csv nicht enthalten, ich möchte, dass das im loadTemplate steht.
Vor den Load-Statements soll im SCRIPT ein DELETE statement stehen, dass aus der Tabelle demo die Zeilen löscht, in denen die Spalte "source" einen der Einträge aus dem csvFiles Array enthält.
Das Ergebnis war genau das, was ich brauchte. Bis auf die exakten Namen, natürlich. Und die Definition des CSV-Escapezeichens, die hab ich aber auch nicht bestellt. Hätte er mich drauf hinweisen können.
# Konfiguration
$mysqlExe = "C:\mariadb\bin\mysql.exe"
$params = [ordered]@{
"defaults-file" = "D:\inifiles\my.ini"
user = "meinuser"
password = "meinpasswort"
database = "testdb"
}
# Kommandozeilenargumente aus Hashtable bauen
$argList = @($params.GetEnumerator() | ForEach-Object { "--$($_.Key)=$($_.Value)" })
# Spaltendefinition
$columns = @("a", "b", "c")
$columnList = ($columns | ForEach-Object { "``$_``" }) -join ", "
# CSV-Dateinamen (ohne Pfad und Endung)
$csvFiles = @(
"file1",
"file2",
"file3"
)
# Templates
$deleteTemplate = {
param($files)
$inList = ($files | ForEach-Object { "'$_'" }) -join ", "
"DELETE FROM demo WHERE ``source`` IN ($inList);"
}
$loadTemplate = {
param($file)
@"
LOAD DATA LOCAL INFILE 'D:\data\$file.csv'
INTO TABLE demo
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
($columnList);
"@
}
# Script zusammenbauen
$loadStatements = ($csvFiles | ForEach-Object { & $loadTemplate -file $_ }) -join "`n"
$script = @"
$(& $deleteTemplate -files $csvFiles)
$loadStatements
"@
# mysql aufrufen
$script | & $mysqlExe @argList
Verdammt. Den Kollegen kann man tatsächlich gebrauchen. Aber es ist trotzdem hilfreich, etwas Powershell zu können, bevor man das stumpf auf die DB loslässt.
Rolf
Da war dann noch ein unvernähtes Fädchen:
super. lass uns noch über das passwort reden. wie bekomme ich das aus dem script heraus?
Erste Antwort war: pack's in die my.ini. Aber das gefiel mir nicht.
gibt es einen Mechanismus, wie ich das Passwort über einen privaten schlüssel verschlüsseln kann und im script über den öffentlichen Schlüssel entschlüsseln? Der öffentliche Schlüssel soll in der Registry stehen.
Sein Kommentar:
Das funktioniert so leider nicht – du hast die Rollen vertauscht
JAAA - Klugscheißer. Dann hat er mir noch DPAPI für Powershell erklärt. Das sei die richtige Windows-Lösung und das PW sei dann nur für meinen User lesbar. Was es nicht alles gibt... 😀
# Einmalig: Passwort verschlüsseln und in Datei speichern
"meinpasswort" | ConvertTo-SecureString -AsPlainText -Force |
ConvertFrom-SecureString |
Set-Content "D:\inifiles\password.bin"
# Im Script: Passwort laden und entschlüsseln
$securePassword = Get-Content "D:\inifiles\password.bin" | ConvertTo-SecureString
$plainPassword = [System.Net.NetworkCredential]::new("", $securePassword).Password
Rolf