1. 程式人生 > >python paramiko ssh-解決強制修改密碼登入問題

python paramiko ssh-解決強制修改密碼登入問題

本篇部落格主要講三個部分:
1.python建立ssh連線的用途
2.對paramiko 的安裝及簡單使用
3.paramiko如何解決ssh中主機強制要求改密碼的登入的問題

1.python建立ssh連線的用途
python沒有對ssh 支援的標準模組,一般使用第三方的包來實現;主要有兩種主流的方式:
pexpect (支援linux,不支援windows),另外還有本文中後面介紹的paramiko(支援linux和windows)。
一般用來解決以下問題:

  • 它用於處理一些自動化的需求,比如ssh和ftp
  • 批量登入多臺主機執行shell指令碼命令

3.paramiko如何解決ssh中主機強制要求改密碼的登入的問題
paramiko官網:

http://docs.paramiko.org/en/2.0/ API的使用 很詳細
github原始碼地址:https://github.com/paramiko/paramiko/ 有興趣的可以學習下原始碼
下面開始正題:
我遇到的問題是:
環境:wmplayer12,linux_suce12.ova(一個虛擬機器標準檔案),python 2.7.1,paramiko 1.7.1
需求:使用python實現以下自動化流程:
1.將linux_suce12.ova載入到vmplayer12中,no-gui 啟動;
2.通過paramiko ssh登入到載入成功的虛擬機器中(因為安全原因,系統會提供預設密碼
,但是會強制使用者修改密碼後才可以登入);
3.ssh登入成功後 執行shell命令返回輸出資訊。
遇到的問題:強制修改密碼登入
輸入使用者名稱密碼 提示:You are required to change your password immediately (root enforced)\nChanging password for hxeadm.\n(current) UNIX password:
再次輸入密碼 提示:New password:
輸入新密碼 提示:Retype new password:
最後確認新密碼 登入成功

解決方案:使用paramiko中Transport類中 auth_interactive(username, handler, submethods=”)解決
思路是這樣的:
這是一個回撥函式,在遇到登入過程中系統強制彈出的任意多的視窗,該函式都會被回撥,我們只需要預先提供系統需要的我們填寫的資訊,比如密碼等資訊。以下是我的實現程式碼:

def ssh_login(self):
        #paramiko.common.logging.basicConfig(level=paramiko.common.DEBUG)
        #pdb.set_trace()
        def
ihandler(title ,instructions ,prompt_list):
#print title #print instructions #print prompt_list self.__log.info(prompt_list) #pdb.set_trace() if (prompt_list ==[]): return [] if (prompt_list ==[('Password: ', False)]): return [self._InitialPwd] if (prompt_list ==[('You are required to change your password immediately (root enforced)\nChanging password for hxeadm.\n(current) UNIX password: ', False)]): return [self._InitialPwd] if (prompt_list ==[('New password: ', False)]): return [self._newPwd] if (prompt_list ==[('Retype new password: ', False)]): return [self._newPwd] try: #self._transport.set_log_channel("paramiko.transport") self._transport.start_client() #pdb.set_trace() self.__log.info('start paramiko client') self._transport.auth_interactive (self._username,ihandler) #self.__log.info(self._transport) self.__log.info('hxeadm login sucefully as keyboard auth_interactive')

多說一點:
python 實現ova自動轉換vmx以及載入到vmplayer中:通過ovftool工具提供的命令轉換 ,vmplayer載入ova通過vmware官方提供的vmrun命令實現,python程式碼中需要fork一個子程序呼叫命令即可實現。
paramiko ssh 登入成功後 API提供了多種方式的去執行shell命令,可以自己看一下。