def login(self, hostname, username, password): cmd = 'ssh ' + username + '@' + hostname self._logger.debug(cmd) _session = pexpect.spawn(cmd, timeout=Define.TIMEOUT_SSH) if define.PEXPECT_OUTPUT_STDOUT: _session.logfile_read = sys.stdout else: #Utils.append_file(Define.PATH_USNIC_LOG_FILE_ALL, Define.PATH_USNIC_LOG_FILE) self._log_file = Define.PATH_USNIC_LOG + hostname + "_" + Utils.get_current_time_string() self._logger.info(self._log_file) _session.logfile_read = file(self._log_file, "w") ret = _session.expect([pexpect.TIMEOUT, pexpect.EOF, Define.PATTERN_SSH_NEW_KEY, Define.PATTERN_PROMPT, Define.PATTERN_PASSWORD]) if ret == 0: self._logger.warn('timeout when ssh to ' + hostname) os.remove(self._log_file) return None elif ret == 1: self._logger.warn('end of file when ssh to ' + hostname) os.remove(self._log_file) return None elif ret == 2: _session.sendline('yes') _session.expect(Define.PATTERN_PASSWORD) _session.sendline(password) ret = _session.expect([pexpect.TIMEOUT, Define.PATTERN_PROMPT]) if ret == 0: self._logger.warn("timeout after sending password") os.remove(self._log_file) return None elif ret == 3: pass elif ret == 4: _session.sendline(password) ret = _session.expect([pexpect.TIMEOUT, Define.PATTERN_PROMPT]) if ret == 0: self._logger.warn("timeout after sending password") os.remove(self._log_file) return None return _session