2016-10-14 63 views
-1

背景
我工作的一個bash腳本來拉的序列號和部件號從一個服務器機架上的所有設備,我的目標是能夠運行單腳本(inventory.sh),然後走開,同時生成包含我需要的信息的文本文件。我使用bash來實現最大程度的兼容性,RHEL 6.7系統確實安裝了Perl和Python,但它們只有最少的庫。到目前爲止,我還沒有使用bash之外的任何東西,但我並不反對從我的bash腳本中調用Perl或Python腳本。序列號

我的問題
我需要從內部設備在Dot Hill的系統AssuredSAN 3824驅動器,以及在序列號獲取序列號和部件號。我發現得到我需要的所有信息的唯一途徑就是通過SSH連接並運行以下三個命令的輸出傾銷到本地文件:

  • 顯示控制器
  • 顯示的FRU
  • 顯示盤

限制:

  • 我沒有「SSH通過「安裝,並且寧願不安裝它。
  • 控制器無法存儲SSH密鑰(在自定義shell中沒有選項)。
  • 控制器也無法寫入或傳輸本地文件。
  • 機架無法訪問互聯網。
  • 我看着paramiko,但是當安裝Python時,我沒有點子。
  • 我也不能使用CPAN。
  • 對於它的價值,輸出以XML格式返回。 (我已經寫了代碼解析它在bash中)

現在我認爲我最好的選擇是在我的其他腳本的文件夾中有一個Python或Perl庫,然後編寫腳本將命令的輸出轉儲到我可以用我的bash腳本解析的文件。哪種語言更容易在文件中提供庫?我正在尋找一個儘可能小而簡單的庫來使用。我只需要一種方法來獲得這些命令的輸出到XML文件。現在我只在腳本中使用ssh 3次,每次都必須輸入密碼。

+0

爲了避免在每個SSH密碼密鑰連接,你可以把你的本地用戶的公共SSH密鑰(如'的〜/ .ssh/id_rsa.pub')到遠程用戶的'的.ssh/autorized_keys'文件。然後,例如, 'ssh remote_user @ remote_host「show controllers」'。這不適合你嗎? – PerlDuck

+0

圖書館的建議在這裏專門討論。請查看[幫助/在線主題],瞭解可在此處詢問哪些主題。無論如何,你的問題是相當廣泛的。說了這麼多,一個可能有用的庫是[pyexpect](https://pexpect.readthedocs.io/en/stable/),它可以讓你啓動你的ssh,運行命令並獲得輸出。祝你好運! – kaylum

+0

@PerlDuck遠程系統沒有運行完整的Linux shell,它是爲控制器本身編寫的自定義shell。不幸的是,shell並沒有給我任何文件系統級別的訪問權限,所以在遠程系統中添加密鑰不是一種選擇。不過,我是如何從機架中的Linux服務器獲取信息的。 – L0krin

回答

0

我最終聯繫了製造商並詢問我的問題。他們表示,系統沒有設置爲沒有密碼連接,他們的SNMP是非常基本的,不會提供我需要的信息。他們表示通過FTP連接到系統,並使用「獲取日誌」下載配置和日誌的存檔。不完全理想,因爲它需要4分鐘才能運行那一個命令,但它似乎是我唯一的選擇。以下是我通過向.netrc文件添加登錄憑證來自動檢索文件的腳本。這適用於RHEL 6。7:

#!/bin/bash 
#Retrieve the logs and configuration from a Dot Hill Systems AssuredSAN 3824 automatically. 
#Modify "LINE" and "HOST" to fit your configuration. 
LINE='machine <IP> login manage password <password>' 
HOST='<IP>' 
AUTOLOGIN="/root/.netrc" 
FILE='logfiles.zip' 
#Check for and verify the autologin file 
if [ -f $AUTOLOGIN ]; then 
    printf "Found auto-login file, checking for proper entry... \r" 
    READLINE=`cat $AUTOLOGIN | grep "$LINE"` 
    #Append the line to the end of .netrc if file exists but not the line. 
    if [ "$LINE" != "$READLINE" ]; then 
     printf "Proper entry not found, creating it...      \r" 
     echo "$LINE" >> "$AUTOLOGIN" 
    else 
     printf "Proper entry found...          \r" 
    fi 
#Create the Autologin file if it doesn't exist 
else 
    printf "Auto-Login file does not exist, creating it and setting permissions...\r" 
    echo "$LINE" > "$AUTOLOGIN" 
    chmod 600 "$AUTOLOGIN" 
fi 
#Start getting the information from the controller. (This takes a VERY long time) 
printf "Retrieving Storage Controller data, this will take awhile...    \r" 
ftp $HOST << SCRIPT 
get logs $FILE 
SCRIPT 
exit 0 

這給了我一大堆zip文件,但我需要的只是「store _.... logs」文件。它大約有500,000行,第一部分是XML格式的整個配置,然後是文本格式的配置,接着是系統中的日誌。我解析了這個文件,並在最後刪除了將文件減少到15,000行的日誌。從那裏我把它分成兩個文件(config.xml和config.txt)。然後,我將我需要的3個命令的XML輸出以及我之前編寫的腳本搜索的3個文件。現在我的廣告資源腳本會提取所需的所有內容,儘管由於系統等待4分鐘以生成zip文件而非常緩慢。我希望這可以幫助未來的人。

編輯:
等待系統編譯4分鐘時間過長。所以我最終使用paramiko和python腳本將命令的輸出轉儲到其他代碼可以解析的文件中。它接受控制器的IP作爲參數。這是有興趣的人的腳本。再次感謝您的幫助。

#!/usr/bin/env python 
#Saves output of "show disks" from the storage Controller to an XML file. 

import paramiko 
import sys 
import re 
import xmltodict 

IP = sys.argv[1] 
USERNAME = "manage" 
PASSWORD = "password" 
FILENAME = "./logfiles/disks.xml" 

cmd = "show disks" 

client = paramiko.SSHClient() 
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
try: 
     client.connect(IP,username=USERNAME,password=PASSWORD) 
     stdin, stdout, stderr = client.exec_command(cmd) 
except Exception as e: 
     sys.exit(1) 

data = "" 
for line in stdout: 
    if re.search('#', line): 
     pass 
    else: 
     data += line 
client.close() 

f = open(FILENAME, 'w+') 
f.write(data) 
f.close() 

sys.exit(0) 
0

看看SNMP。您可以使用SNMP工具遠程提取所需的信息。製造商應該能夠爲您提供MIB。

+0

我使用了「snmpwalk」,然後在輸出中搜索已知值,例如從我丟棄的XML文件中提取的序列號,但沒有出現。不幸的是,該系統的SNMP對象數量非常有限。 我決定給sshpass一個嘗試,它甚至不會進行身份驗證。我在一臺普通的Linux服務器上進行了測試,結果非常好,所以這種存儲控制器的CLI有所不同。 – L0krin

+0

快速搜索顯示[此文檔](https://crc.dothill.com/access/content/group/CRC/Documentation/AssuredSAN%20Ultra48%20Series/DH_RAIDar_UG_83-00006696-11-01-A.pdf) AssuredSAN 4004.請看第130頁。它描述了FA MIB 2.2也應該適用於您的設備。你不會用標準的snpwalkm來訪問這個MIB,你將不得不知道它的位置來查詢它。 – Paranoid