【问题标题】:Escape UNIX character转义 UNIX 字符
【发布时间】:2013-08-26 11:08:08
【问题描述】:

这应该很容易,但我就是无法摆脱它:

我需要使用 unix 命令行替换 .php 文件中的一段文本。

使用:sudo sed -i '' 's/STRING/REPLACEMENT/g' /file.php(-i 后面的引号是必需的,因为它在 Mac Os X 上运行)

字符串:['password'] = ""; 需要替换为:['password'] = "$PASS"; $PASS 是一个变量,所以它会被填充。

我想到了类似的东西:

sudo sed -i '' 's/[\'password\'] = ""\;/[\'password\'] = "$PASS"\;/g' /file.php

但由于我是 UNIX 新手,我不知道要逃避什么...

应该改变什么?谢谢!

【问题讨论】:

  • 接受的答案实际上不适用于任意字符串——事实上,恶意密码可以结束正在运行的 sed 命令(替换操作)并启动另一个任意命令,对该用户的选择您的配置文件!请考虑 awk 答案,或mywiki.wooledge.org/BashFAQ/021

标签: shell unix replace sed escaping


【解决方案1】:

不幸的是,sed 无法可靠地处理可能包含对 sed 和 shell 来说“特殊”的各种字符的变量。您需要为此使用 awk,例如使用 GNU awk 进行 gensub():

gawk -v pass="$PASS" '{$0=gensub(/(\[\047password\047] = \")/,"\\1"pass,"g")}1' file

当 PASS 包含正斜杠但 awk 不关心时,请查看下面的 sed 如何失败:

$ cat file
The string: ['password'] = ""; needs to be replaced

$ PASS='foo'
$ awk -v pass="$PASS" '{$0=gensub(/(\[\047password\047] = \")/,"\\1"pass,"g")}1' file
The string: ['password'] = "foo"; needs to be replaced
$ sed "s/\(\['password'\] = \"\)\(\";\)/\1$PASS\2/g" file
The string: ['password'] = "foo"; needs to be replaced

$ PASS='foo/bar'
$ awk -v pass="$PASS" '{$0=gensub(/(\[\047password\047] = \")/,"\\1"pass,"g")}1' file
The string: ['password'] = "foo/bar"; needs to be replaced
$ sed "s/\(\['password'\] = \"\)\(\";\)/\1$PASS\2/g" file
sed: -e expression #1, char 38: unknown option to `s'

您需要使用\047 或其他方法(例如,如果您愿意,可以使用'"'"')来表示单引号分隔的 awk 脚本中的单引号。

在没有 gensub() 的 awks 中,您只需使用 gsub() 代替:

awk -v pass="$PASS" '{pre="\\[\047password\047] = \""; gsub(pre,pre pass)}1' file

【讨论】:

    【解决方案2】:

    如果你想在sed中扩展变量,你必须使用双引号,所以像

    sed -i... "s/.../.../g" file
    

    也就是说,你不必转义那些单引号,你也可以使用组引用来节省一些输入。你可以试试:

    sudo sed -i '' "s/\(\['password'\] = \"\)\(\";\)/\1$PASS\2/g" /file.php
    

    【讨论】:

    • 像魅力一样工作......谢谢!
    • 请注意,如果 PASS 仅包含字母和数字,虽然它可以正常工作,但对于变量 PASS 的各种其他值,它会神秘地失败。例如用PASS='foo/bar' 试试。
    • @EdMorton 如果你很幸运的话,你会神秘地失败;如果提供密码的用户是恶意的,它也可以对 sed 命令进行任意注入。
    猜你喜欢
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 2011-01-15
    相关资源
    最近更新 更多