2017-12-31 51 views
-5

회사에서 새 서버를 구입 한 후 서버 실의 하향식 업그레이드를 수행합니다. 모든 하드웨어가 변하기 때문에 베어 메탈 복제 도구를 사용하여 마이그레이션 할 수 없습니다. 데비안의 newusers 명령을 사용하면 이전 서버의 모든 사용자를 대량으로 생성 할 수 있습니다./etc/shadow 파일의 경우 새 시스템의 관련 계정의 두 번째 열에 shadow.sync (이전 서버의) 파일의 두 번째 열을 복사 할 수 있습니다. 그러면 계정 암호가 새 시스템으로 전송됩니다. 그러나 awk (또는 이미 쉘 스크립트에 통합 할 수있는 다른 것)를 사용하여 프로그래밍 방식으로이 작업을 수행하는 방법을 잘 모르겠습니다.Awk - 열 1 (테이블간에 공통)의 일치하는 데이터를 기반으로 표 2의 coumn 2에서 표 1의 coumn 2를 바꿉니다.

shadow.sync에는 다음과 같은 내용이 포함되어 있습니다 (보안상의 이유로 암호가 변경된 &). 이것은 두 번째 열의 데이터가 INCORECT 값을 제외하고 거의 동일하게 보이는 현재 섀도우 파일에 복사 할 파일입니다. 은/etc/쉐도우 파일 필드

심층 설명은

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

here는 본질적 나 동기 파일 쉐도우 파일 사이에 1 열 (아이디)와 일치 할 필요가 복사 찾을 수있다 실제 그림자 파일의 동일한 열에있는 동기화 파일의 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)) 

이 파이썬 스크립트 만 데모가 아닌 실제 생산 데이터를했다 유의하시기 바랍니다. 사용자가 서버에 추가되면/etc/shadow 파일이 명령 줄에 표시된 암호와 함께 생성됩니다. newusers 명령

+3

후 원하는 출력하고 시도한 몇 가지 코드 (어떤 노력을 보여!). – PesaThe

+0

@PesaThe 비록 AWK 또는 펄 스크립트를 선호했을지라도, 대량 데이터를 처리 할 때 훨씬 더 빠르다. 도움을 주셔서 감사합니다. –

답변

-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/그림자의 데이터와 "합병"해야/etc/shadow 파일을 읽고 회 돌이를 반복합니다. /etc/shadow 파일의 각 행에 대해 사용자 이름 TargetLine[0] == SyncLine[0]에 일치하면 shadow.sync 파일을 반복하며 암호 필드가 수정되고 루프가 손상됩니다. 일치하는 항목이 없으면 (/ etc/shadow의 사용자 이름이지만 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::: 
관련 문제