shell 将PHP代码段替换为curl命令的输出

gorkyyrv  于 7个月前  发布在  Shell
关注(0)|答案(1)|浏览(78)

我想写一个bash脚本来替换我的wp-config.phg文件中的以下PHP代码段:

/**#@+
 * Authentication unique keys and salts.
 *
 * Change these to different unique phrases! You can generate these using
 * the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}.
 *
 * You can change these at any point in time to invalidate all existing cookies.
 * This will force all users to have to log in again.
 *
 * @since 2.6.0
 */
define( 'AUTH_KEY',         'put your unique phrase here' );
define( 'SECURE_AUTH_KEY',  'put your unique phrase here' );
define( 'LOGGED_IN_KEY',    'put your unique phrase here' );
define( 'NONCE_KEY',        'put your unique phrase here' );
define( 'AUTH_SALT',        'put your unique phrase here' );
define( 'SECURE_AUTH_SALT', 'put your unique phrase here' );
define( 'LOGGED_IN_SALT',   'put your unique phrase here' );
define( 'NONCE_SALT',       'put your unique phrase here' );

/**#@-*/

这是我的尝试:

SALT=$(curl https://api.wordpress.org/secret-key/1.1/salt/)\
WP_ROOT=/var/www/html/123123
SALT_START='\/\\*\\*#@+';
SALT_END='\/\\*\\*#@-\\*\/';

sed -ne "/${SALT_START}/ {p; ${SALT}" -e ':a; n; /${SALT_END}/ {p; b}; ba}; p' ${WP-ROOT}/wp-config.php

但我得到了以下结果:

sed: -e expression #1, char 20: extra characters after command

我试着从这里复制和修改:
Replace delimited block of text in file with the contents of another file
但没有成功。

wvmv3b1j

wvmv3b1j1#

您的代码是:

SALT=$(curl https://api.wordpress.org/secret-key/1.1/salt/)\
WP_ROOT=/var/www/html/123123
SALT_START='\/\\*\\*#@+';
SALT_END='\/\\*\\*#@-\\*\/';

sed -ne "/${SALT_START}/ {p; ${SALT}" -e ':a; n; /${SALT_END}/ {p; b}; ba}; p' ${WP-ROOT}/wp-config.php

如果我们将sedcurl更改为echo '',然后运行,我们会看到:

-ne /\/\*\*#@+/ {p;  https://api.wordpress.org/secret-key/1.1/salt/WP_ROOT=/var/www/html/123123 -e :a; n; /${SALT_END}/ {p; b}; ba}; p ROOT/wp-config.php

这显然不是预期的命令。
有许多问题。

  • 第一行的结尾\表示未定义WP_ROOT(该行成为SALT=赋值的一部分
  • ${WP-ROOT}是一个输入错误,如果变量WP未设置,则返回“ROOT”
  • 一些你想要展开的变量在单引号内,因此保持不变
  • SALT_START(和SALT_END)中有太多的反斜杠
  • 如果附加了额外的命令(例如,BSD sed会将剩下的一行全部当作标签)
  • ${SALT}未扩展为有效的sed命令

更简单的代码是:

curl https://api.wordpress.org/secret-key/1.1/salt/ >saltfile

SaltStart='\/\*\*#@+'
SaltEnd='\/\*\*#@-\*\/'
WProot=/var/www/html/123123

sed "
    /$SaltStart/ r saltfile
    //,/$SaltEnd/ d
" "$WProot"/wp-config.php

rm saltfile
  • 保存curl输出
  • 如果识别到salt的开始,则包括salt文件的内容
  • 删除从salt start到salt end的行
  • 否则只打印这行
  • 完成后,删除saltfile

代码写入stdout。通过适当的错误检查,您可以将-i选项添加到sed中以就地更改文件
虽然我上面的代码回答了上述问题,但更有可能的是,人们希望能够重复该命令来加载新的机密。然而,上面的代码删除了标记线,所以这不会起作用。
看看wordpress url的salt输出,我们看到只生成了定义行,所以只有那些行应该在配置文件中被替换。
如果OS/sed支持以/dev/stdin的形式访问标准输入,那么在没有临时文件(或错误检查!)的情况下,),可以:

curl https://api.wordpress.org/secret-key/1.1/salt/ |
sed '
    /$SaltStart/,/$SaltEnd/ ! b
    /^define/ ! b
    r /dev/stdin
    d
' "$WProot"/wp-config.php
  • 如果不在标记的部分,只需将线穿过
  • 如果没有定义,则只需通过行
  • 否则,添加curl输出中的内容
  • 并删除原始行

这依赖于一个技巧:/dev/stdin被包含在每一个define行中,但是数据已经被第一个包含所消耗,所以多个副本不会出现在输出中。(如果使用“真实的”文件名,这将不是真的,因为sed每次都会简单地重新打开并查找到开头)。

相关问题