使用python登錄遠程服務器并執(zhí)行命令和文件上傳下載的方法

Image

使用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é)果如下:

Image

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()

參考鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末项炼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子示绊,更是在濱河造成了極大的恐慌锭部,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件面褐,死亡現(xiàn)場離奇詭異拌禾,居然都是意外死亡,警方通過查閱死者的電腦和手機展哭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門湃窍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闻蛀,“玉大人,你說我怎么就攤上這事您市【跬矗” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵茵休,是天一觀的道長薪棒。 經(jīng)常有香客問我,道長榕莺,這世上最難降的妖魔是什么俐芯? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮钉鸯,結(jié)果婚禮上吧史,老公的妹妹穿的比我還像新娘。我一直安慰自己亏拉,他們只是感情好扣蜻,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著及塘,像睡著了一般莽使。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笙僚,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天芳肌,我揣著相機與錄音,去河邊找鬼肋层。 笑死亿笤,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的栋猖。 我是一名探鬼主播净薛,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蒲拉!你這毒婦竟也來了肃拜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤雌团,失蹤者是張志新(化名)和其女友劉穎燃领,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锦援,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡猛蔽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片曼库。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡区岗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凉泄,到底是詐尸還是另有隱情躏尉,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布后众,位于F島的核電站,受9級特大地震影響颅拦,放射性物質(zhì)發(fā)生泄漏蒂誉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一距帅、第九天 我趴在偏房一處隱蔽的房頂上張望右锨。 院中可真熱鬧,春花似錦碌秸、人聲如沸绍移。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹂窖。三九已至,卻和暖如春恩敌,著一層夾襖步出監(jiān)牢的瞬間瞬测,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工纠炮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留月趟,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓恢口,卻偏偏與公主長得像孝宗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子耕肩,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 本文長期更新因妇!M系列芯片的機型也適用 Xcode16 pod init等命令執(zhí)行出錯的請參考點擊這里這里這里這里[...
    小海豚丶閱讀 281,075評論 215 626
  • 上午:1無序列表 ul li 2有序列表 ol li 3定義列表 dl dt被定義的內(nèi)容 dd對定義內(nèi)容的描述 u...
    小湯源O閱讀 543評論 0 0
  • day 02 超鏈接標簽 1.用于定義一個可以點擊跳...
    李霜_9191閱讀 328評論 0 0
  • 最溫馨,最喜歡看疗。
    芷水之柔閱讀 160評論 0 0
  • 一只寵物貓不幸走丟了 两芳,它被賣到了一家寵物店 摔寨,它十分擔心自己的主人因為找不到它而思念成疾! 結(jié)果在第二天的清晨怖辆,...
    儀品君閱讀 1,114評論 0 6