1 回答

TA貢獻(xiàn)1712條經(jīng)驗(yàn) 獲得超3個(gè)贊
這里實(shí)際上有三種選擇:在進(jìn)程中做某事(如paramiko
)、ssh
直接運(yùn)行(使用subprocess
)和ssh
使用shell運(yùn)行(也使用subprocess
)。作為一般規(guī)則,避免以編程方式運(yùn)行 shell(而不是根據(jù)交互式用戶請(qǐng)求)。
原因是它是一個(gè)以人為本的界面(因此很容易將單詞與空格、快捷鍵$HOME
和通配符分開)作為 API 的功能大大不足。例如,考慮一下您的代碼如何檢測(cè)到ssh
丟失的情況:這種情況不會(huì)出現(xiàn)paramiko
(只要它已安裝),很明顯subprocess
,并且只是來自 shell 的(模棱兩可的)退出代碼和 stderr 消息。還要考慮如何提供要運(yùn)行的命令:它必須是適合 shell 的命令(由于 SSH 協(xié)議的限制),但如果ssh
使用shell 調(diào)用,則必須對(duì)其進(jìn)行編碼(有時(shí)稱為“雙重轉(zhuǎn)義”)以使本地 shell 的解釋成為遠(yuǎn)程 shell 所需的多字命令。
到目前為止,paramiko
幾乎subprocess
是等價(jià)的。作為一個(gè)更困難的情況,考慮密鑰驗(yàn)證失敗將如何表現(xiàn):paramiko
將失敗描述為data,而其他人將嘗試與用戶交互(可能存在也可能不存在)。 paramiko
還支持在一個(gè)經(jīng)過身份驗(yàn)證的連接上打開多個(gè)通道;ssh
這樣做也是如此,但只能通過ControlMaster
涉及 Unix 套接字文件的復(fù)雜配置(在某些部署中可能沒有任何好地方存在)。說到配置,如果在設(shè)計(jì)時(shí)沒有考慮到這種自動(dòng)化用例,您可能需要通過-F
以避免用戶的復(fù)雜性。.ssh/config
總之,庫是為像您這樣的用例而設(shè)計(jì)的,因此它們比從面向人類的命令組裝您自己的界面(盡管這種手動(dòng)組合非常有用)更好地工作也就不足為奇了,特別是對(duì)于邊緣情況可能!)。如果安裝一個(gè)非標(biāo)準(zhǔn)的依賴喜歡paramiko
是一種負(fù)擔(dān),至少直接使用subprocess
;去掉第二個(gè)殼已經(jīng)是很大的進(jìn)步了。
添加回答
舉報(bào)