【问题标题】:How to escape a Linux command which has all characters like single quote, double quote(',",`) in python?如何在python中转义具有单引号,双引号(',',`)等所有字符的Linux命令?
【发布时间】:2020-02-08 02:26:07
【问题描述】:

我有以下 Linux 命令,它提供 CPU%、RAM% 和硬盘百分比等指标。

echo "CPU `LC_ALL=C top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}'`% RAM `free -m | awk '/Mem:/ { printf("%3.1f%%", $3/$2*100) }'` HDD `df -h / | awk '/\// {print $(NF-1)}'`"

我想将它作为字符串存储在变量中。但是由于在 Linux 命令中使用了“,”,我无法存储。我怎样才能让它工作?

注意:我将其作为字符串存储在变量中,因为我想通过对服务器执行 ssh 并在 @987654321 的帮助下执行上述命令来检查 CPU%、RAM% 和硬盘百分比等指标python中的@库。

【问题讨论】:

  • 请注意,此命令非常复杂。只需一个 awk 调用就可以完成您依赖 grepsed 的所有工作,并且在大多数平台上,top 首先对于非交互式使用不是一个好的选择。
  • 此外,使用反引号会增加许多使用现代(作为 POSIX sh 标准的一部分于 1991 年发布)$(...) 命令替换语法不会遇到的复杂性。
  • 我的简单提示是在变量字符串上使用三引号: s = """ you comand " with any quote' " more command """ 。它用于多行字符串
  • @Wonka,不仅仅是 any 三引号字符串在这里工作;它必须是 raw 三引号字符串,因为文字字符串包含反斜杠文字。
  • @CharlesDuffy 感谢您对我使用的 Linux 命令的更好建议。因此,正如您向我建议的那样,您能否在此处使用一个高效的 Linux 命令发表评论,该命令给出了 CPU、RAM 和硬盘的使用百分比。

标签: python linux pexpect pxssh


【解决方案1】:

三引号原始字符串非常适合此目的

cmd = r'''
echo "CPU `LC_ALL=C top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}'`% RAM `free -m | awk '/Mem:/ { printf("%3.1f%%", $3/$2*100) }'` HDD `df -h / | awk '/\// {print $(NF-1)}'`"
'''

【讨论】:

  • 这将在字符串的开头和结尾添加\n,您应该将三引号放在与命令相同的行上。
  • @Silveris,这些换行符不会改变 shell 命令的含义;我积极推荐使用它们(与分号不同,它们仅在必要和适当时才会被视为命令分隔符,因此可以在可能组合或不组合多个 shell 命令时使用)。
  • @CharlesDuffy 是的,但如果有不同的目的,请注意它可能会很有用。
【解决方案2】:

你可以用\转义你的引号和双引号

【讨论】:

  • 对于此处的 OP 特定用例来说实际上还不够。在反引号内部(与现代替换 $( ... ) 不同),反斜杠的行为不同,需要加倍。当然,如果您不使用原始字符串,则文字反斜杠 also 需要在 Python 语法级别进行转义,超出所需的 shell 级别转义。
  • ...在回答问题时,为您提出的方法构建一个经过测试的特定实现会更有帮助——测试您的答案意味着您会发现任何与 OP 相关但被遗漏的细节.
  • @CharlesDuffy 这是真的,因为我试图用 \ 转义引号和双引号,但在这种情况下不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多