【问题标题】:AWK Command returning 0AWK 命令返回 0
【发布时间】:2020-02-10 16:02:17
【问题描述】:

使用以下代码运行 AWK 命令时

awk -F: 'BEGIN{OFS=":"} ($2 != "*" && $2 != "!") {$2=system("openssl passwd -1 -salt {salt} {password}"); print $2}' PASS/shadow.txt > PASS/test.txt |  cat PASS/test.txt 

打印命令时,我会收到:

“加盐密码”
0

它会将 $2 更改为 0。但仍会打印出哈希值。无论如何要解决这个问题并让 2 = 命令的输出。

我正在尝试将所有 $2 字段替换为新密码哈希作为我班级中的示例项目,并将结果存储在新文件中。

【问题讨论】:

  • system() 返回命令的退出状态,而不是命令的输出。
  • 欢迎来到 SO。命令$2=system("openssl passwd -1 -salt {salt} {password}") 不会按照您的想法工作,system 命令将打开一个子shell,并且不会将该命令的输出保存到$2,而是会保存其退出状态(如果我在这里没有错的话),所以您需要让我们知道您的完整要求,以便我们更好地理解您的问题。

标签: linux awk


【解决方案1】:

听起来这可能是你想要做的:

awk '
    BEGIN { FS=OFS=":" }
    $2 !~ /^[*!]$/ {
        cmd = "openssl passwd -1 -salt {salt} {password}"
        if ( (cmd | getline line) > 0 ) {
            $2 = line
        }
        close(cmd)
    }
    { print }
' PASS/shadow.txt > PASS/test.txt

如果没有,请编辑您的问题以阐明您的要求并提供更好的示例。

【讨论】:

    【解决方案2】:

    您使用的system 命令没有达到您的预期。它返回您执行的命令的返回码,而不是标准输出。

    system(expression): 以与POSIX.1-2017的System Interfaces卷中定义的system()函数等效的方式执行expression给出的命令,并返回命令的退出状态.

    您可以通过以下方式轻松查看:

    $ awk 'BEGIN{print system("true"), system("false")}'
    0 1
    

    在这里,我们执行了命令truefalse(请参阅man trueman false)了解它们的作用。

    如果您想捕获命令的输出,getline 命令就是您所需要的。有关getline 的注意事项的详细文档可在Ed Morton's All about getline 中找到。另请参阅 his answer 了解此 OP 的实现。

    【讨论】:

      猜你喜欢
      • 2019-09-26
      • 2018-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      • 2016-05-06
      • 1970-01-01
      相关资源
      最近更新 更多