Python?遠(yuǎn)程連接服務(wù)器用它就夠了
時(shí)間:2021-12-07 11:07:47
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
[導(dǎo)讀]作者|費(fèi)弗里來源|Python大數(shù)據(jù)分析?本文示例代碼及文件已上傳至我的Github倉庫https://github.com/CNFeffery/DataScienceStudyNotes?1簡(jiǎn)介日常工作中經(jīng)常需要通過SSH連接到多臺(tái)遠(yuǎn)程服務(wù)器來完成各種任務(wù),當(dāng)需要操作的服務(wù)器眾...
作者 | 費(fèi)弗里
來源 | Python大數(shù)據(jù)分析 可以看到,非常簡(jiǎn)單就完成了連接服務(wù)器及執(zhí)行指定命令的過程,且 獲悉了 以上就是本文的全部?jī)?nèi)容,歡迎在評(píng)論區(qū)與我進(jìn)行討論~往期回顧資訊人工智能在數(shù)學(xué)領(lǐng)域?qū)崿F(xiàn)新發(fā)現(xiàn)和新見解資訊
AI監(jiān)視打工人,這個(gè)國家明確保護(hù)摸魚資訊全球首個(gè)活體機(jī)器人,能生娃技術(shù)Python實(shí)現(xiàn)人臉監(jiān)測(cè)制作摸魚神器
分享點(diǎn)收藏點(diǎn)點(diǎn)贊點(diǎn)在看
來源 | Python大數(shù)據(jù)分析
?本文示例代碼及文件已上傳至我的Github
倉庫https://github.com/CNFeffery/DataScienceStudyNotes?
1 簡(jiǎn)介
日常工作中經(jīng)常需要通過SSH
連接到多臺(tái)遠(yuǎn)程服務(wù)器來完成各種任務(wù),當(dāng)需要操作的服務(wù)器眾多,且要執(zhí)行的任務(wù)涉及命令繁多時(shí),如果可以以自動(dòng)化的方式模擬SSH
連接及執(zhí)行命令的繁瑣過程,對(duì)工作效率的提升是非??捎^的。本文我就將帶大家學(xué)習(xí)在Python
中使用非常強(qiáng)大的fabric
庫來對(duì)常用的遠(yuǎn)程服務(wù)器連接管理操作進(jìn)行自動(dòng)化:2 使用fabric玩轉(zhuǎn)遠(yuǎn)程服務(wù)器管理
fabric
基于強(qiáng)大的paramiko
、invoke
等庫,構(gòu)建出一整套簡(jiǎn)單易用的API
,使得我們使用簡(jiǎn)潔的語句就可以應(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.connect
的Parameters
了解更多 - 「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í)長(單位:秒) - 「config:」?fabric.Config型,用于設(shè)置更多復(fù)雜功能參數(shù),詳見
https://docs.fabfile.org/en/2.6/api/config.html
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');
run()
方法所執(zhí)行的命令打印出的結(jié)果,可以通過stdout
屬性進(jìn)行保存:#?hide=True抑制run()過程對(duì)執(zhí)行結(jié)果的自動(dòng)打印
output?=?c.run('df?-h',?hide=True).stdout
print(output)
fabric
的基礎(chǔ)使用后,接下來我們來學(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
來實(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)程文件傳輸
很多朋友都知道可以使用pscp
、xshell
之類的工具手動(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())
AI監(jiān)視打工人,這個(gè)國家明確保護(hù)摸魚資訊全球首個(gè)活體機(jī)器人,能生娃技術(shù)Python實(shí)現(xiàn)人臉監(jiān)測(cè)制作摸魚神器
分享點(diǎn)收藏點(diǎn)點(diǎn)贊點(diǎn)在看