SSH的使用模式分兩種方式交互式和非交互式的模式。在自動化系統中,更經常使用的是非交互式SSH,自動化工具都是基於這種模式,好比ansiable和salt-ssh,還有文件同步工具 rsync的SSH模式。本文咱們就來講說交互式SSH應用的構建,並以Python爲例實現了一個基本的交互式應用。 |
SSH的使用模式分兩種方式交互式和非交互式的模式。在自動化系統中,更經常使用的是非交互式SSH,自動化工具都是基於這種模式,好比ansiable和salt-ssh,還有文件同步工具 rsync的SSH模式。本文咱們就來講說交互式SSH應用的構建,並以Python爲例實現了一個基本的交互式應用。
自定義shellhtml
在服務器上,可使用OpenSSH完成三個步驟來得到shell:身份驗證,shell會話和命令。咱們能夠隨意配置shell(經過/etc/passwd)。例如,若是將用戶的登陸shell設置爲/usr/bin/cshell,登錄後,就會運行cshell(能夠爲自定義的交互式程序)。shell定義也很是簡單,只需以root權限編輯/etc/passwd修改最後一個字段爲自定義的shell程序既可。若是用戶經過分配的TTY(默認狀況下已完成)鏈接到服務器,那就將可以運行自定義的應用程序或交互式應用程序。python
authorized_keys配置linux
須要注意的是,若是使用自定義的shell應用程序,沒法接受用戶傳遞的額外命令行參數,例如ssh user@host ls -a執行時會丟掉最後的-a參數。爲了解決這個問題,須要經過覆蓋運行的命令方式,爲了實現覆蓋運行命令的操做,咱們可使用用戶證書驗證文件authorized_keys文件。在該文件每行以前,能夠添加適用於使用該密鑰登陸的用戶的選項。這些選項中有一個選項是"command"選項。好比給將/home/user/.ssh/authorized_keys添加一下語句:git
command ="/usr/bin/Ccommand" ssh-rsa ... user
用戶的shell(可能應該是/bin/sh)就能夠自動運行nethack,不管配置何種command,(若是須要,都存儲在環境中的SSH_ORIGINAL_COMMAND中)都會先執行。出於安全緣由,通常會設置一下限制配置:shell
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實例ssh
下面是一個一個簡單的的AuthorizedKeysCommand和python實例:
上面腳本中buildrht-shell命令告訴用戶使用ssh builds@buildhost connect 之類的命令進行鏈接,可使用SSH_ORIGINAL_COMMAND變量來獲取其命令行:
而後是身份驗證,檢查其密鑰和鏈接:
工具
交互式SSH中最重要的是對的輸入命令進行實時的反饋。tail程序就是用來實現這個功能構建和打印日誌給標準輸出:
以上咱們就構建了一個自定義的個性化的交互式SSH應用實例。