Bash 从变量注入

Bash injection from variable

我有一段代码在非常远程的服务器上工作

ID=555
SLEEP_TIME=`ssh user@192.168.1.1 "cat /tmp/$ID.sleep; date >> /tmp/$ID.log"`
echo SLEEP_TIME $SLEEP_TIME
sleep $SLEEP_TIME

是的,$SLEEP_TIME 周围没有引号。 ssh user@192.168.1.1 工作正常,没有密码,按键。 我看到 /tmp/555.log 正在刷新。 抱歉,我失去了对这个远程服务器的控制(上面的代码是 运行 by cron)在 sshd 配置中犯了错误。 但我控制服务器 192.168.1.1,我可以将任何内容放入 /tmp/555.sleep = $SLEEP_TIME 变量 我如何将一些代码注入 $SLEEP_TIME 变量强制远程服务器执行它?

这是 100% 合法的。两台服务器都属于我公司。请救救我! 事实上,我失去了对远程服务器的控制,因为我使用了复杂的端口转发技巧来访问它,因为它的 IP 被 NAT 了几次。

由于SLEEP_TIME只是一个变量,并没有被执行,我认为没有办法做到这一点。所以不行,据我所知没有办法,抱歉。

How can I inject some code to $SLEEP_TIME variable forcing remote server to exec it?

你不能。 Shell expansion 每个命令发生一次。 Shell 扩展 执行shell 参数扩展 命令替换。它同时发生。你不能两者都做。您不能先扩展一个变量,然后再将其扩展为 运行 命令替换,因为这是两次扩展。来自 here.

(有人可能会争辩说 重定向 发生在 shell 扩展 之后 bash 每 this,但一个简单的测试表明这不是真的。不知道这是不是故意的。但是 Bash 手册不是为语言层编写的。这就是为什么它是 'manual',而不是 [=36] =].)

引号用于禁止分词。您唯一可以做的就是通过将无法解析的参数传递给 sleep 或将两个或更多参数传递给 sleep.

让您的脚本出错

另外请不要使用反引号 ` ` 进行命令替换。它们已被弃用,无法嵌套,不可读且看起来很丑陋。使用 $(...).