为什么远程 SSH 输出没有捕获“echo $SHELL”?

为什么远程 SSH 输出没有捕获“echo $SHELL”?

当我使用 cat 捕获远程 SSH 调用的输出时,无论是在 bash 还是在 Python 中,一切都按预期工作。

例如,这工作得很好:

import subprocess
rc = subprocess.getoutput(“ssh user@host; cat /proc/meminfo”)
print(rc)
>> MemTotal:        2048212 kB
MemFree:          202168 kB
MemAvailable:    1578308 kB
Buffers:          240876 kB
Cached:          1073456 kB
SwapCached:            0 kB
Active:          1049444 kB
…etc

然而,这不会产生任何结果:

import subprocess 
rc = subprocess.getoutput(“ssh user@host; echo $SHELL”)
>>

即使以同一用户身份通过​​ SSH 连接到机器并输入“echo $SHELL”也可以工作并输出到标准输出。

我在这里缺少什么?

在我的笔记中我有以下评论:

如果您想让任何本地环境变量可在 shell 脚本中使用,请使用 exec 命令启动该脚本。

直接从命令提示符运行脚本会为脚本生成一个新的子 shell,从而使 shell 中的任何本地环境变量对脚本不可用。

我是否需要使用“exec”才能从远程命令执行中使用这些环境变量?

请注意,这不仅仅是一个 Python 问题或 RHEL8 问题;它也可以在其他 Linux 变体上重现,包括 Ununtu。

谢谢。

答案1

在这两种情况下 ssh 连接终止然后执行第二个命令在本地机器上。例如你的/proc/meminfo输出是当地的机器而不是以任何方式从远程。

如果您想远程运行它,请使用:

ssh user@host cat /proc/meminfo- 注意缺少分号,它生成 ssh 客户端的“cat”和“/proc/meminfo”参数,从中构建然后远程运行的命令行。

第二种情况更加棘手。不仅分号使它在本地运行,而且替换顺序还加了五美分。在天真的变体中,它将在本地替换变量,然后将替换的命令发送到远程执行。为了使其完全按照需要运行,您需要压制本地替换,使用单引号:

ssh user@host echo '$SHELL'

(只需比较ssh user@host echo `hostname -f`一下ssh user@host echo '`hostname -f`'即可明白我的意思)。


看来你已经准备好学习了安西布尔,因为它意味着解决通过 SSH 以自动化方式远程执行某些操作的需求。

相关内容