本文提供一個實用的 Python 腳本,透過 SSH 連線至多台遠端主機,並行統計指定目錄下的檔案數量,結果輸出為 CSV。使用 paramiko 建立 SSH 連線,multiprocessing.Pool 實現並行處理。
pip install paramiko
#!/usr/bin/python
# encoding=utf-8
import time, os, paramiko, multiprocessing
def get_total(ip, password, filepath):
paramiko.util.log_to_file('paramiko.log')
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
start = time.time()
ssh.connect(hostname=ip, port=22, username='root', password=password)
stdin, stdout, stderr = ssh.exec_command('cd %s; ls | wc -l' % filepath)
count = int(stdout.read().strip('\n'))
elapsed = time.time() - start
return '%s,%s,%d,%.2f\n' % (ip, filepath.strip('\n'), count, elapsed)
except Exception as e:
return '%s,%s,failed\n' % (ip, filepath.strip('\n'))
finally:
ssh.close()
# 讀取 IP 清單:每行格式 ip,password,path
iplist = open('ip.csv').readlines()
results = ['IP,FILEPATH,COUNT,TIMECOST\n']
pool = multiprocessing.Pool(processes=6)
for line in iplist:
ip, pwd, fp = line.split(',')
pool.apply_async(results.append, (get_total(ip, pwd, fp),))
pool.close()
pool.join()
# 寫入結果
fname = 'tongji_log_' + time.strftime('%Y%m%d%H%M%S') + '.csv'
with open(fname, 'w') as f:
f.writelines(results)
192.168.1.1,password1,/var/log
192.168.1.2,password2,/home/user/data
注意: 生產環境建議使用 SSH 金鑰認證而非密碼,並加入錯誤重試與逾時機制。