通过 SSH 转义的 Shell 字符串在不同服务器上的行为不同

问题描述 投票:0回答:1

我正在尝试创建一个可重用的脚本,该脚本将为远程 WordPress 站点 grep 一些配置值,但字符串似乎根据我连接到的服务器以不同的方式转义。如何创建一个在任何地方都以相同方式工作的命令?

例如,在主机 1 上,以下输出我想要的内容,即

some_database_name\nsome_database_user
:

ssh [email protected] "cat /some-path/wp-config.php | grep -E 'DB_NAME|DB_USER'"

但是,在主机 2 上,相同的命令不起作用,因为它输出

DB_NAME: command not found\nDB_USER: command not found
,就好像它试图在
grep -E
命令之后执行字符串:

ssh [email protected] "cat /some-path/wp-config.php | grep -E 'DB_NAME|DB_USER'"

虽然在我看来转义单引号似乎没有必要,但当我转义它们时,我得到了完全相反的行为,所以在主机1上我得到了“命令未找到”错误:

ssh [email protected] "cat /some-path/wp-config.php | grep -E \'DB_NAME|DB_USER\'"

在 Host 2 上我得到了我想要的结果:

ssh [email protected] "cat /some-path/wp-config.php | grep -E \'DB_NAME|DB_USER\'"

这两个命令如何根据它们运行的服务器而以不同的方式运行,以及如何将它们标准化为在两台主机上都可以使用一个命令?

编辑:

作为一个更简单的示例,在主机 1 上,

ssh [email protected] "echo \"'TEST'\""
按照我的预期输出
'TEST'
,但对于主机 2
ssh [email protected] "echo \"'TEST'\""
输出
TEST
,不带单引号。为什么会出现这种情况以及如何使这些行为相同?

bash shell
1个回答
0
投票

查尔斯·达菲(Charles Duffy)(一如既往!)是正确的,但我想为他的评论添加一个示例,以防不清楚。而不是:

ssh [email protected] "cat /some-path/wp-config.php | grep -E 'DB_NAME|DB_USER'"

你可以运行这个:

ssh [email protected] <<'EOF'
cat /some-path/wp-config.php | grep -E 'DB_NAME|DB_USER'
EOF

(使用

<<'EOF'
而不是
<<EOF
会抑制本地 shell 中的变量扩展,如果您的 shell 使用变量,这对于避免混淆非常重要。)

通过在 stdin 而不是在命令行上传递 shell 脚本,我们避免了围绕引用和标记化的许多问题,否则这些问题可能会使看似简单的脚本变得复杂。

© www.soinside.com 2019 - 2024. All rights reserved.