Awk - 根据第1栏中的匹配数据(表格之间的共同点),将表1中的表2中的表2替换为表2中的表2

时间:2017-12-31 23:26:53

标签: regex bash perl awk

在我公司购买新服务器之后,我正在对服务器机房进行自上而下的升级。由于所有硬件都在变化,我无法使用裸机克隆工具进行迁移。使用Debian的newusers命令,我可以批量创建旧服务器中的所有用户。对于/ etc / shadow文件,您可以将shadow.sync(从旧服务器)文件中的第二列复制到新系统中关联帐户的第二列。这会将您帐户的密码转移到新系统。但是我不确定如何使用awk以编程方式执行此操作(或者我可以将其集成到我已经设置的shell脚本中的其他内容)。

shadow.sync包含以下内容(出于安全原因更改了用户和密码)这是要复制到当前影子文件中的文件,除了第二列中的数据具有INCORECT值外,它看起来几乎完全相同。

可以找到有关/ 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列(用户名),并从实际影子文件上同一列的同上文件中复制第2列。手动执行这将是非常糟糕的,因为我有90台服务器,我正在迁移超过900个用户。

用于演示的随机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脚本仅用于演示而非实际生产数据。当用户添加到服务器时,将使用命令行中显示的密码生成/ etc / shadow文件。运行newusers命令后,原始数据(来自shadow.sync)需要与/ etc / shadow中的数据“合并”(基本上将每个密码设置为字母x)

2 个答案:

答案 0 :(得分:-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)

这将打开/ etc / shadow文件并循环遍历这些行。对于/etc/shadow文件中的每一行,一旦匹配用户名shadow.sync,我们就会遍历TargetLine[0] == SyncLine[0]文件,密码字段将被修改并且循环被破坏。 如果未找到匹配项(/ etc / shadow中的用户名但不在shadow.sync文件中),则内部循环上的if块将会通过,并且该行保持不变,结果将在最终{{}处理1}}陈述。由于这回答了问题,我将把数据输出和文件操作留给用户。

答案 1 :(得分:-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:::