【问题标题】:AWK - Transmission of a variable with getline to system ()?AWK - 使用 getline 将变量传输到系统()?
【发布时间】:2012-04-18 00:01:24
【问题描述】:

我有一个理论问题:

1) getline()的系统如何传递一个变量?

awk 'BEGIN{var="ls"; var | getline var; system("echo $var")}'

2) 如何为输出系统(“ls”)分配一个变量并在awk中打​​印结果?

awk 'BEGIN{var="system("ls")"; print '$var'}'

3) 能否在系统中分配一个变量(var = "ls")并在awk中打​​印结果?

awk 'BEGIN{system(var="ls"); print "'"$var"'"}'

感谢您提供的信息。

编辑:

torek:感谢您的回复。

我知道在第一个示例中,您可以这样做:

awk 'BEGIN { while ("ls -l" | getline var) system("echo " var  );}'

对于这个应用程序,你不能从系统()分配一个变量输出?如本例所示:

awk 'BEGIN {var="ls -l"; system(var); print var}'

【问题讨论】:

    标签: awk getline


    【解决方案1】:

    我想你看错了。 awk 的 system 只接受任何旧字符串,所以给它一个,例如:

    system("echo " var);  # see side note below
    

    (请记住,在 awk 中,字符串是通过邻接连接起来的)。而且,system 只是运行一个命令;要捕获其输出,您需要使用 getline,类似于您的问题 #1。

    如果你想读取ls 的所有输出,你需要遍历getline 的结果:

    awk 'BEGIN { while ("ls" | getline var) print "I got: " var; }'
    

    由于这仅定义了一个 BEGIN 操作,awk 将启动,运行 ls,收集每个输出行并打印,然后退出。


    旁注:传递给 shell 的变量要非常小心(这包括对system 的调用和| getline 左侧的项目,以及awk 的现代变体中的一些其他情况——任何运行命令)。反引号、$(command) 和分号都可以允许用户调用任意命令。例如,在上面的system("echo " var) 示例中,如果var 包含; rm -rf $HOME,则命令变为echo ; rm -rf $HOME,这几乎肯定不是您希望发生的事情。

    您可以检查“坏”字符和对象,或引用它们。现代 8 位干净的 shell 应该只需要引用引号本身(为了语法有效性)$<>|`。如果您使用单引号来引用参数(使它们显示为单个“单词”),您只需转义单引号。详情请见this unix.stackexchange.com answer


    另外一个附注:我倾向于在我的 awk 脚本中添加“不必要的”分号,使它们在语法上看起来更像 C。几十年前的旧习惯。

    【讨论】:

    • torek:感谢您的回复。对于此应用程序,您不能从 system() 分配变量输出吗?如本例所示:awk 'BEGIN {var="ls -l"; system(var); print var}'
    • system 函数:(1)运行某事以完成;然后 (2) 返回其退出值。 ls 成功时的退出值为 0。因此,例如,您可以使用x = system(foo); print "ran " foo " and got " x;。如果foo 是字符串"ls",这将运行ls 并输出到awk 的标准输出,并将x 设置为0,因为ls 将成功。
    • 请注意,转义用户提供的参数很重要,如this Unix.SE answer 所示。考虑这个例子:awk '{ system("echo " $0); }'. This command is supposed to show every line from a file, but a line such as bye; rm /etc/passwd` 将导致在您的/etc/passwd 文件被删除之前打印bye
    • @Lekensteyn:同意。上面的示例使用已知的固定(硬编码)输入,例如"ls",并试图捕获输出。与往常一样,如果允许用户生成输入,则必须有人在传递它们之前对其进行验证和/或编码。否则Little Bobby Tables 会造成严重破坏。
    • @torek 昨天我也在考虑妈妈漏洞利用:P 但是在这种情况下,; DROP TABLE students 没有意义,除非你有一个命令DROP。您可以在答案中添加一些关于转义输入的内容吗?我看到 OP 在做 system("echo " var) 这绝对是个坏主意。
    猜你喜欢
    • 2015-09-04
    • 2012-04-19
    • 2012-08-10
    • 2013-12-23
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 2020-06-30
    相关资源
    最近更新 更多