自定義構建互動式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元件
- 自定義UDF函式應用異常函式
- SQLLOAD應用舉例SQL
- apiAutoTest:支援自定義函式,用例中可呼叫API函式
- AC-DMIS測量程式應用舉例
- 用於構建互動式圖表的最佳 jQuery 圖表庫jQuery
- 設計模式應用舉例設計模式
- golang Context應用舉例GolangContext
- Streamlit 快速構建互動式頁面的python庫Python
- 正規表示式理解及簡單應用舉例
- JavaFX桌面應用-構建程式框架Java框架
- 動態原型和互動式應用程式建立軟體:Principle中文漢化原型
- 用列舉來處理java自定義異常Java
- 用VIPER構建iOS應用iOS
- 使用汽車應用庫構建應用
- 構建 API 應用API
- Lotus C API Extension Manager 應用舉例API
- oracle rollup,cube子句的應用舉例;Oracle
- mssql sqlserver in 關鍵字在值為null的應用舉例SQLServerNull
- 五、Spring Web應用程式構建SpringWeb
- 如何構建 Android MVVM 應用程式AndroidMVVM
- 使用SignalR構建聊天應用程式SignalR
- 構建應用程式的正確方法
- css3自定義滾動條樣式程式碼例項CSSS3
- Python 自定義函式的特殊屬性(收藏專用)Python函式
- VBA 自定義常用函式 (備用)函式
- OpenHarmony自定義構建函式:@Builder裝飾器函式UI
- 【譯】移動應用開發:如何建立自定義Android程式碼模板Android
- 為什麼我牆裂建議大家使用列舉來實現單例。單例
- 微信小程式API互動的自定義封裝微信小程式API封裝
- 一種使用 Redis 深度驅動的,為構建輕量級分散式應用程式(Microservices)的工程方案Redis分散式ROS
- Lua C++互動 應用例項步驟(UserData使用)C++
- 用 VIPER 構建 iOS 應用架構(2)iOS應用架構
- 應用PPT的自定義放映功能
- 並查集(Union-Find) 應用舉例並查集
- WebSphere Remote Server 簡介及其應用舉例WebREMServer