筆者使用 Paramiko 達成一些透過程式碼執行遠端 Linux 上的一些繁瑣指令後,一直在研究該如何解決 sudo 的問題,Linux 在一般使用者中如果使用 sudo 加上要執行的指令,就可以臨時取得 root 權限,只是需要輸入密碼。這個問題卡了一段時間後發現在 StackOverFlow 上看到有人說 Paramiko 居然把這個問題留給使用者自己解決,筆者就想到說是不是其實有別的套件可以使用?
在鍵盤上劈哩啪啦後,筆者就找到了本文要介紹的 fabric 這個套件。這個套件是建立在剛剛提到的 Paramiko 和 Invoke 套件之上,程式碼簡化了很多,使用起來更加的方便,而在 GitHub 上的 Star 也超過了那兩個套件的總和(在筆者撰文的當下 fabric 14.6k, Paramiko 8.8k, Invoke 4,2k)
這時候就可以直接使用 .sudo 執行,然後後面帶入 password 參數達成自動輸入密碼:
輸出結果:
輸出結果:
註:在 Fabric2 中並沒有辦法上傳資料夾
參考資料:
GitHub - fabric/fabric
GitHub - paramiko/paramiko
GitHub - pyinvoke/invoke
在鍵盤上劈哩啪啦後,筆者就找到了本文要介紹的 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
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com