2016-03-01 68 views
1

我的意圖:查找最近修改的文件和操縱輸出

  1. 查找已在最後2天被修改過的文件。

  2. 獲取每個文件的最後500行(因爲應用程序日誌文件很大)。

  3. 把每個尾部輸出放到一個不同的文件中(因爲我需要將它下載到遠程機器上)。

然後,我使用Python Fabric將這些文件從遠程計算機下載到本地計算機。

我能夠用做1和2:find /opt/tomcat/logs -mtime -2 -exec sudo tail -500 '{}' \;

我能夠用做2和3: 'sudo tail -500 ' + filename + ' | sudo tee ' + logfilename + '_tail'

我怎樣才能得到1,2和3完成1個命令本身?

我需要它在1命令中,因爲我正在使用Python sshcon.exec_command()在遠程計算機上執行此操作。

+0

編寫一個shell腳本並從Python調用它。 – Psytho

+0

我需要在多個服務器上執行上述操作...比將shell腳本上傳到每個服務器更簡單嗎? –

回答

0

編寫一個shell腳本來實現您想要的最終結果。

然後使用子流程模塊運行它。

確保,你是管道shell腳本,而subprocess.call()

import subprocess 
subprocess.call("sshpass -p pass ssh -o StrictHostKeyChecking=no \ 
       [email protected]_server_ip 'bash -s' < your_script.sh ",shell=True) 

比方說,你有一個腳本test_script.sh,你想三臺服務器(1.2.3.4,1.2.3.5上運行它, 1.2.3.6)。現在的做法應該是:

import subprocess 
servers = [1.2.3.4, 1.2.3.5, 1.2.3.6] 
for server in servers: 
    subprocess.call("sshpass -p password ssh -o StrictHostKeyChecking=no \ 
      [email protected]{0} 'bash -s' < test_script.sh ".format(server),shell=True) 

這將是綽綽有餘只要你有安裝sshpass來實現自己的目標了。

+0

我需要在多個服務器上執行這種操作......比上傳shell腳本到每個服務器更簡單的方法嗎? –

+0

您不需要按照上述方法將shell腳本上傳到每個服務器。你可以看到更新的答案。 –

+0

'call'的參數是單個命令;你會很好地將它標記爲一個列表並失去'icky'shell = True'。 – tripleee