自定義構建互動式SSH應用程式,用Python為大家舉例
SSH的使用模式分兩種方式互動式和非互動式的模式。在自動化系統中,更常用的是非互動式SSH,自動化工具都是基於這種模式,比如ansiable和salt-ssh,還有檔案同步工具 rsync的SSH模式。本文我們就來說說互動式SSH應用的構建,並以Python為例實現了一個基本的互動式應用。 |
SSH的使用模式分兩種方式互動式和非互動式的模式。在自動化系統中,更常用的是非互動式SSH,自動化工具都是基於這種模式,比如ansiable和salt-ssh,還有檔案同步工具 rsync的SSH模式。本文我們就來說說互動式SSH應用的構建,並以Python為例實現了一個基本的互動式應用。
自定義
shell
在伺服器上,可以使用OpenSSH完成三個步驟來獲得 shell:身份驗證,shell會話和 命令。我們可以隨意配置shell(通過/etc/passwd)。例如,如果將使用者的登入shell設定為/usr/bin/cshell,登陸後,就會執行cshell(可以為自定義的互動式程式)。shell定義也非常簡單,只需以root許可權編輯/etc/passwd修改最後一個欄位為自定義的shell程式既可。如果使用者通過分配的TTY(預設情況下已完成)連線到伺服器,那就將能夠執行自定義的應用程式或互動式應用程式。
authorized_keys配置
需要注意的是,如果使用自定義的shell應用程式,無法接受使用者傳遞的額外 命令行引數,例如ssh user@host ls -a執行時會丟掉最後的-a引數。為了解決這個問題,需要通過覆蓋執行的命令方式,為了實現覆蓋執行命令的操作,我們可以使用使用者證照驗證檔案authorized_keys檔案。在該檔案每行之前,可以新增適用於使用該金鑰登入的使用者的選項。這些選項中有一個選項是"command"選項。比如給將/home/user/.ssh/authorized_keys新增一下語句:
command ="/usr/bin/Ccommand" ssh-rsa ... user
使用者的shell(可能應該是/bin/sh)就可以自動執行nethack,無論配置何種command,(如果需要,都儲存在環境中的SSH_ORIGINAL_COMMAND中)都會先執行。出於安全原因,一般會設定一下限制配置:
restrict,pty,command ="…" ssh-rsa ... user
更詳細的設定選項,可以參考sshd官方手冊。預設會限制關閉大多數東西,通過pty顯式重新啟用TTY分配,這樣就可以做自定義自己的終端應用(比如Python下curses編寫的應用)。我們再來看一個典型的gitlab下典型的多使用者限制登陸型的authorized_keys配置例項:
sshd_config配置
另一個可以用來配置啟動命令的地方sshd配置檔案:/etc/ssh/sshd_config。通過sshd_config的AuthorizedKeysCommand來配置額外執行命令。它設定執行任意程式,並從標準輸出stdout獲取authorized_keys檔案。比如可以配置為:
AuthorizedKeysCommand /usr/bin/Ccommand "%u" "%h" "%t" "%k" AuthorizedKeysUser root
上面配置中的格式字串的作用是為命令提供嘗試登入的使用者名稱(%u),使用者的主目錄(%h),正在使用的金鑰型別(%t,例如ssh-rsa)和用base64編碼的公鑰(%k)。這裡提供的金鑰可用於識別使用者,可以將使用者公鑰儲存在資料庫中,通過應用查詢並提供給sshd用於認證。可以在此處嵌入自定義的命令列應用。
Python互動式SSH例項
下面是一個一個簡單的的AuthorizedKeysCommand和python例項:
上面
指令碼中buildrht-shell命令告訴使用者使用ssh builds@buildhost connect 之類的命令進行連線,可以使用SSH_ORIGINAL_COMMAND變數來獲取其命令列:
然後是身份驗證,檢查其金鑰和連線:
互動式SSH中最重要的是對的輸入命令進行實時的反饋。tail程式就是用來實現這個功能構建和列印日誌給標準輸出:
以上我們就構建了一個自定義的個性化的互動式SSH應用例項。
原文地址:linuxprobe.com/ssh-python.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2657950/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用 IBM Bluemix 構建,部署和管理自定義應用程式IBM
- Python偏函式應用舉例-路燈指示牌Python函式
- scroll-view元件bindscroll例項應用:自定義滾動條View元件
- golang Context應用舉例GolangContext
- apiAutoTest:支援自定義函式,用例中可呼叫API函式
- AC-DMIS測量程式應用舉例
- 設計模式應用舉例設計模式
- Streamlit 快速構建互動式頁面的python庫Python
- 正規表示式理解及簡單應用舉例
- 一文搞懂SaaS應用架構:應用服務、應用結構、應用互動設計應用架構
- 使用 Dash 庫構建可互動的資料展示 Web 應用Web
- AI應用任何PDF轉換為互動式儀表盤AI
- 五、Spring Web應用程式構建SpringWeb
- JavaFX桌面應用-構建程式框架Java框架
- 自定義behavior-仿華為應用市場
- 用VIPER構建iOS應用iOS
- 一種使用 Redis 深度驅動的,為構建輕量級分散式應用程式(Microservices)的工程方案Redis分散式ROS
- mssql sqlserver in 關鍵字在值為null的應用舉例SQLServerNull
- 構建 API 應用API
- VBA 自定義常用函式 (備用)函式
- 動態原型和互動式應用程式建立軟體:Principle中文漢化原型
- Lua C++互動 應用例項步驟(UserData使用)C++
- 為什麼我牆裂建議大家使用列舉來實現單例。單例
- OpenHarmony自定義構建函式:@Builder裝飾器函式UI
- SpringBoot應用篇(一):自定義starterSpring Boot
- 使用汽車應用庫構建應用
- 使用 Redis 和 Python 構建一個共享單車的應用程式RedisPython
- 常用構建資料科學應用程式的七個Python庫資料科學Python
- 如何基於 Redis 構建應用程式元件Redis元件
- 使用Rust和WebAssembly構建Web應用程式RustWeb
- 使用微服務構建現代應用程式微服務
- 自定義元素探祕及構建可複用元件最佳實踐元件
- 用Java構建反應式REST API - Kalpa SenanayakeJavaRESTAPINaN
- 使用 webpack 構建應用Web
- 構建Data Agent:探討企業應用中基於大模型的互動式資料分析及方案大模型
- 自定義列舉
- 微信小程式API互動的自定義封裝微信小程式API封裝
- Netty系列文章之構建HTTP(HTTPS)應用程式NettyHTTP