14

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

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

ssh somehost /bin/sh < /tmp/test.sh

除了在 python 中,脚本源代码不会来自本地文件系统上的文件,它只是内存中的多行字符串。请注意,这是一个单一的逻辑操作,并且远程端没有临时文件,这意味着意外失败和崩溃不会留下孤立文件。如果fabric 中有这样的选项(这就是我要问的),则任何一方都不需要临时文件,而这只需要一个ssh 操作。

4

4 回答 4

5

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

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

或者,

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

于 2013-10-21T21:50:58.790 回答
2

如果脚本在文件中,您可以读取它,然后将其内容传递给run. 重写 Jasper 的例子:

from fabric.api import run

script_file = open('myscript.sh')
run(script_file.read())
script_file.close()
于 2013-03-25T18:29:05.227 回答
2

对于它的价值,这工作得很好。它使用 python 的多行字符串表示法'''和 bash 的换行符(\在换行符之前)。您可以使用分号来分隔独立的行或只是管道操作,如&&

run('''echo hello;\
  echo testing;\
  echo is this thing on?;''')
run('''echo hello && \
  echo testing && \
  echo is this thing on?''')

这是我得到的输出:

[root@192.168.59.103:49300] run: echo hello;      echo testing;      echo is this thing on?;
[root@192.168.59.103:49300] out: hello
[root@192.168.59.103:49300] out: testing
[root@192.168.59.103:49300] out: is this thing on?
[root@192.168.59.103:49300] out: 

[root@192.168.59.103:49300] run: echo hello &&       echo testing &&      echo is this thing on?
[root@192.168.59.103:49300] out: hello
[root@192.168.59.103:49300] out: testing
[root@192.168.59.103:49300] out: is this thing on?
[root@192.168.59.103:49300] out: 
于 2015-02-23T06:09:32.180 回答
0

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

from fabric.api import run

scriptfilehandle = open('myscript.sh')
for line in scriptfilehandle:
    run(line)
于 2012-08-17T11:37:36.153 回答