2017-12-31 330 views
-5

私の会社は新しいサーバを購入した後、サーバルームのトップダウンアップグレードを行っています。すべてのハードウェアが変更されているので、私はベアメタルクローンツールを使用して移行することができません。 Debianのnewusersコマンドを使用すると、古いサーバーのすべてのユーザーを一括して作成できます。/etc/shadowファイルでは、新しいシステムの関連するアカウントの2番目の列にshadow.sync(古いサーバーから)ファイルの2番目の列をコピーできます。これにより、アカウントのパスワードが新しいシステムに転送されます。しかし、私はawkを使ってプログラムを使ってこれをやる方法がわかりません(あるいは既に設定済みのシェルスクリプトに統合することができます)。Awk - カラム1(テーブル間で共通)の一致するデータに基づいてテーブル2のcoumn 2をテーブル2のcoumn 2に置き換えます。

shadow.syncには、セキュリティ上の理由からパスワードが変更された&が含まれています。これは、2番目の列のデータがINCORECT値を持つことを除いて、ほぼ同じに見える現在のシャドウファイルにコピーされるファイルです。

AN/etc/shadowファイルのフィールドの詳細な説明は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::: 

見つけることができます基本的に私は、カラム1(ユーザー名)と一致する必要が同期ファイルとshadowファイルとコピーとの間実際のシャドーファイルの同じ列の同期ファイルの上から2列目に移動します。私が900人以上のユーザーと一緒に移行している90台のサーバーがあるので、これを手作業で行うことはひどいことになります。デモンストレーション用

ランダムshadow.syncファイルを使用して生成されました:

#!/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)) 

このPythonスクリプトを注意してくださいONLYデモのためではなく、実際の生産データのためでした。ユーザーがサーバーに追加されると、/ etc/shadowファイルが生成され、コマンドラインにパスワードが表示されます。 newusersコマンドが

+3

ポスト所望の出力と、あなたが試したいくつかのコード(いくつかの努力を示して!)。 – PesaThe

+0

@Pesa AWKやPerlスクリプトが好きだったのですが、バルクでデータを処理する方がはるかに高速ですが、助けてくれてありがとうございました。 –

答えて

-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) 

これが開きます(基本的に文字xにすべてのパスワードを設定する)を実行された後(shadow.syncからの)オリジナルのデータは、/ etc/shadowの中のデータを「合併」する必要があります/ etc/shadowファイルを開き、行をループします。 /etc/shadowファイルの各行について、shadow.syncファイルをループし、ユーザ名TargetLine[0] == SyncLine[0]のユーザ名が一致すると、パスワードフィールドが変更され、ループが壊れます。 一致するものが見つからない場合(/ etc/shadowのユーザ名はshadow.syncファイルにはないが、shadow.syncファイルにない場合)、内側ループのifブロックが通過し、その行はそのまま残り、結果は最終のprint文で処理されます。これが質問に答えるので、私はデータ出力とファイル操作をユーザーに任せます。

-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; 

出力例:

$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::: 
関連する問題