使用python登錄遠程服務器并執(zhí)行命令和文件上傳下載的方法
在Linux系統(tǒng)上寫了一些shell腳本沸手,但是我想在windows系統(tǒng)下進行調(diào)用往堡,并返回一些結(jié)果狈网。我不想頻繁登陸遠程服務去執(zhí)行一次命令舍哄,所以我搜索了一下python關(guān)于ssh登錄的庫,發(fā)現(xiàn)了一個非常好用的庫--->paramiko稍刀。paramiko是一個用于做遠程控制的模塊,使用該模塊可以對遠程服務器進行命令或文件操作,在運維方面非常有用敞曹。
1.paramiko庫的安裝
pip install paramiko
2.paramiko基于用戶名和密碼的 sshclient 方式登錄及公鑰秘鑰登錄進行命令操作
注意:paramiko.SSHClient().exec_command() 可以執(zhí)行一條命令账月;當執(zhí)行多條命令時,多條命令放在一個單引號下面异雁,各命令之間用英文分號隔開
import paramiko
private_key = paramiko.RSAKey.from_private_key_file('/home/python/.ssh/id_rsa')
# 創(chuàng)建SSH對象
ssh = paramiko.SSHClient()
# 允許連接不在know_hosts文件中的主機
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 連接服務器(根據(jù)自己的情況選擇)
# 戶名和密碼登錄
ssh.connect(hostname='192.168.2.45', port=22, username='root', password='123456')
# 公鑰秘鑰登錄
ssh.connect(hostname='192.168.2.45', port=22, username='root', pkey=private_key)
# 執(zhí)行命令
stdin, stdout, stderr = ssh.exec_command('ls -lah')
# 獲取命令結(jié)果
result = stdout.read().decode('utf-8')
# 輸出返回的結(jié)果
print(result)
# 關(guān)閉連接
ssh.close()
結(jié)果輸出為:
總用量 148K
drwxr-xr-x 21 python python 4.0K 3月 3 02:36 .
drwxr-xr-x 3 root root 4.0K 2月 2 04:12 ..
-rw------- 1 python python 2.9K 2月 19 22:00 .bash_history
-rw-r--r-- 1 python python 220 2月 2 04:12 .bash_logout
-rw-r--r-- 1 python python 3.7K 2月 2 04:12 .bashrc
drwx------ 17 python python 4.0K 3月 3 02:56 .cache
drwx------ 3 python python 4.0K 2月 2 04:40 .compiz
drwx------ 21 python python 4.0K 2月 3 03:40 .config
drwx------ 3 python python 4.0K 2月 2 05:01 .dbus
drwxr-xr-x 3 python python 4.0K 2月 3 04:49 Desktop
-rw-r--r-- 1 python python 25 2月 2 04:15 .dmrc
drwxr-xr-x 2 python python 4.0K 2月 2 04:15 Documents
drwxr-xr-x 2 python python 4.0K 2月 2 05:11 Downloads
-rw-r--r-- 1 python python 8.8K 2月 2 04:12 examples.desktop
drwx------ 2 python python 4.0K 3月 3 02:36 .gconf
drwx------ 3 python python 4.0K 3月 3 02:36 .gnupg
-rw------- 1 python python 4.7K 3月 3 02:36 .ICEauthority
drwx------ 3 python python 4.0K 2月 2 04:15 .local
drwx------ 5 python python 4.0K 2月 2 04:54 .mozilla
drwxr-xr-x 2 python python 4.0K 2月 2 04:15 Music
-rw------- 1 python python 47 2月 3 05:13 .mysql_history
-rw-r--r-- 1 python python 267 2月 2 05:26 .pam_environment
drwxr-xr-x 2 python python 4.0K 2月 2 04:15 Pictures
drwx------ 3 python python 4.0K 2月 3 03:35 .pki
drwx------ 2 python python 4.0K 2月 2 05:01 .presage
-rw-r--r-- 1 python python 655 2月 2 04:12 .profile
drwxr-xr-x 2 python python 4.0K 2月 2 04:15 Public
drwxrwxr-x 2 python python 4.0K 3月 3 02:36 .sogouinput
-rw-r--r-- 1 python python 0 2月 2 04:19 .sudo_as_admin_successful
drwxr-xr-x 2 python python 4.0K 2月 2 04:15 Templates
drwxr-xr-x 2 python python 4.0K 2月 2 04:15 Videos
-rw------- 1 python python 51 3月 3 02:36 .Xauthority
-rw-rw-r-- 1 python python 132 2月 2 05:20 .xinputrc
-rw------- 1 python python 84 3月 3 02:36 .xsession-errors
-rw------- 1 python python 1.5K 2月 19 22:00 .xsession-errors.old
3捶障。paramiko基于用戶名和密碼的 transport 方式登錄及公鑰秘鑰登錄進行命令操作
import paramiko
private_key = paramiko.RSAKey.from_private_key_file('/home/python/.ssh/id_rsa')
transport = paramiko.Transport(('192.168.3.54', 22))
# 連接服務器(根據(jù)自己的情況選擇)
# 戶名和密碼登錄
transport.connect(username='root', password='123456')
# 公鑰秘鑰登錄
transport.connect(username='root', password='123456',pkey=private_key)
# 創(chuàng)建SSH對象
ssh = paramiko.SSHClient()
ssh._transport = transport
# 執(zhí)行命令
stdin, stdout, stderr = ssh.exec_command('ls -lah')
# 輸出執(zhí)行結(jié)果
print(stdout.read().decode('utf-8'))
transport.close()
結(jié)果輸出為:
總用量 148K
drwxr-xr-x 21 python python 4.0K 3月 3 02:36 .
drwxr-xr-x 3 root root 4.0K 2月 2 04:12 ..
-rw------- 1 python python 2.9K 2月 19 22:00 .bash_history
-rw-r--r-- 1 python python 220 2月 2 04:12 .bash_logout
-rw-r--r-- 1 python python 3.7K 2月 2 04:12 .bashrc
drwx------ 17 python python 4.0K 3月 3 02:56 .cache
drwx------ 3 python python 4.0K 2月 2 04:40 .compiz
drwx------ 21 python python 4.0K 2月 3 03:40 .config
drwx------ 3 python python 4.0K 2月 2 05:01 .dbus
drwxr-xr-x 3 python python 4.0K 2月 3 04:49 Desktop
-rw-r--r-- 1 python python 25 2月 2 04:15 .dmrc
drwxr-xr-x 2 python python 4.0K 2月 2 04:15 Documents
drwxr-xr-x 2 python python 4.0K 2月 2 05:11 Downloads
-rw-r--r-- 1 python python 8.8K 2月 2 04:12 examples.desktop
drwx------ 2 python python 4.0K 3月 3 02:36 .gconf
drwx------ 3 python python 4.0K 3月 3 02:36 .gnupg
-rw------- 1 python python 4.7K 3月 3 02:36 .ICEauthority
drwx------ 3 python python 4.0K 2月 2 04:15 .local
drwx------ 5 python python 4.0K 2月 2 04:54 .mozilla
drwxr-xr-x 2 python python 4.0K 2月 2 04:15 Music
-rw------- 1 python python 47 2月 3 05:13 .mysql_history
-rw-r--r-- 1 python python 267 2月 2 05:26 .pam_environment
drwxr-xr-x 2 python python 4.0K 2月 2 04:15 Pictures
drwx------ 3 python python 4.0K 2月 3 03:35 .pki
drwx------ 2 python python 4.0K 2月 2 05:01 .presage
-rw-r--r-- 1 python python 655 2月 2 04:12 .profile
drwxr-xr-x 2 python python 4.0K 2月 2 04:15 Public
drwxrwxr-x 2 python python 4.0K 3月 3 02:36 .sogouinput
-rw-r--r-- 1 python python 0 2月 2 04:19 .sudo_as_admin_successful
drwxr-xr-x 2 python python 4.0K 2月 2 04:15 Templates
drwxr-xr-x 2 python python 4.0K 2月 2 04:15 Videos
-rw------- 1 python python 51 3月 3 02:36 .Xauthority
-rw-rw-r-- 1 python python 132 2月 2 05:20 .xinputrc
-rw------- 1 python python 84 3月 3 02:36 .xsession-errors
-rw------- 1 python python 1.5K 2月 19 22:00 .xsession-errors.old
4.paramiko基于用戶名和密碼的 transport 方式登錄及公鑰秘鑰登錄進行文件上傳下載操作
import paramiko
private_key = paramiko.RSAKey.from_private_key_file('/home/python/.ssh/id_rsa')
transport = paramiko.Transport(('192.168.3.54', 22))
# 連接服務器(根據(jù)自己的情況選擇)
# 戶名和密碼登錄
transport.connect(username='root', password='123456')
# 公鑰秘鑰登錄
transport.connect(username='root', password='123456',pkey=private_key)
sftp = paramiko.SFTPClient.from_transport(transport)
# 將C:\Users\liming\Desktop\python_projects\program\test\test.py 上傳至服務器 /home/python/test.py
local_path=r"C:\Users\liming\Desktop\python_projects\program\musics\test.py"
remote_path="/home/python/Desktop/test.py"
sftp.put(localpath, remotepath)
# 將remote_path下載到本地 local_path
sftp.get(remove_path, local_path)
transport.close()
結(jié)果如下:
5.對paramiko進行封裝,實現(xiàn)遠程命令執(zhí)行和文件上傳下載
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import paramiko
class SSHConnection:
"""
對paramiko進行封裝纲刀,實現(xiàn)遠程命令執(zhí)行和文件上傳下載
"""
def __init__(self, host='192.168.12.68', port=22, username='root', pwd='123456'):
self.host = host
self.port = port
self.username = username
self.pwd = pwd
self.__k = None
self.__transport = self.connect()
def connect(self):
"""
連接Linux服務器
:return: transport對象
"""
transport = paramiko.Transport((self.host, self.port))
transport.connect(username=self.username, password=self.pwd)
return transport
def upload(self, local_path, target_path):
"""
上傳本地文件到服務器上
:param local_path:本地計算機上的文件路徑
:param target_path:遠程服務器上的文件路徑
:return:無
"""
sftp = paramiko.SFTPClient.from_transport(self.__transport)
sftp.put(local_path, target_path)
def download(self, remote_path, local_path):
"""
將服務器上的文件下載到本地
:param remote_path:遠程服務器上的文件路徑
:param local_path:本地計算機上的文件路徑
:return: 無
"""
sftp = paramiko.SFTPClient.from_transport(self.__transport)
sftp.get(remote_path, local_path)
def cmd(self, command):
"""
在服務器上執(zhí)行shell命令
:param command:要執(zhí)行的命令
:return:執(zhí)行命令后的返回結(jié)果
"""
ssh = paramiko.SSHClient()
ssh._transport = self.__transport
# 執(zhí)行命令
stdin, stdout, stderr = ssh.exec_command(command)
# 獲取命令結(jié)果
result = stdout.read().decode("utf-8")
print(result)
return result
def close(self):
"""
關(guān)閉服務器連接
:return: 無
"""
self.__transport.close()
def main():
ssh = SSHConnection(host="192.168.56.136", port=22, username="root", pwd="123456")
ssh.cmd('ls -lah;cd /home/python/Desktop/prj/run.sh') # 執(zhí)行l(wèi)s -lah命令,并執(zhí)行run.sh腳本
ssh.upload(r'C:\Users\liming\Desktop\python_projects\program\test\test.py', '/home/python/Desktop/1.py') # 將本地的test.py文件上傳到遠端服務器的/home/python/Desktop目錄下并改名為1.py
ssh.download('/home/python/Desktop/1.py', 'testdownload.py') # 將遠端服務器的/home/python/Desktop目錄下的1.p下載到本地的test目錄下并改名為test.py
ssh.close() # 關(guān)閉連接
if __name__ == '__main__':
main()