Python遠程連接服務器用它就夠了

1 簡介

日常工作中經(jīng)常需要通過SSH連接到多臺遠程服務器來完成各種任務,當需要操作的服務器眾多,且要執(zhí)行的任務涉及命令繁多時,如果可以以自動化的方式模擬SSH連接及執(zhí)行命令的繁瑣過程,對工作效率的提升是非??捎^的。

本文我就將帶大家學習在Python中使用非常強大的fabric庫來對常用的遠程服務器連接管理操作進行自動化??:

2 使用fabric玩轉遠程服務器管理

fabric基于強大的paramiko、invoke等庫,構建出一整套簡單易用的API,使得我們使用簡潔的語句就可以應付常見的各種遠程服務器操作,使用pip install fabric完成安裝,本文演示對應版本為2.6。

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

要建立并保持對遠程服務器的連接,我們需要對fabric.Connection()進行實例化,其基礎參數(shù)有:

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

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

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

「password:」str型,當以密碼方式連接時,用于傳入與host參數(shù)對應的密碼

「pkey:」str型,當以私鑰方式連接時,用于設置對應密鑰

「timeout:」float型,用于設置TCP連接的超時時長(單位:秒)

「config:」fabric.Config型,用于設置更多復雜功能參數(shù),詳見https://docs.fabfile.org/en/2.6/api/config.html

先來看一個最基礎的例子:

fromfabricimportConnection

建議將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');

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

#?hide=True抑制run()過程對執(zhí)行結果的自動打印

output?=?c.run('df?-h',?hide=True).stdout

print(output)

獲悉了fabric的基礎使用后,接下來我們來學習一些進階內容:

2.2 配置sudo命令密碼自動預填入

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

2.2.1 方式1:配合invoke.Responder

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

frominvokeimportResponder

配置命令行內容監(jiān)聽規(guī)則

sudopass?=?Responder(

pattern=f'\[sudo\]?password?for{user}:',

response=password+'\n'

)

注意需要設置pty=True

c.run('sudo?pwd',?pty=True,?watchers=[sudopass]);

2.2.2 方式2:利用fabric.Config設置sudo密碼

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

fromfabricimportConfig

預先配置sudo密碼

config?=?Config(overrides={

'sudo':?{

'password':?password

}

})

c?=?Connection(host=f'{user}@{host}',

connect_kwargs={'password':?password},

config=config)

c.sudo('pwd');

2.3 遠程文件傳輸

很多朋友都知道可以使用pscp、xshell之類的工具手動進行服務器與本地之間的文件相互傳輸,這些任務我們同樣可以在fabric中自動化進行:

2.3.1 從本地上傳文件到服務器

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

c?=?Connection(host=f'{user}@{host}',

connect_kwargs={'password':?password})

?創(chuàng)建示例文件

withopen('file_transfer.txt','w')asd:

d.write('1')

?利用put方法上傳至服務器

c.put('file_transfer.txt',?remote='/home/feffery/')

打印已上傳文件內容

c.run('cat?/home/feffery/file_transfer.txt');

2.3.2 從服務器下載指定文件到本地

相反的,當我們需要從服務器取回指定文件到本地時,就可以使用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())

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容