2012-07-21 58 views
9

有沒有辦法通過將其管道輸入到fabric的遠程shell的標準輸入來執行多行shell腳本?或者我必須總是將它寫入遠程文件系統,然後運行它,然後刪除它?我喜歡發送給stdin,因爲它避免了臨時文件。如果沒有結構API(似乎沒有基於我的研究),大概我可以直接使用ssh模塊。基本上我希望fabric.api.run不限於作爲命令行參數傳遞給shell的單行命令,而是將一個完整的多行腳本寫入遠程shell的標準輸入。使用結構和管道腳本文本運行shell腳本到shell的標準輸入

爲了澄清我想面料相當於此命令行的:

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

除了在Python腳本源折軸將不是來自本地文件系統上的文件時,這純粹是一個多行字符串記憶。請注意,這是一個單一的邏輯操作,遠程端沒有臨時文件,這意味着意外的故障和崩潰不會離開孤立文件。如果在結構中存在這樣的選項(這就是我所問的),那麼在任何一方都不需要臨時文件,這隻需要一個單獨的ssh操作。

+0

爲什麼不這樣做的run(「命令1 &&命令2 && command2的」 ')? – Tshepang 2012-07-30 21:37:21

+4

因爲A)不容易讀取或寫入或維護爲shell-in-python代碼,B)&&以您可能或不想要的方式影響您的代碼流; C)世界已經充滿現有的shell我想通過結構運行腳本而不將它們轉換爲單行。 – 2012-07-30 22:23:45

回答

0

沒有內置的方法來做到這一點。你可以儘管編程:

from fabric.api import run 

scriptfilehandle = open('myscript.sh') 
for line in scriptfilehandle: 
    run(line) 
+5

這是行不通的。通過爲每一行調用一個新的shell進程,您不能在if/for/while塊中運行多行。 – 2012-08-17 13:31:58

+1

好點。當然,我的答案假定腳本由簡單的命令組成,沒有真正的邏輯。我的建議仍然存在,你可以將工作分成不同的部分並單獨運行。 – 2012-09-11 16:08:58

+1

但實際上,我會說你自己建議的'放入'文件比遠程執行文件更好。也許你可以澄清爲什麼這不是一個選項? – 2012-09-11 16:11:02

2

如果腳本是在一個文件中,你可以讀取它,那麼它的內容傳遞給run。重寫Jasper的例子:

from fabric.api import run 

script_file = open('myscript.sh') 
run(script_file.read()) 
script_file.close() 
+1

是的,但結構與遠程寫入文件,然後運行它,然後刪除它作爲3個單獨的操作。 – 2013-03-25 19:54:03

3

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

將腳本文件複製到遠程路徑,然後執行它。

,或者

你可以使用fabric.operations.open_shell,但只會工作,爲一系列簡單命令,涉及邏輯流程腳本,它是更好地使用投入運行並執行腳本就像你在一個地方做服務器。

1

這是值得的,這工作得很好。它使用python的多行字符串符號'''和bash的換行符(換行符前爲\)。您可以使用分號分隔獨立的線路,或只是管道操作,如&&

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

這裏的輸出我得到:

[[email protected]:49300] run: echo hello;  echo testing;  echo is this thing on?; 
[[email protected]:49300] out: hello 
[[email protected]:49300] out: testing 
[[email protected]:49300] out: is this thing on? 
[[email protected]:49300] out: 

[[email protected]:49300] run: echo hello &&  echo testing &&  echo is this thing on? 
[[email protected]:49300] out: hello 
[[email protected]:49300] out: testing 
[[email protected]:49300] out: is this thing on? 
[[email protected]:49300] out: 
+0

如何在多行運行命令中傳遞自定義輸入/變量值? – Spike 2016-08-31 06:11:46