当我使用 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。
谢谢。
在这两种情况下 ssh connecton 都会终止,第二个命令在本地机器上执行。例如,您的
/proc/meminfo
输出是本地机器的输出,而不是来自远程机器的输出。如果要远程运行它,请使用:
ssh user@host cat /proc/meminfo
- 注意缺少分号,这使得 ssh 客户端的“cat”和“/proc/meminfo”参数,它构造了远程运行的命令行。第二种情况更加棘手。不仅分号使它在本地运行,而且替换顺序也增加了它的 5 美分。在幼稚的变体中,它将在本地替换一个变量,然后将替换的命令发送到远程执行。要使其完全按需要运行,您需要禁止使用单引号的本地替换:
ssh user@host echo '$SHELL'
(只是比较一下
ssh user@host echo `hostname -f`
,ssh user@host echo '`hostname -f`'
看看我的意思)。看来您已经准备好学习Ansible 了,因为它旨在解决通过 SSH 以自动化方式远程执行某些操作的需求。