当我使用 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 以自动化方式远程执行某些操作的需求。