2017-12-31 139 views
-5

Nachdem meine Firma neue Server gekauft habe, mache ich eine Top-down-Upgrade des Serverraum. Da sich die gesamte Hardware verändert, kann ich kein Bare-Metal-Klonwerkzeug zur Migration verwenden. Mit dem Befehl newusers von Debian kann ich alle Benutzer vom alten Server in Massen erstellen. Für die Datei/etc/shadow können Sie die zweite Spalte aus Ihrer Datei shadow.sync (aus dem alten Server) in die zweite Spalte des zugeordneten Kontos im neuen System kopieren. Dadurch werden die Kennwörter für Ihre Konten auf das neue System übertragen. Allerdings bin ich nicht sicher, wie dies programmatisch mit awk (oder etwas anderes, das ich in mein Shell-Skript integrieren kann, das ich bereits eingerichtet habe).Awk - ersetzen Sie coumn 2 in Tabelle 1 von coumn 2 in Tabelle 2 basierend auf übereinstimmenden Daten in Spalte 1 (gemeinsam zwischen Tabellen)

shadow.sync enthält Folgendes (Benutzer & Passwörter aus Sicherheitsgründen geändert) Dies ist die Datei, die in die aktuelle Shadow-Datei kopiert werden soll, die fast identisch aussieht, außer dass die Daten in der zweiten Spalte die INCORECT-Werte haben.

Eine eingehende Erklärung der Felder für die/etc/shadow Datei kann here

user1:$6$HiwQEKYDgT$xYU9F3Wv0jFWHmZxN60nFMkTqWn87RRIOvx7Epp57rOmdHN9plJgjhC.jRVVNc1.HUaqSpX/ZcCEFSn6RmQQA0:17531::0:99999:7::: 
user2:$6$oOuwJtrIKk$THLsfDppLI8QVw9xEOAaIoZ90Mcz3xGukVdyWGJJqygsavtXvtJ8X9ECc0CfuGzHp0pHNSAqdZY9TAzF5YKLc.:17531::0:99999:7::: 
user3:$6$IEHAyRsokQ$e5K3RicE.PUAej8IxG9GnF/SUl1NQ57pqzUVuAzsP8.89SNhuaKE1W7kG5P4hbzV23Bb2zWHx353t.e9ERSVy.:17531::0:99999:7::: 
user4:$6$lFOIUQvxdb$W5ITiH/Y021xw1vo8uw6ZtIOmfKjnNnC/SttQjN85MHtLbFeQ2Th5kfAIijXC81CRG4T0kJQ3rzRNRSyQHjyb1:17531::0:99999:7::: 
user5:$6$RZbtYxWiwE$lnP8.tTbs0JbLZg5FsmPR8QvrJARbcRuJi2nYm1okwjfkWPkj212mBPjVF1BTo2hVCxLGSw64Cp6DgXheacSx.:17531::0:99999:7::: 

Im Wesentlichen muß i Spalte 1 (username) zwischen der sync-Datei und der Schattendatei und kopiert Übereinstimmung gefunden Spalte 2 aus der Sync-Datei über der gleichen Spalte der tatsächlichen Shadow-Datei. Von Hand zu gehen wäre schrecklich, da ich 90 Server habe, die ich mit über 900 Benutzern migrieren würde.

Zufall shadow.sync Datei für die Demonstration wurde mit erstellt:

#!/usr/bin/env python 

import random, string, crypt, datetime 

userList = ['user1','user2','user3','user4','user5'] 
dateNow = (datetime.datetime.utcnow() - datetime.datetime(1970,1,1)).days 

for user in userList: 
     randomsalt = ''.join(random.sample(string.ascii_letters,10)) 
     randompass = ''.join(random.sample(string.ascii_letters,10)) 
     print("%s:%s:%s::0:99999:7:::" % (user, crypt.crypt(randompass, "$6$"+randomsalt), dateNow)) 

Bitte beachten Sie, dem Python-Skript nur zu Demonstrations war und nicht für die tatsächlichen Produktionsdaten. Wenn Benutzer dem Server hinzugefügt werden, wird die Datei/etc/shadow mit dem in der Befehlszeile angegebenen Kennwort generiert. Die Originaldaten (von shadow.sync) muss „Zusammengeführt“ mit den Daten in/etc/shadow werden, nachdem der newusers Befehl ausgeführt wird (die im Wesentlichen jedes Passwort zu dem Buchstaben x Sets)

+3

Schreiben Sie die gewünschte Ausgabe und einige Code, den Sie versucht haben, (zeigen einige Mühe!). – PesaThe

+0

@PesaThe Obwohl ich ein AWK oder sogar Perl-Skript bevorzugen würde, da sie viel schneller bei der Verarbeitung von Daten in großen Mengen sind, habe ich es repariert, danke für die Hilfe. –

Antwort

-1
#!/usr/bin/env python 
with open('/etc/shadow','rb') as file: 
    for line in file: 
    TargetLine = line.rstrip().split(":") 
    with open('shadow.sync','rb') as shadow: 
     for row in shadow: 
     SyncLine = row.rstrip().split(":") 
     if TargetLine[0] == SyncLine[0]: 
      TargetLine[1] = SyncLine[1] 
      break 
    print "NEW MODIFIED LINE: %s" % ":".join(TargetLine) 

Dies eröffnet die Datei/etc/shadow und führt eine Schleife durch die Zeilen. Für jede Zeile in der Datei /etc/shadow durchlaufen wir die Datei shadow.sync, sobald eine Übereinstimmung für die Benutzernamen TargetLine[0] == SyncLine[0] das Kennwortfeld geändert und die Schleife unterbrochen wird. Wenn eine Übereinstimmung nicht gefunden wird (Benutzername in/etc/shadow aber NICHT in der shadow.sync Datei), fällt der if Block auf der inneren Schleife durch und die Zeile bleibt unberührt. Die Ergebnisse werden auf der letzten print Anweisung behandelt. Da dies die Frage beantwortet, überlasse ich die Datenausgabe und Dateimanipulation dem Benutzer.

-1
use Data::Dumper; 

# we only need to process the sync file once - 
# and store what we find in a hash (dictionary) 

open $fh1, '<', 'shadow.sync.txt'; 

while (<$fh1>) 
{ 
    m/^([^:]+):(.*)$/; 

    $hash->{$1} = $2; 
} 

close $fh1; 

# this shows us what we found & stored 

print Dumper $hash; 

# now we'll process the shadow file which needs updating - 
# here we output a side-by-side comarison of what the passwords 
# currently are & what they will be updated to (from the hash) 

open $fh2, '<', 'shadow.txt'; 
open $fh3, '>', 'shadow.UPDATED.txt'; 

while (<$fh2>) 
{ 
    m/^([^:]+):(.*)$/; 

    printf ("%s => %s\n", $1, $2); 
    printf ("%s => %s\n\n", $1, $hash->{$1}); 

    printf $fh3 ("%s:%s\n", $1, $hash->{$1}); 
} 

close $fh3; 
close $fh2; 

Beispielausgabe:

$VAR1 = { 
     'user5' => '$6$RZbtYxWiwE$lnP8w64Cp6DgXheacSx.:17531::0:99999:7:::', 
     'user1' => '$6$HiwVVNc1.HUaqSpX/ZcCEFSn6RmQQA0:17531::0:99999:7:::', 
     'user4' => '$6$lFOIUQv1CRG4T0kJQ3rzRNRSyQHjyb1:17531::0:99999:7:::', 
     'user3' => '$6$P8.89SNhu23Bb2zWHx353t.e9ERSVy.:17531::0:99999:7:::', 
     'user2' => '$6$Cc0CfuGzHp0pHNSAqdZY9TAzF5YKLc.:17531::0:99999:7:::' 
    }; 

user1 => $6$RANDOM1RANDOM1RANDOM1RANDOM1:17531::0:99999:7::: 
user1 => $6$HiwVVNc1.HUaqSpX/ZcCEFSn6RmQQA0:17531::0:99999:7::: 

user2 => $6$RANDOM2RANDOM2RANDOM2RANDOM2:17531::0:99999:7::: 
user2 => $6$Cc0CfuGzHp0pHNSAqdZY9TAzF5YKLc.:17531::0:99999:7::: 

user3 => $6$RANDOM3RANDOM3RANDOM3RANDOM3:17531::0:99999:7::: 
user3 => $6$P8.89SNhu23Bb2zWHx353t.e9ERSVy.:17531::0:99999:7::: 

user4 => $6$RANDOM4RANDOM4RANDOM4RANDOM4:17531::0:99999:7::: 
user4 => $6$lFOIUQv1CRG4T0kJQ3rzRNRSyQHjyb1:17531::0:99999:7::: 

user5 => $6$RANDOM5RANDOM5RANDOM5RANDOM5:17531::0:99999:7::: 
user5 => $6$RZbtYxWiwE$lnP8w64Cp6DgXheacSx.:17531::0:99999:7::: 
Verwandte Themen