使用fabric和管道脚本文本运行shell脚本到shell的stdin

Pet*_*ons 12 python fabric

有没有办法通过将它连接到远程shell在结构中的标准输入来执行多行shell脚本?或者我必须始终将其写入远程文件系统,然后运行它,然后删除它?我喜欢发送到stdin,因为它避免了临时文件.如果没有结构API(似乎没有基于我的研究),大概我可以直接使用ssh模块.基本上,我希望fabric.api.run不仅限于获取传递给shell作为命令行参数1行命令,而是会采取一个完整的多行脚本并将其写入到远程shell的标准输入.

为了澄清我想要这个命令行的结构等效:

ssh somehost /bin/sh < /tmp/test.sh
Run Code Online (Sandbox Code Playgroud)

除了在python中,脚本源coude不会来自本地文件系统上的文件,它只是内存中的多行字符串.请注意,这是一个逻辑操作,远程端没有临时文件,这意味着意外故障和崩溃不会留下孤立文件.如果在结构中有这样的选项(这就是我要问的问题),那么任何一方都不需要一个临时文件,这只需要一个ssh操作.

sab*_*488 5

您可以使用Fabric操作。您可以使用 fabric.operations.put(local_path, remote_path, use_sudo=False,mirror_local_mode=False,mode=None)

将脚本文件复制到远程路径,然后执行它。

要么,

您可以使用fabric.operations.open_shell,但这仅适用于一系列简单命令,对于涉及逻辑流的脚本,最好像在本地服务器上一样使用put操作并执行脚本。


Jas*_*sch 0

没有内置的方法可以做到这一点。不过你可以对其进行编程:

from fabric.api import run

scriptfilehandle = open('myscript.sh')
for line in scriptfilehandle:
    run(line)
Run Code Online (Sandbox Code Playgroud)

  • 这是行不通的。您无法通过为每行调用新的 shell 进程来运行多行 if/for/while 块。 (7认同)
  • 放置远程文件并执行它是一个选项,这是正常的结构方式。但是,使用直接 ssh,完全可以运行脚本,而无需两端都需要临时文件,这既更快又更安全。我有一些实验代码可以使用较低级别的 ssh 模块 API 在 Fabric 中执行此操作,并且这在技术上是可行的。我只需要找到一种干净的方法将其与织物结合起来。 (2认同)