我最終聯繫了製造商並詢問我的問題。他們表示,系統沒有設置爲沒有密碼連接,他們的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)
爲了避免在每個SSH密碼密鑰連接,你可以把你的本地用戶的公共SSH密鑰(如'的〜/ .ssh/id_rsa.pub')到遠程用戶的'的.ssh/autorized_keys'文件。然後,例如, 'ssh remote_user @ remote_host「show controllers」'。這不適合你嗎? – PerlDuck
圖書館的建議在這裏專門討論。請查看[幫助/在線主題],瞭解可在此處詢問哪些主題。無論如何,你的問題是相當廣泛的。說了這麼多,一個可能有用的庫是[pyexpect](https://pexpect.readthedocs.io/en/stable/),它可以讓你啓動你的ssh,運行命令並獲得輸出。祝你好運! – kaylum
@PerlDuck遠程系統沒有運行完整的Linux shell,它是爲控制器本身編寫的自定義shell。不幸的是,shell並沒有給我任何文件系統級別的訪問權限,所以在遠程系統中添加密鑰不是一種選擇。不過,我是如何從機架中的Linux服務器獲取信息的。 – L0krin