操作遠程機器主要使用的有paramiko,WMI(Windows Management Instrumentation),SMBConnection.
paramiko
paramiko使用SSH2協議操作遠程機器,是Python語言寫的一個模塊。
安裝
pip install paramiko
使用
使用主要包括執行命令,上傳文件和下載文件。
連接
有兩種方式連接到linux服務器。
方式一:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("某IP地址",22,"用戶名", "口令")
方式二:
t = paramiko.Transport(("主機","端口"))
t.connect(username = "用戶名", password = "口令")
如果連接遠程主機需要提供密鑰,上面第二行代碼可改為:
t.connect(username = "用戶名", password = "口令", hostkey="密鑰")
執行命令
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("某IP地址",22,"用戶名", "口令")
stdin, stdout, stderr = ssh.exec_command("你的命令")
print stdout.readlines()
ssh.close()
上傳文件
import paramiko
t = paramiko.Transport(("主機","端口"))
t.connect(username = "用戶名", password = "口令")
sftp = paramiko.SFTPClient.from_transport(t)
remotepath=’/var/log/system.log’
localpath=’/tmp/system.log’
sftp.put(localpath,remotepath)
t.close()
下載文件
import paramiko
t = paramiko.Transport(("主機","端口"))
t.connect(username = "用戶名", password = "口令")
sftp = paramiko.SFTPClient.from_transport(t)
remotepath=’/var/log/system.log’
localpath=’/tmp/system.log’
sftp.get(remotepath, localpath)
t.close()
WMI
WMI(Windows Management Instrumentation)用於管理windows機器。以下實例功能是執行遠程機器的bat文件。
import wmi
# 遠程執行bat文件
def call_remote_bat(ipaddress, username, password):
try:
pythoncom.CoInitialize()
# 用wmi連接到遠程服務器
c = wmi.WMI(computer=ipaddress, user=username, password=password)
filename = r"C:\auto_login.bat" # 此文件在遠程服務器上
# filename = r"C:\agent\dist\machine.exe" # 此文件在遠程服務器上
cmd_callbat = r"cmd /c call %s" % filename
c.Win32_Process.Create(CommandLine=cmd_callbat) # 執行bat文件 Win32_Process.Create
time.sleep(1)
except:
print('{}遠程執行失敗'.format(ipaddress))
pysmb
pysmb是客戶端SMB /CIFS協議(SMB1和SMB2)的純Python實現,它是便於在Windows機器之間進行文件共享和打印的底層協議,以及通過Samba服務器應用程序與Linux機器進行文件共享和打印。
- 使用pip安裝即可:pip install pysmb
- 需安裝Twisted依賴包: pip install Twisted
簡單使用
創建一個訪問對象,並建立連接.
from smb.SMBConnection import *
# username: 遠程主機用戶名 password: 遠程主機密碼
# my_name: 本機主機計算機名 remote_name: 遠程主機計算機名
# ip: 遠程主機ip
conn = SMBConnection(username, password, my_name, remote_name)
conn = conn.connect(ip)
常用方法。
- servuce_name: 共享文件夾的名稱
- path: 新文件夾(相對於)共享文件夾的路徑。如果路徑包含非英文字符,則必須使用unicode字符串來傳遞路徑。
- timeout: pysmb將等待的秒數。
- file_obj: 具有寫入方法的類文件對象。
1. 創建新目錄。
conn.createDirectory(service_name,path)
2. 刪除空文件夾。
conn.deleteDirectory(service_name,path)
3. 刪除文件。
conn.deleteFiles(service_name,path_file_pattern,timeout=30)
4. 重命名文件或文件夾。
# old_path: 舊文件名 new_path: 新文件名
conn.rename(service_name,old_path,new_path)
5. 獲取遠程主機的共享資源列表。
file_list = conn.listShares(timeout = 30)
# 遍歷獲取共享文件名
for file in file.list:
print(file.name)
6. 上傳文件到遠程主機。
conn.storeFile(service_name,path,file_obj, timeout=30)
實例
from smb.SMBConnection import *
def send_file(username, password, my_name, remote_name, ip, file_dir, file_dir_remote):
"""
pysmb下發腳本
:param username: 遠程主機用戶名
:param password: 遠程主機密碼
:param my_name: 本地計算機名
:param remote_name: 遠程計算機名
:param ip: 遠程ip
:param file_dir: 要傳輸的文件夾本地地址
:param file_dri_remote: 上傳位置相對於c盤的路徑
:return:
"""
try:
# 創建pysmb訪問對象
conn = SMBConnection(username, password, my_name, remote_name)
# 創建pysmb連接
conn.connect(ip)
# 提取文件名或目錄正則
pattern = re.compile(r'.*/(.*)')
# 讀取文件對象
file_obj = open(file_dir, 'rb')
# 遠程文件名
file_name = file_dir_remote + pattern.search(file_dir).group(1)
# 傳輸文件到遠程主機
conn.storeFile('C$', file_name, file_obj)
file_obj.close()
except:
print('{}遠程傳輸文件失敗'.format(ip))
time.sleep(1)
call_remote_bat(ip, username, password)
try:
conn.deleteFiles('C$', file_name)
except:
print('{}遠程刪除文件失敗'.format(ip))
conn.close()