Python Fabric 套件 使用程式碼透過 SSH 執行指令、上傳檔案

筆者使用 Paramiko 達成一些透過程式碼執行遠端 Linux 上的一些繁瑣指令後,一直在研究該如何解決 sudo 的問題,Linux 在一般使用者中如果使用 sudo 加上要執行的指令,就可以臨時取得 root 權限,只是需要輸入密碼。這個問題卡了一段時間後發現在 StackOverFlow 上看到有人說 Paramiko 居然把這個問題留給使用者自己解決,筆者就想到說是不是其實有別的套件可以使用?

在鍵盤上劈哩啪啦後,筆者就找到了本文要介紹的 fabric 這個套件。這個套件是建立在剛剛提到的 Paramiko 和 Invoke 套件之上,程式碼簡化了很多,使用起來更加的方便,而在 GitHub 上的 Star 也超過了那兩個套件的總和(在筆者撰文的當下 fabric 14.6k, Paramiko 8.8k, Invoke 4,2k)

安裝

    
pip install fabric
    

最簡單示範

    
from fabric import Connection

host = "192.168.0.100"
port = 22
username = "user"
password = "AABBC1233"

conn = Connection(host=host, port=port, user=username, connect_kwargs={"password": password})

result = conn.run("ls -l")
print(result.stdout)

conn.close()
    

自動輸入密碼

如果直接使用 .run 遇到要輸入密碼的部分會直接出現錯誤:
    
result = conn.run("sudo apt-get update")

# sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
# sudo: a password is required
# Traceback (most recent call last):
    

這時候就可以直接使用 .sudo 執行,然後後面帶入 password 參數達成自動輸入密碼:
    
result = conn.sudo("apt-get update", password=password)

# 指令前面加上 sudo 也可以正常執行
# result = conn.sudo("sudo apt-get update", password=password)
    

輸出結果:
    
[sudo] password: Hit:1 http://tw.archive.ubuntu.com/ubuntu jammy InRelease
Hit:2 http://tw.archive.ubuntu.com/ubuntu jammy-updates InRelease
Hit:3 http://tw.archive.ubuntu.com/ubuntu jammy-backports InRelease
Hit:4 http://tw.archive.ubuntu.com/ubuntu jammy-security InRelease
Hit:5 https://download.docker.com/linux/ubuntu jammy InRelease
    

上傳單個檔案

    
local_path = "C:/Users/ruyut/test.txt"

remote_path = "test.txt"

result = conn.put(local_path, remote_path)
print("Uploaded {0.local} to {0.remote}".format(result))
    

輸出結果:
    
Uploaded C:\Users\ruyut\test.txt to /home/ruyut/test.txt
    


註:在 Fabric2 中並沒有辦法上傳資料夾

參考資料:
GitHub - fabric/fabric
GitHub - paramiko/paramiko
GitHub - pyinvoke/invoke

留言