<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python遠(yuǎn)程連接服務(wù)器用它就夠了

          共 3036字,需瀏覽 7分鐘

           ·

          2021-12-10 13:44


          添加微信號(hào)"CNFeffery"加入技術(shù)交流群

          ?

          本文示例代碼及文件已上傳至我的Github倉(cāng)庫(kù)https://github.com/CNFeffery/DataScienceStudyNotes

          ?

          1 簡(jiǎn)介

          日常工作中經(jīng)常需要通過(guò)SSH連接到多臺(tái)遠(yuǎn)程服務(wù)器來(lái)完成各種任務(wù),當(dāng)需要操作的服務(wù)器眾多,且要執(zhí)行的任務(wù)涉及命令繁多時(shí),如果可以以自動(dòng)化的方式模擬SSH連接及執(zhí)行命令的繁瑣過(guò)程,對(duì)工作效率的提升是非常可觀的。

          本文我就將帶大家學(xué)習(xí)在Python中使用非常強(qiáng)大的fabric庫(kù)來(lái)對(duì)常用的遠(yuǎn)程服務(wù)器連接管理操作進(jìn)行自動(dòng)化??:

          2 使用fabric玩轉(zhuǎn)遠(yuǎn)程服務(wù)器管理

          fabric基于強(qiáng)大的paramikoinvoke等庫(kù),構(gòu)建出一整套簡(jiǎn)單易用的API,使得我們使用簡(jiǎn)潔的語(yǔ)句就可以應(yīng)付常見的各種遠(yuǎn)程服務(wù)器操作,使用pip install fabric完成安裝,本文演示對(duì)應(yīng)版本為2.6

          2.1 連接到遠(yuǎn)程服務(wù)器并執(zhí)行終端命令

          要建立并保持對(duì)遠(yuǎn)程服務(wù)器的連接,我們需要對(duì)fabric.Connection()進(jìn)行實(shí)例化,其基礎(chǔ)參數(shù)有:

          • 「host:」?str型,格式如'用戶名@host:端口',其中':端口'部分可以省略,默認(rèn)端口為22

          • 「connect_kwargs:」?dict型,用于傳入其他連接所需參數(shù),常用的有:

            其他可用參數(shù)你可以前往https://docs.paramiko.org/en/latest/api/client.html#paramiko.client.SSHClient.connectParameters了解更多

            • 「password:」?str型,當(dāng)以密碼方式連接時(shí),用于傳入與host參數(shù)對(duì)應(yīng)的密碼
            • 「pkey:」?str型,當(dāng)以私鑰方式連接時(shí),用于設(shè)置對(duì)應(yīng)密鑰
            • 「timeout:」?float型,用于設(shè)置TCP連接的超時(shí)時(shí)長(zhǎng)(單位:秒)
          • 「config:」?fabric.Config型,用于設(shè)置更多復(fù)雜功能參數(shù),詳見https://docs.fabfile.org/en/2.6/api/config.html

          先來(lái)看一個(gè)最基礎(chǔ)的例子:

          from?fabric?import?Connection

          #?建議將ssh連接所需參數(shù)變量化
          user?=?'用戶名'
          host?=?'host地址'
          password?=?'密碼'


          #?利用fabric.Connection快捷創(chuàng)建連接
          c?=?Connection(host=f'{user}@{host}',
          ???????????????connect_kwargs=dict(
          ???????????????????password=password
          ???????????????))

          #?利用run方法直接執(zhí)行傳入的命令
          c.run('pwd');

          可以看到,非常簡(jiǎn)單就完成了連接服務(wù)器及執(zhí)行指定命令的過(guò)程,且run()方法所執(zhí)行的命令打印出的結(jié)果,可以通過(guò)stdout屬性進(jìn)行保存:

          #?hide=True抑制run()過(guò)程對(duì)執(zhí)行結(jié)果的自動(dòng)打印
          output?=?c.run('df?-h',?hide=True).stdout
          print(output)

          獲悉了fabric的基礎(chǔ)使用后,接下來(lái)我們來(lái)學(xué)習(xí)一些進(jìn)階內(nèi)容:

          2.2 配置sudo命令密碼自動(dòng)預(yù)填入

          我們都知道,對(duì)于非root用戶,在執(zhí)行某些權(quán)限較高的命令時(shí)需要添加sudo前綴,并在會(huì)話的初次執(zhí)行時(shí)需要手動(dòng)輸入當(dāng)前用戶的密碼,而在fabric中,有兩種方式可以實(shí)現(xiàn)這個(gè)步驟的自動(dòng)化:

          2.2.1 方式1:配合invoke.Responder

          我們可以配合invoke.Responder來(lái)實(shí)現(xiàn)當(dāng)命令行返回密碼輸入提示時(shí),自動(dòng)輸入并執(zhí)行指定的命令:

          from?invoke?import?Responder

          #?配置命令行內(nèi)容監(jiān)聽規(guī)則
          sudopass?=?Responder(
          ????pattern=f'\[sudo\]?password?for?{user}:',
          ????response=password+'\n'
          )

          #?注意需要設(shè)置pty=True
          c.run('sudo?pwd',?pty=True,?watchers=[sudopass]);

          2.2.2 方式2:利用fabric.Config設(shè)置sudo密碼

          除了上一種方式外,我們還可以使用fabric.Config在創(chuàng)建連接時(shí)就一次性提前配置好sudo密碼,之后需要執(zhí)行sudo命令時(shí)用sudo()方法代替run()方法即可:

          from?fabric?import?Config

          #?預(yù)先配置sudo密碼
          config?=?Config(overrides={
          ????'sudo':?{
          ????????'password':?password
          ????}
          })

          c?=?Connection(host=f'{user}@{host}',?
          ???????????????connect_kwargs={'password':?password},
          ???????????????config=config)

          c.sudo('pwd');

          2.3 遠(yuǎn)程文件傳輸

          很多朋友都知道可以使用pscpxshell之類的工具手動(dòng)進(jìn)行服務(wù)器與本地之間的文件相互傳輸,這些任務(wù)我們同樣可以在fabric中自動(dòng)化進(jìn)行:

          2.3.1 從本地上傳文件到服務(wù)器

          使用put()方法可以將指定的本地文件上傳至服務(wù)器的指定位置,remote參數(shù)對(duì)應(yīng)服務(wù)器目標(biāo)保存位置:

          c?=?Connection(host=f'{user}@{host}',?
          ???????????????connect_kwargs={'password':?password})

          #?創(chuàng)建示例文件
          with?open('file_transfer.txt',?'w')?as?d:
          ????d.write('1')

          #?利用put方法上傳至服務(wù)器
          c.put('file_transfer.txt',?remote='/home/feffery/')

          #?打印已上傳文件內(nèi)容
          c.run('cat?/home/feffery/file_transfer.txt');

          2.3.2 從服務(wù)器下載指定文件到本地

          相反的,當(dāng)我們需要從服務(wù)器取回指定文件到本地時(shí),就可以使用get()方法:

          c?=?Connection(host=f'{user}@{host}',?
          ???????????????connect_kwargs={'password':?password})

          #?向文件末尾追加行
          c.run('echo?"\n2"?>>?file_transfer.txt')

          c.get('/home/feffery/file_transfer.txt')

          print(open('file_transfer.txt').read())

          以上就是本文的全部?jī)?nèi)容,歡迎在評(píng)論區(qū)與我進(jìn)行討論~

          加入知識(shí)星球【我們談?wù)摂?shù)據(jù)科學(xué)】

          400+小伙伴一起學(xué)習(xí)!








          · 推薦閱讀?·

          geopandas 0.10版本重磅新特性一覽

          geopandas輕松繪制交互式在線地圖

          pandas常用字符串處理方法看這一篇就夠了


          瀏覽 41
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  绿帽娇妻3p粗大单男在线视频 | 天天5G天天爽麻豆视频 | 国产一级片免费看 | 免费成人性爱网站 | 欧美精品乱码99久久蜜桃 |