11
11
from paramiko .transport import Transport
12
12
from paramiko .resource import ResourceManager
13
13
from paramiko .ssh_exception import BadHostKeyException
14
+ from paramiko .py3compat import string_types
14
15
15
16
16
17
def connect (self , hostname , port = SSH_PORT , username = None , password = None , pkey = None ,
17
18
key_filename = None , timeout = None , allow_agent = True , look_for_keys = True ,
18
- compress = False , sock = None , progress_bar_callback = None ):
19
+ compress = False , sock = None , gss_auth = False , gss_kex = False ,
20
+ gss_deleg_creds = True , gss_host = None , banner_timeout = None ,
21
+ progress_bar_callback = None ):
22
+ """
23
+ Patched ``paramiko.client.SSHClient.connect``.
24
+ This adds callbacks for the connection progress bar.
25
+ """
19
26
if not sock :
20
27
progress_bar_callback (1 ) # Resolving DNS
21
28
@@ -30,7 +37,6 @@ def connect(self, hostname, port=SSH_PORT, username=None, password=None, pkey=No
30
37
31
38
progress_bar_callback (2 ) # Creating socket
32
39
sock = socket .socket (af , socket .SOCK_STREAM )
33
-
34
40
if timeout is not None :
35
41
try :
36
42
sock .settimeout (timeout )
@@ -39,10 +45,18 @@ def connect(self, hostname, port=SSH_PORT, username=None, password=None, pkey=No
39
45
retry_on_signal (lambda : sock .connect (addr ))
40
46
41
47
progress_bar_callback (3 ) # Creating transport
42
- t = self ._transport = Transport (sock )
48
+ t = self ._transport = Transport (sock , gss_kex = gss_kex , gss_deleg_creds = gss_deleg_creds )
43
49
t .use_compression (compress = compress )
50
+ if gss_kex and gss_host is None :
51
+ t .set_gss_host (hostname )
52
+ elif gss_kex and gss_host is not None :
53
+ t .set_gss_host (gss_host )
54
+ else :
55
+ pass
44
56
if self ._log_channel is not None :
45
57
t .set_log_channel (self ._log_channel )
58
+ if banner_timeout is not None :
59
+ t .banner_timeout = banner_timeout
46
60
t .start_client ()
47
61
ResourceManager .register (self , t )
48
62
@@ -54,27 +68,38 @@ def connect(self, hostname, port=SSH_PORT, username=None, password=None, pkey=No
54
68
server_hostkey_name = hostname
55
69
else :
56
70
server_hostkey_name = "[%s]:%d" % (hostname , port )
57
- our_server_key = self ._system_host_keys .get (server_hostkey_name , {}).get (keytype , None )
58
- if our_server_key is None :
59
- our_server_key = self ._host_keys .get (server_hostkey_name , {}).get (keytype , None )
60
- if our_server_key is None :
61
- # will raise exception if the key is rejected; let that fall out
62
- self ._policy .missing_host_key (self , server_hostkey_name , server_key )
63
- # if the callback returns, assume the key is ok
64
- our_server_key = server_key
65
71
66
- if server_key != our_server_key :
67
- raise BadHostKeyException (hostname , server_key , our_server_key )
72
+ # If GSS-API Key Exchange is performed we are not required to check the
73
+ # host key, because the host is authenticated via GSS-API / SSPI as
74
+ # well as our client.
75
+ if not self ._transport .use_gss_kex :
76
+ our_server_key = self ._system_host_keys .get (server_hostkey_name ,
77
+ {}).get (keytype , None )
78
+ if our_server_key is None :
79
+ our_server_key = self ._host_keys .get (server_hostkey_name ,
80
+ {}).get (keytype , None )
81
+ if our_server_key is None :
82
+ # will raise exception if the key is rejected; let that fall out
83
+ self ._policy .missing_host_key (self , server_hostkey_name ,
84
+ server_key )
85
+ # if the callback returns, assume the key is ok
86
+ our_server_key = server_key
87
+
88
+ if server_key != our_server_key :
89
+ raise BadHostKeyException (hostname , server_key , our_server_key )
68
90
69
91
if username is None :
70
92
username = getpass .getuser ()
71
93
72
94
if key_filename is None :
73
95
key_filenames = []
74
- elif isinstance (key_filename , ( str , unicode ) ):
75
- key_filenames = [ key_filename ]
96
+ elif isinstance (key_filename , string_types ):
97
+ key_filenames = [key_filename ]
76
98
else :
77
99
key_filenames = key_filename
100
+ if gss_host is None :
101
+ gss_host = hostname
78
102
79
103
progress_bar_callback (5 ) # Authenticate
80
- self ._auth (username , password , pkey , key_filenames , allow_agent , look_for_keys )
104
+ self ._auth (username , password , pkey , key_filenames , allow_agent ,
105
+ look_for_keys , gss_auth , gss_kex , gss_deleg_creds , gss_host )
0 commit comments