From 176c6caf4ea7918e1698438634b237fab8456471 Mon Sep 17 00:00:00 2001 From: "Jeremy T. Bouse" Date: Fri, 27 Nov 2009 16:20:09 -0500 Subject: Imported Upstream version 1.5.2 --- LICENSE | 504 +++++ PKG-INFO | 25 + README | 248 +++ demo.py | 210 ++ demo_server.py | 138 ++ demo_simple.py | 128 ++ docs/epydoc.css | 100 + docs/index.html | 13 + docs/private/__builtin__.object-class.html | 286 +++ docs/private/__builtin__.type-class.html | 504 +++++ docs/private/epydoc.css | 100 + docs/private/exceptions.Exception-class.html | 87 + docs/private/frames.html | 13 + docs/private/help.html | 224 ++ docs/private/index.html | 13 + docs/private/indices.html | 1635 +++++++++++++++ docs/private/paramiko-module.html | 407 ++++ docs/private/paramiko.Agent-class.html | 155 ++ docs/private/paramiko.AgentKey-class.html | 319 +++ docs/private/paramiko.AuthHandler-class.html | 282 +++ .../paramiko.BadAuthenticationType-class.html | 141 ++ docs/private/paramiko.BaseSFTP-class.html | 149 ++ docs/private/paramiko.BufferedFile-class.html | 656 ++++++ docs/private/paramiko.Channel-class.html | 1329 ++++++++++++ docs/private/paramiko.ChannelFile-class.html | 347 ++++ docs/private/paramiko.DSSKey-class.html | 486 +++++ docs/private/paramiko.Message-class.html | 654 ++++++ docs/private/paramiko.PKey-class.html | 696 +++++++ docs/private/paramiko.Packetizer-class.html | 441 ++++ .../paramiko.PasswordRequiredException-class.html | 91 + docs/private/paramiko.RSAKey-class.html | 504 +++++ docs/private/paramiko.SFTP-class.html | 347 ++++ docs/private/paramiko.SFTPAttributes-class.html | 385 ++++ docs/private/paramiko.SFTPClient-class.html | 1091 ++++++++++ docs/private/paramiko.SFTPError-class.html | 85 + docs/private/paramiko.SFTPFile-class.html | 667 ++++++ docs/private/paramiko.SFTPHandle-class.html | 364 ++++ docs/private/paramiko.SFTPServer-class.html | 511 +++++ .../paramiko.SFTPServerInterface-class.html | 744 +++++++ docs/private/paramiko.SSHException-class.html | 95 + docs/private/paramiko.SecurityOptions-class.html | 373 ++++ docs/private/paramiko.ServerInterface-class.html | 894 ++++++++ docs/private/paramiko.SubsystemHandler-class.html | 352 ++++ docs/private/paramiko.Transport-class.html | 2151 ++++++++++++++++++++ docs/private/paramiko.agent-module.html | 164 ++ docs/private/paramiko.auth_handler-module.html | 62 + docs/private/paramiko.ber-module.html | 79 + docs/private/paramiko.ber.BER-class.html | 145 ++ docs/private/paramiko.ber.BERException-class.html | 86 + docs/private/paramiko.channel-module.html | 71 + .../paramiko.channel.ChannelStderrFile-class.html | 282 +++ docs/private/paramiko.common-module.html | 1013 +++++++++ docs/private/paramiko.compress-module.html | 74 + .../paramiko.compress.ZlibCompressor-class.html | 122 ++ .../paramiko.compress.ZlibDecompressor-class.html | 122 ++ docs/private/paramiko.dsskey-module.html | 62 + docs/private/paramiko.file-module.html | 230 +++ docs/private/paramiko.kex_gex-module.html | 179 ++ docs/private/paramiko.kex_gex.KexGex-class.html | 250 +++ docs/private/paramiko.kex_group1-module.html | 181 ++ .../paramiko.kex_group1.KexGroup1-class.html | 176 ++ docs/private/paramiko.logging22-module.html | 235 +++ .../paramiko.logging22.Formatter-class.html | 120 ++ .../paramiko.logging22.StreamHandler-class.html | 123 ++ docs/private/paramiko.logging22.logger-class.html | 135 ++ docs/private/paramiko.message-module.html | 61 + docs/private/paramiko.packet-module.html | 71 + .../paramiko.packet.NeedRekeyException-class.html | 86 + docs/private/paramiko.pipe-module.html | 87 + docs/private/paramiko.pipe.PosixPipe-class.html | 133 ++ docs/private/paramiko.pipe.WindowsPipe-class.html | 137 ++ docs/private/paramiko.pkey-module.html | 61 + docs/private/paramiko.primes-module.html | 117 ++ .../private/paramiko.primes.ModulusPack-class.html | 158 ++ docs/private/paramiko.rsakey-module.html | 62 + docs/private/paramiko.server-module.html | 74 + .../paramiko.server.InteractiveQuery-class.html | 195 ++ docs/private/paramiko.sftp-module.html | 1082 ++++++++++ docs/private/paramiko.sftp_attr-module.html | 59 + docs/private/paramiko.sftp_client-module.html | 89 + docs/private/paramiko.sftp_file-module.html | 62 + docs/private/paramiko.sftp_handle-module.html | 61 + docs/private/paramiko.sftp_server-module.html | 102 + docs/private/paramiko.sftp_si-module.html | 63 + docs/private/paramiko.ssh_exception-module.html | 72 + ....ssh_exception.PartialAuthentication-class.html | 131 ++ docs/private/paramiko.transport-module.html | 111 + docs/private/paramiko.util-module.html | 475 +++++ docs/private/paramiko.util.PFilter-class.html | 124 ++ docs/private/threading.Thread-class.html | 237 +++ docs/private/threading._Verbose-class.html | 127 ++ docs/private/toc-everything.html | 224 ++ docs/private/toc-paramiko-module.html | 94 + docs/private/toc-paramiko.agent-module.html | 25 + docs/private/toc-paramiko.auth_handler-module.html | 17 + docs/private/toc-paramiko.ber-module.html | 27 + docs/private/toc-paramiko.channel-module.html | 22 + docs/private/toc-paramiko.common-module.html | 63 + docs/private/toc-paramiko.compress-module.html | 23 + docs/private/toc-paramiko.dsskey-module.html | 17 + docs/private/toc-paramiko.file-module.html | 28 + docs/private/toc-paramiko.kex_gex-module.html | 30 + docs/private/toc-paramiko.kex_group1-module.html | 30 + docs/private/toc-paramiko.logging22-module.html | 39 + docs/private/toc-paramiko.message-module.html | 17 + docs/private/toc-paramiko.packet-module.html | 22 + docs/private/toc-paramiko.pipe-module.html | 28 + docs/private/toc-paramiko.pkey-module.html | 17 + docs/private/toc-paramiko.primes-module.html | 28 + docs/private/toc-paramiko.rsakey-module.html | 17 + docs/private/toc-paramiko.server-module.html | 22 + docs/private/toc-paramiko.sftp-module.html | 66 + docs/private/toc-paramiko.sftp_attr-module.html | 17 + docs/private/toc-paramiko.sftp_client-module.html | 22 + docs/private/toc-paramiko.sftp_file-module.html | 17 + docs/private/toc-paramiko.sftp_handle-module.html | 17 + docs/private/toc-paramiko.sftp_server-module.html | 22 + docs/private/toc-paramiko.sftp_si-module.html | 17 + .../private/toc-paramiko.ssh_exception-module.html | 22 + docs/private/toc-paramiko.transport-module.html | 27 + docs/private/toc-paramiko.util-module.html | 52 + docs/private/toc.html | 53 + docs/private/trees.html | 243 +++ docs/public/__builtin__.object-class.html | 268 +++ docs/public/__builtin__.type-class.html | 504 +++++ docs/public/epydoc.css | 100 + docs/public/exceptions.Exception-class.html | 85 + docs/public/frames.html | 13 + docs/public/help.html | 224 ++ docs/public/index.html | 13 + docs/public/indices.html | 803 ++++++++ docs/public/paramiko-module.html | 229 +++ docs/public/paramiko.Agent-class.html | 147 ++ docs/public/paramiko.AgentKey-class.html | 236 +++ .../paramiko.BadAuthenticationType-class.html | 141 ++ docs/public/paramiko.BufferedFile-class.html | 554 +++++ docs/public/paramiko.Channel-class.html | 1241 +++++++++++ docs/public/paramiko.DSSKey-class.html | 423 ++++ docs/public/paramiko.Message-class.html | 650 ++++++ .../paramiko.PasswordRequiredException-class.html | 91 + docs/public/paramiko.RSAKey-class.html | 423 ++++ docs/public/paramiko.SFTP-class.html | 287 +++ docs/public/paramiko.SFTPAttributes-class.html | 360 ++++ docs/public/paramiko.SFTPClient-class.html | 1009 +++++++++ docs/public/paramiko.SFTPError-class.html | 85 + docs/public/paramiko.SFTPFile-class.html | 560 +++++ docs/public/paramiko.SFTPHandle-class.html | 325 +++ docs/public/paramiko.SFTPServer-class.html | 403 ++++ docs/public/paramiko.SSHException-class.html | 94 + docs/public/paramiko.SecurityOptions-class.html | 274 +++ docs/public/paramiko.SubsystemHandler-class.html | 327 +++ docs/public/paramiko.Transport-class.html | 1524 ++++++++++++++ docs/public/paramiko.agent-module.html | 164 ++ docs/public/paramiko.dsskey-module.html | 62 + docs/public/paramiko.file-module.html | 61 + docs/public/paramiko.message-module.html | 61 + docs/public/paramiko.pkey-module.html | 61 + docs/public/paramiko.rsakey-module.html | 62 + docs/public/paramiko.server-module.html | 74 + .../paramiko.server.InteractiveQuery-class.html | 195 ++ docs/public/paramiko.sftp-module.html | 1060 ++++++++++ docs/public/paramiko.sftp_attr-module.html | 59 + docs/public/paramiko.sftp_client-module.html | 61 + docs/public/paramiko.sftp_file-module.html | 62 + docs/public/paramiko.sftp_handle-module.html | 61 + docs/public/paramiko.sftp_server-module.html | 61 + docs/public/paramiko.sftp_si-module.html | 63 + docs/public/paramiko.transport-module.html | 63 + docs/public/paramiko.util-module.html | 369 ++++ docs/public/paramiko.util.PFilter-class.html | 124 ++ docs/public/threading.Thread-class.html | 161 ++ docs/public/toc-everything.html | 121 ++ docs/public/toc-paramiko-module.html | 69 + docs/public/toc-paramiko.agent-module.html | 25 + docs/public/toc-paramiko.dsskey-module.html | 17 + docs/public/toc-paramiko.file-module.html | 21 + docs/public/toc-paramiko.message-module.html | 17 + docs/public/toc-paramiko.pkey-module.html | 17 + docs/public/toc-paramiko.rsakey-module.html | 17 + docs/public/toc-paramiko.server-module.html | 22 + docs/public/toc-paramiko.sftp-module.html | 65 + docs/public/toc-paramiko.sftp_attr-module.html | 17 + docs/public/toc-paramiko.sftp_client-module.html | 21 + docs/public/toc-paramiko.sftp_file-module.html | 17 + docs/public/toc-paramiko.sftp_handle-module.html | 17 + docs/public/toc-paramiko.sftp_server-module.html | 21 + docs/public/toc-paramiko.sftp_si-module.html | 17 + docs/public/toc-paramiko.transport-module.html | 25 + docs/public/toc-paramiko.util-module.html | 48 + docs/public/toc.html | 41 + docs/public/trees.html | 151 ++ forward.py | 219 ++ paramiko/__init__.py | 146 ++ paramiko/agent.py | 138 ++ paramiko/auth_handler.py | 410 ++++ paramiko/ber.py | 128 ++ paramiko/channel.py | 1174 +++++++++++ paramiko/common.py | 136 ++ paramiko/compress.py | 39 + paramiko/dsskey.py | 176 ++ paramiko/file.py | 440 ++++ paramiko/kex_gex.py | 202 ++ paramiko/kex_group1.py | 136 ++ paramiko/logging22.py | 66 + paramiko/message.py | 301 +++ paramiko/packet.py | 442 ++++ paramiko/pipe.py | 105 + paramiko/pkey.py | 339 +++ paramiko/primes.py | 148 ++ paramiko/rsakey.py | 165 ++ paramiko/server.py | 527 +++++ paramiko/sftp.py | 168 ++ paramiko/sftp_attr.py | 208 ++ paramiko/sftp_client.py | 618 ++++++ paramiko/sftp_file.py | 307 +++ paramiko/sftp_handle.py | 188 ++ paramiko/sftp_server.py | 420 ++++ paramiko/sftp_si.py | 303 +++ paramiko/ssh_exception.py | 69 + paramiko/transport.py | 1824 +++++++++++++++++ paramiko/util.py | 357 ++++ setup.py | 49 + test.py | 103 + tests/loop.py | 104 + tests/stub_sftp.py | 192 ++ tests/test_dss.key | 12 + tests/test_dss_password.key | 15 + tests/test_file.py | 153 ++ tests/test_kex.py | 183 ++ tests/test_message.py | 102 + tests/test_packetizer.py | 70 + tests/test_pkey.py | 140 ++ tests/test_rsa.key | 15 + tests/test_rsa_password.key | 18 + tests/test_sftp.py | 740 +++++++ tests/test_transport.py | 573 ++++++ tests/test_util.py | 80 + 237 files changed, 55748 insertions(+) create mode 100644 LICENSE create mode 100644 PKG-INFO create mode 100644 README create mode 100644 demo.py create mode 100644 demo_server.py create mode 100644 demo_simple.py create mode 100644 docs/epydoc.css create mode 100644 docs/index.html create mode 100644 docs/private/__builtin__.object-class.html create mode 100644 docs/private/__builtin__.type-class.html create mode 100644 docs/private/epydoc.css create mode 100644 docs/private/exceptions.Exception-class.html create mode 100644 docs/private/frames.html create mode 100644 docs/private/help.html create mode 100644 docs/private/index.html create mode 100644 docs/private/indices.html create mode 100644 docs/private/paramiko-module.html create mode 100644 docs/private/paramiko.Agent-class.html create mode 100644 docs/private/paramiko.AgentKey-class.html create mode 100644 docs/private/paramiko.AuthHandler-class.html create mode 100644 docs/private/paramiko.BadAuthenticationType-class.html create mode 100644 docs/private/paramiko.BaseSFTP-class.html create mode 100644 docs/private/paramiko.BufferedFile-class.html create mode 100644 docs/private/paramiko.Channel-class.html create mode 100644 docs/private/paramiko.ChannelFile-class.html create mode 100644 docs/private/paramiko.DSSKey-class.html create mode 100644 docs/private/paramiko.Message-class.html create mode 100644 docs/private/paramiko.PKey-class.html create mode 100644 docs/private/paramiko.Packetizer-class.html create mode 100644 docs/private/paramiko.PasswordRequiredException-class.html create mode 100644 docs/private/paramiko.RSAKey-class.html create mode 100644 docs/private/paramiko.SFTP-class.html create mode 100644 docs/private/paramiko.SFTPAttributes-class.html create mode 100644 docs/private/paramiko.SFTPClient-class.html create mode 100644 docs/private/paramiko.SFTPError-class.html create mode 100644 docs/private/paramiko.SFTPFile-class.html create mode 100644 docs/private/paramiko.SFTPHandle-class.html create mode 100644 docs/private/paramiko.SFTPServer-class.html create mode 100644 docs/private/paramiko.SFTPServerInterface-class.html create mode 100644 docs/private/paramiko.SSHException-class.html create mode 100644 docs/private/paramiko.SecurityOptions-class.html create mode 100644 docs/private/paramiko.ServerInterface-class.html create mode 100644 docs/private/paramiko.SubsystemHandler-class.html create mode 100644 docs/private/paramiko.Transport-class.html create mode 100644 docs/private/paramiko.agent-module.html create mode 100644 docs/private/paramiko.auth_handler-module.html create mode 100644 docs/private/paramiko.ber-module.html create mode 100644 docs/private/paramiko.ber.BER-class.html create mode 100644 docs/private/paramiko.ber.BERException-class.html create mode 100644 docs/private/paramiko.channel-module.html create mode 100644 docs/private/paramiko.channel.ChannelStderrFile-class.html create mode 100644 docs/private/paramiko.common-module.html create mode 100644 docs/private/paramiko.compress-module.html create mode 100644 docs/private/paramiko.compress.ZlibCompressor-class.html create mode 100644 docs/private/paramiko.compress.ZlibDecompressor-class.html create mode 100644 docs/private/paramiko.dsskey-module.html create mode 100644 docs/private/paramiko.file-module.html create mode 100644 docs/private/paramiko.kex_gex-module.html create mode 100644 docs/private/paramiko.kex_gex.KexGex-class.html create mode 100644 docs/private/paramiko.kex_group1-module.html create mode 100644 docs/private/paramiko.kex_group1.KexGroup1-class.html create mode 100644 docs/private/paramiko.logging22-module.html create mode 100644 docs/private/paramiko.logging22.Formatter-class.html create mode 100644 docs/private/paramiko.logging22.StreamHandler-class.html create mode 100644 docs/private/paramiko.logging22.logger-class.html create mode 100644 docs/private/paramiko.message-module.html create mode 100644 docs/private/paramiko.packet-module.html create mode 100644 docs/private/paramiko.packet.NeedRekeyException-class.html create mode 100644 docs/private/paramiko.pipe-module.html create mode 100644 docs/private/paramiko.pipe.PosixPipe-class.html create mode 100644 docs/private/paramiko.pipe.WindowsPipe-class.html create mode 100644 docs/private/paramiko.pkey-module.html create mode 100644 docs/private/paramiko.primes-module.html create mode 100644 docs/private/paramiko.primes.ModulusPack-class.html create mode 100644 docs/private/paramiko.rsakey-module.html create mode 100644 docs/private/paramiko.server-module.html create mode 100644 docs/private/paramiko.server.InteractiveQuery-class.html create mode 100644 docs/private/paramiko.sftp-module.html create mode 100644 docs/private/paramiko.sftp_attr-module.html create mode 100644 docs/private/paramiko.sftp_client-module.html create mode 100644 docs/private/paramiko.sftp_file-module.html create mode 100644 docs/private/paramiko.sftp_handle-module.html create mode 100644 docs/private/paramiko.sftp_server-module.html create mode 100644 docs/private/paramiko.sftp_si-module.html create mode 100644 docs/private/paramiko.ssh_exception-module.html create mode 100644 docs/private/paramiko.ssh_exception.PartialAuthentication-class.html create mode 100644 docs/private/paramiko.transport-module.html create mode 100644 docs/private/paramiko.util-module.html create mode 100644 docs/private/paramiko.util.PFilter-class.html create mode 100644 docs/private/threading.Thread-class.html create mode 100644 docs/private/threading._Verbose-class.html create mode 100644 docs/private/toc-everything.html create mode 100644 docs/private/toc-paramiko-module.html create mode 100644 docs/private/toc-paramiko.agent-module.html create mode 100644 docs/private/toc-paramiko.auth_handler-module.html create mode 100644 docs/private/toc-paramiko.ber-module.html create mode 100644 docs/private/toc-paramiko.channel-module.html create mode 100644 docs/private/toc-paramiko.common-module.html create mode 100644 docs/private/toc-paramiko.compress-module.html create mode 100644 docs/private/toc-paramiko.dsskey-module.html create mode 100644 docs/private/toc-paramiko.file-module.html create mode 100644 docs/private/toc-paramiko.kex_gex-module.html create mode 100644 docs/private/toc-paramiko.kex_group1-module.html create mode 100644 docs/private/toc-paramiko.logging22-module.html create mode 100644 docs/private/toc-paramiko.message-module.html create mode 100644 docs/private/toc-paramiko.packet-module.html create mode 100644 docs/private/toc-paramiko.pipe-module.html create mode 100644 docs/private/toc-paramiko.pkey-module.html create mode 100644 docs/private/toc-paramiko.primes-module.html create mode 100644 docs/private/toc-paramiko.rsakey-module.html create mode 100644 docs/private/toc-paramiko.server-module.html create mode 100644 docs/private/toc-paramiko.sftp-module.html create mode 100644 docs/private/toc-paramiko.sftp_attr-module.html create mode 100644 docs/private/toc-paramiko.sftp_client-module.html create mode 100644 docs/private/toc-paramiko.sftp_file-module.html create mode 100644 docs/private/toc-paramiko.sftp_handle-module.html create mode 100644 docs/private/toc-paramiko.sftp_server-module.html create mode 100644 docs/private/toc-paramiko.sftp_si-module.html create mode 100644 docs/private/toc-paramiko.ssh_exception-module.html create mode 100644 docs/private/toc-paramiko.transport-module.html create mode 100644 docs/private/toc-paramiko.util-module.html create mode 100644 docs/private/toc.html create mode 100644 docs/private/trees.html create mode 100644 docs/public/__builtin__.object-class.html create mode 100644 docs/public/__builtin__.type-class.html create mode 100644 docs/public/epydoc.css create mode 100644 docs/public/exceptions.Exception-class.html create mode 100644 docs/public/frames.html create mode 100644 docs/public/help.html create mode 100644 docs/public/index.html create mode 100644 docs/public/indices.html create mode 100644 docs/public/paramiko-module.html create mode 100644 docs/public/paramiko.Agent-class.html create mode 100644 docs/public/paramiko.AgentKey-class.html create mode 100644 docs/public/paramiko.BadAuthenticationType-class.html create mode 100644 docs/public/paramiko.BufferedFile-class.html create mode 100644 docs/public/paramiko.Channel-class.html create mode 100644 docs/public/paramiko.DSSKey-class.html create mode 100644 docs/public/paramiko.Message-class.html create mode 100644 docs/public/paramiko.PasswordRequiredException-class.html create mode 100644 docs/public/paramiko.RSAKey-class.html create mode 100644 docs/public/paramiko.SFTP-class.html create mode 100644 docs/public/paramiko.SFTPAttributes-class.html create mode 100644 docs/public/paramiko.SFTPClient-class.html create mode 100644 docs/public/paramiko.SFTPError-class.html create mode 100644 docs/public/paramiko.SFTPFile-class.html create mode 100644 docs/public/paramiko.SFTPHandle-class.html create mode 100644 docs/public/paramiko.SFTPServer-class.html create mode 100644 docs/public/paramiko.SSHException-class.html create mode 100644 docs/public/paramiko.SecurityOptions-class.html create mode 100644 docs/public/paramiko.SubsystemHandler-class.html create mode 100644 docs/public/paramiko.Transport-class.html create mode 100644 docs/public/paramiko.agent-module.html create mode 100644 docs/public/paramiko.dsskey-module.html create mode 100644 docs/public/paramiko.file-module.html create mode 100644 docs/public/paramiko.message-module.html create mode 100644 docs/public/paramiko.pkey-module.html create mode 100644 docs/public/paramiko.rsakey-module.html create mode 100644 docs/public/paramiko.server-module.html create mode 100644 docs/public/paramiko.server.InteractiveQuery-class.html create mode 100644 docs/public/paramiko.sftp-module.html create mode 100644 docs/public/paramiko.sftp_attr-module.html create mode 100644 docs/public/paramiko.sftp_client-module.html create mode 100644 docs/public/paramiko.sftp_file-module.html create mode 100644 docs/public/paramiko.sftp_handle-module.html create mode 100644 docs/public/paramiko.sftp_server-module.html create mode 100644 docs/public/paramiko.sftp_si-module.html create mode 100644 docs/public/paramiko.transport-module.html create mode 100644 docs/public/paramiko.util-module.html create mode 100644 docs/public/paramiko.util.PFilter-class.html create mode 100644 docs/public/threading.Thread-class.html create mode 100644 docs/public/toc-everything.html create mode 100644 docs/public/toc-paramiko-module.html create mode 100644 docs/public/toc-paramiko.agent-module.html create mode 100644 docs/public/toc-paramiko.dsskey-module.html create mode 100644 docs/public/toc-paramiko.file-module.html create mode 100644 docs/public/toc-paramiko.message-module.html create mode 100644 docs/public/toc-paramiko.pkey-module.html create mode 100644 docs/public/toc-paramiko.rsakey-module.html create mode 100644 docs/public/toc-paramiko.server-module.html create mode 100644 docs/public/toc-paramiko.sftp-module.html create mode 100644 docs/public/toc-paramiko.sftp_attr-module.html create mode 100644 docs/public/toc-paramiko.sftp_client-module.html create mode 100644 docs/public/toc-paramiko.sftp_file-module.html create mode 100644 docs/public/toc-paramiko.sftp_handle-module.html create mode 100644 docs/public/toc-paramiko.sftp_server-module.html create mode 100644 docs/public/toc-paramiko.sftp_si-module.html create mode 100644 docs/public/toc-paramiko.transport-module.html create mode 100644 docs/public/toc-paramiko.util-module.html create mode 100644 docs/public/toc.html create mode 100644 docs/public/trees.html create mode 100644 forward.py create mode 100644 paramiko/__init__.py create mode 100644 paramiko/agent.py create mode 100644 paramiko/auth_handler.py create mode 100644 paramiko/ber.py create mode 100644 paramiko/channel.py create mode 100644 paramiko/common.py create mode 100644 paramiko/compress.py create mode 100644 paramiko/dsskey.py create mode 100644 paramiko/file.py create mode 100644 paramiko/kex_gex.py create mode 100644 paramiko/kex_group1.py create mode 100644 paramiko/logging22.py create mode 100644 paramiko/message.py create mode 100644 paramiko/packet.py create mode 100644 paramiko/pipe.py create mode 100644 paramiko/pkey.py create mode 100644 paramiko/primes.py create mode 100644 paramiko/rsakey.py create mode 100644 paramiko/server.py create mode 100644 paramiko/sftp.py create mode 100644 paramiko/sftp_attr.py create mode 100644 paramiko/sftp_client.py create mode 100644 paramiko/sftp_file.py create mode 100644 paramiko/sftp_handle.py create mode 100644 paramiko/sftp_server.py create mode 100644 paramiko/sftp_si.py create mode 100644 paramiko/ssh_exception.py create mode 100644 paramiko/transport.py create mode 100644 paramiko/util.py create mode 100644 setup.py create mode 100644 test.py create mode 100644 tests/loop.py create mode 100644 tests/stub_sftp.py create mode 100644 tests/test_dss.key create mode 100644 tests/test_dss_password.key create mode 100644 tests/test_file.py create mode 100644 tests/test_kex.py create mode 100644 tests/test_message.py create mode 100644 tests/test_packetizer.py create mode 100644 tests/test_pkey.py create mode 100644 tests/test_rsa.key create mode 100644 tests/test_rsa_password.key create mode 100644 tests/test_sftp.py create mode 100644 tests/test_transport.py create mode 100644 tests/test_util.py diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b1e3f5a --- /dev/null +++ b/LICENSE @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/PKG-INFO b/PKG-INFO new file mode 100644 index 0000000..a0ec679 --- /dev/null +++ b/PKG-INFO @@ -0,0 +1,25 @@ +Metadata-Version: 1.0 +Name: paramiko +Version: 1.5.2 +Summary: SSH2 protocol library +Home-page: http://www.lag.net/paramiko/ +Author: Robey Pointer +Author-email: robey@lag.net +License: LGPL +Download-URL: http://www.lag.net/paramiko/download/paramiko-1.5.2.zip +Description: + This is a library for making SSH2 connections (client or server). + Emphasis is on using SSH2 as an alternative to SSL for making secure + connections between python scripts. All major ciphers and hash methods + are supported. SFTP client and server mode are both supported too. + + Required packages: + pyCrypt + +Platform: Posix; MacOS X; Windows +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL) +Classifier: Operating System :: OS Independent +Classifier: Topic :: Internet +Classifier: Topic :: Security :: Cryptography diff --git a/README b/README new file mode 100644 index 0000000..45997ac --- /dev/null +++ b/README @@ -0,0 +1,248 @@ +paramiko 1.5.2 +"rhydon" release, 04 dec 2005 + +Copyright (c) 2003-2005 Robey Pointer + +http://www.lag.net/paramiko/ + + +*** WHAT + +"paramiko" is a combination of the esperanto words for "paranoid" and +"friend". it's a module for python 2.2+ that implements the SSH2 protocol +for secure (encrypted and authenticated) connections to remote machines. +unlike SSL (aka TLS), SSH2 protocol does not require heirarchical +certificates signed by a powerful central authority. you may know SSH2 as +the protocol that replaced telnet and rsh for secure access to remote +shells, but the protocol also includes the ability to open arbitrary +channels to remote services across the encrypted tunnel (this is how sftp +works, for example). + +it is written entirely in python (no C or platform-dependent code) and is +released under the GNU LGPL (lesser GPL). + +the package and its API is fairly well documented in the "doc/" folder +that should have come with this archive. + + +*** REQUIREMENTS + +python 2.3 + (python 2.2 is also supported, but not recommended) +pycrypto 1.9+ + (2.0 works too) + +pycrypto compiled for Win32 can be downloaded from the HashTar homepage: + http://nitace.bsd.uchicago.edu:8080/hashtar +you can also build it yourself using the free MinGW tools and this command +line (thanks to Roger Binns for the info): + python setup.py build --compiler=mingw32 bdist_wininst + + +*** PORTABILITY + +i code and test this library on Linux and MacOS X. for that reason, i'm +pretty sure that it works for all posix platforms, including MacOS. i +also think it will work on Windows, though i've never tested it there. if +you run into Windows problems, send me a patch: portability is important +to me. + +python 2.2 may work, thanks to some patches from Roger Binns. things to +watch out for: +* sockets in 2.2 don't support timeouts, so the 'select' module is + imported to do polling. +* logging is mostly stubbed out. it works just enough to let paramiko + create log files for debugging, if you want them. to get real logging, + you can backport python 2.3's logging package. Roger has done that + already: + http://sourceforge.net/project/showfiles.php?group_id=75211&package_id=113804 + +you really should upgrade to python 2.3. laziness is no excuse! :) + +some python distributions don't include the utf-8 string encodings, for +reasons of space (misdirected as that is). if your distribution is +missing encodings, you'll see an error like this: + +LookupError: no codec search functions registered: can't find encoding + +this means you need to copy string encodings over from a working system. +(it probably only happens on embedded systems, not normal python +installls.) +Valeriy Pogrebitskiy says the best place to look is +'.../lib/python*/encodings/__init__.py'. + + +*** DEMO + +several demo scripts come with paramiko to demonstrate how to use it. +probably the simplest demo of all is this: + + import paramiko, base64 + key = paramiko.RSAKey(data=base64.decodestring('AAA...')) + t = paramiko.Transport('ssh.example.com') + t.connect(username='strongbad', password='thecheat', hostkey=key) + chan = t.open_session() + chan.exec_command('ls') + for line in chan.makefile('r+'): + print '... ' + line.strip('\n') + chan.close() + t.close() + +...which prints out the results of executing 'ls' on a remote server. +(the host key 'AAA...' should of course be replaced by the actual base64 +encoding of the host key. if you skip host key verification, the +connection is not secure!) + +the following example scripts get progressively more detailed: + +demo_simple.py + calls invoke_shell() and emulates a terminal/tty through which you can + execute commands interactively on a remote server. think of it as a + poor man's ssh command-line client. + +demo.py + same as demo_simple.py, but allows you to authenticiate using a + private key, attempts to use an SSH-agent if present, and uses the long + form of some of the API calls. + +forward.py + command-line script to set up port-forwarding across an ssh transport. + (requires python 2.3.) + +demo_server.py + an ssh server that listens on port 2200 and accepts a login for + 'robey' (password 'foo'), and pretends to be a BBS. meant to be a + very simple demo of writing an ssh server. + + +*** USE + +the demo scripts are probably the best example of how to use this package. +there is also a lot of documentation, generated with epydoc, in the doc/ +folder. point your browser there. seriously, do it. mad props to +epydoc, which actually motivated me to write more documentation than i +ever would have before. + +there are also unit tests here: + $ python ./test.py +which will verify that some of the core components are working correctly. +not much is tested yet, but it's a start. the tests for SFTP are probably +the best and easiest examples of how to use the SFTP class. + + +*** WHAT'S NEW + +highlights of what's new in each release: + +v1.5.2 RHYDON +* compression support (opt-in via Transport.use_compression) +* sftp files may be opened with mode flag 'x' for O_EXCL (exclusive-open) + behavior, which has no direct python equivalent +* added experimental util functions for parsing openssh config files +* fixed a few bugs (and potential deadlocks) with key renegotiation +* fixed a bug that caused SFTPFile.prefetch to occasionally lock up +* fixed an sftp bug which affected van dyke sftp servers +* fixed the behavior of select()ing on a closed channel, such that it will + always trigger as readable + +v1.5.1 QUILAVA +* SFTPFile.prefetch() added to dramatically speed up downloads (automatically + turned on in SFTPClient.get()) +* fixed bug where garbage-collected Channels could trigger the Transport to + close the session (reported by gordon good) +* fixed a deadlock in rekeying (reported by wendell wood) +* fixed some windows bugs and SFTPAttributes.__str__() (reported by grzegorz + makarewicz) +* better sftp error reporting by adding fake "errno" info to IOErrors + +v1.5 PARAS +* added support for "keyboard-interactive" authentication +* added mode (on by default) where password authentication will try to + fallback to "keyboard-interactive" if it's supported +* added pipelining to SFTPFile.write and SFTPClient.put +* fixed bug with SFTPFile.close() not guarding against being called more + than once (thanks to Nathaniel Smith) +* fixed broken 'a' flag in SFTPClient.file() (thanks to Nathaniel Smith) +* fixed up epydocs to look nicer +* reorganized auth_transport into auth_handler, which seems to be a cleaner + separation +* demo scripts fixed to have a better chance of loading the host keys + correctly on windows/cygwin + +v1.4 ODDISH +* added SSH-agent support (for posix) from john rochester +* added chdir() and getcwd() to SFTPClient, to emulate a "working directory" +* added get() and put() to SFTPClient, to emulate ftp whole-file transfers +* added check() to SFTPFile (a file hashing protocol extension) +* fixed Channels and SFTPFiles (among others) to auto-close when GC'd +* fixed Channel.fileno() for Windows, this time really +* don't log socket errors as "unknown exception" +* some misc. backward-compatible API improvements (like allowing + Transport.start_client() and start_server() to be called in a blocking way) + +v1.3.1 NIDORAN +* added SFTPClient.close() +* fixed up some outdated documentation +* made SFTPClient.file() an alias for open() +* added Transport.open_sftp_client() for convenience +* refactored packetizing out of Transport +* fixed bug (reported by alain s.) where connecting to a non-SSH host could + cause paramiko to freeze up +* fixed Channel.fileno() for Windows (again) +* some more unit tests + +v1.3 MAROWAK +* fixed a bug where packets larger than about 12KB would cause the session + to die on all platforms except osx +* added a potential workaround for windows to let Channel.fileno() (and + therefore the select module) work! +* changed API for subsystem handlers (sorry!) to pass more info and make it + easier to write a functional SFTP server + +v1.2 LAPRAS +* added SFTPClient.listdir_attr() for fetching a list of files and their + attributes in one call +* added Channel.recv_exit_status() and Channel.send_exit_status() for + manipulating the exit status of a command from either client or server + mode +* moved check_global_request into ServerInterface, where it should've been + all along (oops) +* SFTPHandle's default implementations are fleshed out more +* made logging a bit more consistent, and started logging thread ids +* fixed a few race conditions, one of which would sometimes cause a Transport + to fail to start on slow machines +* more unit tests + +v1.1 KABUTO +* server-side SFTP support +* added support for stderr streams on client & server channels +* added a new distinct exception for failed client authentication + when caused by the server rejecting that *type* of auth +* added support for multi-part authentication +* fixed bug where get_username() wasn't working in server mode + +v1.0 JIGGLYPUFF +* fixed bug that broke server-mode authentication by private key +* fixed bug where closing a Channel could end up killing the entire + Transport +* actually include demo_windows.py this time (oops!) +* fixed recently-introduced bug in group-exchange key negotiation that + would generate the wrong hash (and therefore fail the initial handshake) +* server-mode subsystem handler is a bit more flexible + + +*** MISSING LINKS + +* host-based auth (yuck!) +* SFTP implicit file locking? +* ChannelException like the java version has +* would be nice to have windows putty "pagent" support -- looks very hard + +* ctr forms of ciphers are missing (blowfish-ctr, aes128-ctr, aes256-ctr) +* sftp protocol 6 support (ugh....) -- once it settles down more + +* make a simple example demonstrating use of SocketServer (besides forward.py?) + +* make a function to parse .ssh/config files: + User, Hostname, Port, ProxyCommand, IdentityFile, HostKeyAlias + ProxyCommand: %h = host, %p = port, "none" = disable diff --git a/demo.py b/demo.py new file mode 100644 index 0000000..a02e886 --- /dev/null +++ b/demo.py @@ -0,0 +1,210 @@ +#!/usr/bin/python + +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + + +# ----- WINDOWS USERS PLEASE NOTE ----- +# This demo won't work on Windows because it uses pseudo-terminals, which +# are a posix-only feature. check out the README file for a simpler demo. + + +import sys, os, socket, threading, getpass, time, base64, select, termios, tty, traceback +import paramiko + + +##### utility functions + +def agent_auth(username, t, event): + agent = paramiko.Agent() + agent_keys = agent.get_keys() + if len(agent_keys) > 0: + for key in agent_keys: + print 'Trying ssh-agent key %s' % paramiko.util.hexify(key.get_fingerprint()), + t.auth_publickey(username, key, event) + event.wait(10) + if t.is_authenticated(): + print '... success!' + return + print '... nope.' + +def manual_auth(username, hostname, event): + default_auth = 'p' + auth = raw_input('Auth by (p)assword, (r)sa key, or (d)ss key? [%s] ' % default_auth) + if len(auth) == 0: + auth = default_auth + + if auth == 'r': + default_path = os.environ['HOME'] + '/.ssh/id_rsa' + path = raw_input('RSA key [%s]: ' % default_path) + if len(path) == 0: + path = default_path + try: + key = paramiko.RSAKey.from_private_key_file(path) + except paramiko.PasswordRequiredException: + password = getpass.getpass('RSA key password: ') + key = paramiko.RSAKey.from_private_key_file(path, password) + t.auth_publickey(username, key, event) + elif auth == 'd': + default_path = os.environ['HOME'] + '/.ssh/id_dsa' + path = raw_input('DSS key [%s]: ' % default_path) + if len(path) == 0: + path = default_path + try: + key = paramiko.DSSKey.from_private_key_file(path) + except paramiko.PasswordRequiredException: + password = getpass.getpass('DSS key password: ') + key = paramiko.DSSKey.from_private_key_file(path, password) + t.auth_publickey(username, key, event) + else: + pw = getpass.getpass('Password for %s@%s: ' % (username, hostname)) + t.auth_password(username, pw, event) + + +##### main demo + +# setup logging +paramiko.util.log_to_file('demo.log') + + +username = '' +if len(sys.argv) > 1: + hostname = sys.argv[1] + if hostname.find('@') >= 0: + username, hostname = hostname.split('@') +else: + hostname = raw_input('Hostname: ') +if len(hostname) == 0: + print '*** Hostname required.' + sys.exit(1) +port = 22 +if hostname.find(':') >= 0: + hostname, portstr = hostname.split(':') + port = int(portstr) + +# now connect +try: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.connect((hostname, port)) +except Exception, e: + print '*** Connect failed: ' + str(e) + traceback.print_exc() + sys.exit(1) + +try: + event = threading.Event() + t = paramiko.Transport(sock) + t.start_client(event) + # print repr(t) + event.wait(15) + if not t.is_active(): + print '*** SSH negotiation failed.' + sys.exit(1) + # print repr(t) + + try: + keys = paramiko.util.load_host_keys(os.path.expanduser('~/.ssh/known_hosts')) + except IOError: + try: + keys = paramiko.util.load_host_keys(os.path.expanduser('~/ssh/known_hosts')) + except IOError: + print '*** Unable to open host keys file' + keys = {} + + key = t.get_remote_server_key() + if not keys.has_key(hostname): + print '*** WARNING: Unknown host key!' + elif not keys[hostname].has_key(key.get_name()): + print '*** WARNING: Unknown host key!' + elif keys[hostname][key.get_name()] != key: + print '*** WARNING: Host key has changed!!!' + sys.exit(1) + else: + print '*** Host key OK.' + + event.clear() + + # get username + if username == '': + default_username = getpass.getuser() + username = raw_input('Username [%s]: ' % default_username) + if len(username) == 0: + username = default_username + + agent_auth(username, t, event) + + # ask for what kind of authentication to try + if not t.is_authenticated(): + manual_auth(username, hostname, event) + + event.wait(10) + # print repr(t) + if not t.is_authenticated(): + print '*** Authentication failed. :(' + t.close() + sys.exit(1) + + chan = t.open_session() + chan.get_pty() + chan.invoke_shell() + print '*** Here we go!' + print + + try: + oldtty = termios.tcgetattr(sys.stdin) + tty.setraw(sys.stdin.fileno()) + tty.setcbreak(sys.stdin.fileno()) + chan.settimeout(0.0) + + while 1: + r, w, e = select.select([chan, sys.stdin], [], []) + if chan in r: + try: + x = chan.recv(1024) + if len(x) == 0: + print + print '*** EOF\r\n', + break + sys.stdout.write(x) + sys.stdout.flush() + except socket.timeout: + pass + if sys.stdin in r: + # FIXME: reading 1 byte at a time is incredibly dumb. + x = sys.stdin.read(1) + if len(x) == 0: + print + print '*** Bye.\r\n', + break + chan.send(x) + + finally: + termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty) + + chan.close() + t.close() + +except Exception, e: + print '*** Caught exception: ' + str(e.__class__) + ': ' + str(e) + traceback.print_exc() + try: + t.close() + except: + pass + sys.exit(1) + diff --git a/demo_server.py b/demo_server.py new file mode 100644 index 0000000..599eb46 --- /dev/null +++ b/demo_server.py @@ -0,0 +1,138 @@ +#!/usr/bin/python + +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +import sys, os, socket, threading, traceback, base64 +import paramiko + +# setup logging +paramiko.util.log_to_file('demo_server.log') + +#host_key = paramiko.RSAKey(filename='tests/test_rsa.key') +host_key = paramiko.DSSKey(filename='tests/test_dss.key') + +print 'Read key: ' + paramiko.util.hexify(host_key.get_fingerprint()) + + +class Server (paramiko.ServerInterface): + # 'data' is the output of base64.encodestring(str(key)) + data = 'AAAAB3NzaC1yc2EAAAABIwAAAIEAyO4it3fHlmGZWJaGrfeHOVY7RWO3P9M7hpfAu7jJ2d7eothvfeuoRFtJwhUmZDluRdFyhFY/hFAh76PJKGAusIqIQKlkJxMCKDqIexkgHAfID/6mqvmnSJf0b5W8v5h2pI/stOSwTQ+pxVhwJ9ctYDhRSlF0iTUWT10hcuO4Ks8=' + good_pub_key = paramiko.RSAKey(data=base64.decodestring(data)) + + def __init__(self): + self.event = threading.Event() + + def check_channel_request(self, kind, chanid): + if kind == 'session': + return paramiko.OPEN_SUCCEEDED + return paramiko.OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED + + def check_auth_password(self, username, password): + if (username == 'robey') and (password == 'foo'): + return paramiko.AUTH_SUCCESSFUL + return paramiko.AUTH_FAILED + + def check_auth_publickey(self, username, key): + print 'Auth attempt with key: ' + paramiko.util.hexify(key.get_fingerprint()) + if (username == 'robey') and (key == self.good_pub_key): + return paramiko.AUTH_SUCCESSFUL + return paramiko.AUTH_FAILED + + def get_allowed_auths(self, username): + return 'password,publickey' + + def check_channel_shell_request(self, channel): + self.event.set() + return True + + def check_channel_pty_request(self, channel, term, width, height, pixelwidth, + pixelheight, modes): + return True + + +# now connect +try: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + sock.bind(('', 2200)) +except Exception, e: + print '*** Bind failed: ' + str(e) + traceback.print_exc() + sys.exit(1) + +try: + sock.listen(100) + print 'Listening for connection ...' + client, addr = sock.accept() +except Exception, e: + print '*** Listen/accept failed: ' + str(e) + traceback.print_exc() + sys.exit(1) + +print 'Got a connection!' + +try: + event = threading.Event() + t = paramiko.Transport(client) + try: + t.load_server_moduli() + except: + print '(Failed to load moduli -- gex will be unsupported.)' + raise + t.add_server_key(host_key) + server = Server() + t.start_server(event, server) + while 1: + event.wait(0.1) + if not t.is_active(): + print '*** SSH negotiation failed.' + sys.exit(1) + if event.isSet(): + break + # print repr(t) + + # wait for auth + chan = t.accept(20) + if chan is None: + print '*** No channel.' + sys.exit(1) + print 'Authenticated!' + server.event.wait(10) + if not server.event.isSet(): + print '*** Client never asked for a shell.' + sys.exit(1) + + chan.send('\r\n\r\nWelcome to my dorky little BBS!\r\n\r\n') + chan.send('We are on fire all the time! Hooray! Candy corn for everyone!\r\n') + chan.send('Happy birthday to Robot Dave!\r\n\r\n') + chan.send('Username: ') + f = chan.makefile('rU') + username = f.readline().strip('\r\n') + chan.send('\r\nI don\'t like you, ' + username + '.\r\n') + chan.close() + +except Exception, e: + print '*** Caught exception: ' + str(e.__class__) + ': ' + str(e) + traceback.print_exc() + try: + t.close() + except: + pass + sys.exit(1) + diff --git a/demo_simple.py b/demo_simple.py new file mode 100644 index 0000000..655a1a4 --- /dev/null +++ b/demo_simple.py @@ -0,0 +1,128 @@ +#!/usr/bin/python + +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + + +# ----- WINDOWS USERS PLEASE NOTE ----- +# This demo won't work on Windows because it uses pseudo-terminals, which +# are a posix-only feature. check out the README file for a simpler demo. + + +import sys, os, base64, getpass, socket, traceback, termios, tty, select +import paramiko + + +# setup logging +paramiko.util.log_to_file('demo_simple.log') + +# get hostname +username = '' +if len(sys.argv) > 1: + hostname = sys.argv[1] + if hostname.find('@') >= 0: + username, hostname = hostname.split('@') +else: + hostname = raw_input('Hostname: ') +if len(hostname) == 0: + print '*** Hostname required.' + sys.exit(1) +port = 22 +if hostname.find(':') >= 0: + hostname, portstr = hostname.split(':') + port = int(portstr) + + +# get username +if username == '': + default_username = getpass.getuser() + username = raw_input('Username [%s]: ' % default_username) + if len(username) == 0: + username = default_username +password = getpass.getpass('Password for %s@%s: ' % (username, hostname)) + + +# get host key, if we know one +hostkeytype = None +hostkey = None +try: + hkeys = paramiko.util.load_host_keys(os.path.expanduser('~/.ssh/known_hosts')) +except IOError: + try: + hkeys = paramiko.util.load_host_keys(os.path.expanduser('~/ssh/known_hosts')) + except IOError: + print '*** Unable to open host keys file' + hkeys = {} + +if hkeys.has_key(hostname): + hostkeytype = hkeys[hostname].keys()[0] + hostkey = hkeys[hostname][hostkeytype] + print 'Using host key of type %s' % hostkeytype + + +# now, connect and use paramiko Transport to negotiate SSH2 across the connection +try: + t = paramiko.Transport((hostname, port)) + t.connect(username=username, password=password, hostkey=hostkey) + chan = t.open_session() + chan.get_pty() + chan.invoke_shell() + print '*** Here we go!' + print + + try: + oldtty = termios.tcgetattr(sys.stdin) + tty.setraw(sys.stdin.fileno()) + tty.setcbreak(sys.stdin.fileno()) + chan.settimeout(0.0) + + while True: + r, w, e = select.select([chan, sys.stdin], [], []) + if chan in r: + try: + x = chan.recv(1024) + if len(x) == 0: + print '\r\n*** EOF\r\n', + break + sys.stdout.write(x) + sys.stdout.flush() + except socket.timeout: + pass + if sys.stdin in r: + # FIXME: reading 1 byte at a time is incredibly dumb. + x = sys.stdin.read(1) + if len(x) == 0: + print + print '*** Bye.\r\n', + break + chan.send(x) + + finally: + termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty) + + chan.close() + t.close() + +except Exception, e: + print '*** Caught exception: %s: %s' % (e.__class__, e) + traceback.print_exc() + try: + t.close() + except: + pass + sys.exit(1) diff --git a/docs/epydoc.css b/docs/epydoc.css new file mode 100644 index 0000000..46080bd --- /dev/null +++ b/docs/epydoc.css @@ -0,0 +1,100 @@ + +/* Body color */ +body { background: #ffffff; color: #000000; } + +/* Tables */ +table.summary, table.details, table.index + { background: #e8f0f8; color: #000000; } +tr.summary, tr.details, tr.index + { background: #70b0f0; color: #000000; + text-align: left; font-size: 120%; } +tr.group { background: #c0e0f8; color: #000000; + text-align: left; font-size: 120%; + font-style: italic; } + +/* Documentation page titles */ +h2.module { margin-top: 0.2em; } +h2.class { margin-top: 0.2em; } + +/* Headings */ +h1.heading { font-size: +140%; font-style: italic; + font-weight: bold; } +h2.heading { font-size: +125%; font-style: italic; + font-weight: bold; } +h3.heading { font-size: +110%; font-style: italic; + font-weight: normal; } + +/* Base tree */ +pre.base-tree { font-size: 80%; margin: 0; } + +/* Details Sections */ +table.func-details { background: #e8f0f8; color: #000000; + border: 2px groove #c0d0d0; + padding: 0 1em 0 1em; margin: 0.4em 0 0 0; } +h3.func-detail { background: transparent; color: #000000; + margin: 0 0 1em 0; } + +table.var-details { background: #e8f0f8; color: #000000; + border: 2px groove #c0d0d0; + padding: 0 1em 0 1em; margin: 0.4em 0 0 0; } +h3.var-details { background: transparent; color: #000000; + margin: 0 0 1em 0; } + +/* Function signatures */ +.sig { background: transparent; color: #000000; + font-weight: bold; } +.sig-name { background: transparent; color: #006080; } +.sig-arg, .sig-kwarg, .sig-vararg + { background: transparent; color: #008060; } +.sig-default { background: transparent; color: #602000; } +.summary-sig { background: transparent; color: #000000; } +.summary-sig-name { background: transparent; color: #204080; } +.summary-sig-arg, .summary-sig-kwarg, .summary-sig-vararg + { background: transparent; color: #008060; } + +/* Doctest blocks */ +.py-src { background: transparent; color: #000000; } +.py-prompt { background: transparent; color: #005050; + font-weight: bold;} +.py-string { background: transparent; color: #006030; } +.py-comment { background: transparent; color: #003060; } +.py-keyword { background: transparent; color: #600000; } +.py-output { background: transparent; color: #404040; } +pre.doctestblock { background: #f4faff; color: #000000; + padding: .5em; margin: 1em; + border: 1px solid #708890; } +table pre.doctestblock + { background: #dce4ec; color: #000000; + padding: .5em; margin: 1em; + border: 1px solid #708890; } + +/* Variable values */ +pre.variable { background: #dce4ec; color: #000000; + padding: .5em; margin: 0; + border: 1px solid #708890; } +.variable-linewrap { background: transparent; color: #604000; } +.variable-ellipsis { background: transparent; color: #604000; } +.variable-quote { background: transparent; color: #604000; } +.re { background: transparent; color: #000000; } +.re-char { background: transparent; color: #006030; } +.re-op { background: transparent; color: #600000; } +.re-group { background: transparent; color: #003060; } +.re-ref { background: transparent; color: #404040; } + +/* Navigation bar */ +table.navbar { background: #a0c0ff; color: #0000ff; + border: 2px groove #c0d0d0; } +th.navbar { background: #a0c0ff; color: #0000ff; } +th.navselect { background: #70b0ff; color: #000000; } +.nomargin { margin: 0; } + +/* Links */ +a:link { background: transparent; color: #0000ff; } +a:visited { background: transparent; color: #204080; } +a.navbar:link { background: transparent; color: #0000ff; + text-decoration: none; } +a.navbar:visited { background: transparent; color: #204080; + text-decoration: none; } + +/* Lists */ +ul { margin-top: 0; } diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..d2fca35 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,13 @@ + + + + API Documentation + + + + + + + + + diff --git a/docs/private/__builtin__.object-class.html b/docs/private/__builtin__.object-class.html new file mode 100644 index 0000000..1ac54de --- /dev/null +++ b/docs/private/__builtin__.object-class.html @@ -0,0 +1,286 @@ + + + + + __builtin__.object + + + + + + + + + + + + + + + + + + +
+ + Module __builtin__ :: + Class object +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type object

+ +
Known Subclasses:
+
+ BufferedFile, + Channel, + InteractiveQuery, + Message, + PFilter, + SecurityOptions, + SFTPAttributes, + SFTPHandle, + type, + _Verbose, + AuthHandler, + BaseSFTP, + BER, + Formatter, + KexGex, + KexGroup1, + logger, + ModulusPack, + Packetizer, + PKey, + PosixPipe, + ServerInterface, + SFTPServerInterface, + StreamHandler, + WindowsPipe, + ZlibCompressor, + ZlibDecompressor
+ +
+ +The most base type +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for +signature
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + +
Class Variable Summary
type__class__ = __builtin__.type

+ + + + + + +
Method Details
+ + +
+

__init__(...) +
(Constructor) +

+ x.__init__(...) initializes x; see x.__class__.__doc__ for + signature +
+
+
+ + +
+

__delattr__(...) +

+ x.__delattr__('name') <==> del x.name +
+
+
+ + +
+

__getattribute__(...) +

+ x.__getattribute__('name') <==> x.name +
+
+
+ + +
+

__hash__(x) +
(Hashing function) +

+ x.__hash__() <==> hash(x) +
+
Returns:
+
+
+hash(x)
+
+
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+ T.__new__(S, ...) -> a new object with type S, a subtype of T +
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
+
+ + +
+

__reduce__(...) +

+ helper for pickle +
+
+
+ + +
+

__reduce_ex__(...) +

+ helper for pickle +
+
+
+ + +
+

__repr__(x) +
(Representation operator) +

+ x.__repr__() <==> repr(x) +
+
Returns:
+
+
+repr(x)
+
+
+
+
+
+ + +
+

__setattr__(...) +

+ x.__setattr__('name', value) <==> x.name = value +
+
+
+ + +
+

__str__(x) +
(Informal representation operator) +

+ x.__str__() <==> str(x) +
+
Returns:
+
+
+str(x)
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:46 2005http://epydoc.sf.net
+ + diff --git a/docs/private/__builtin__.type-class.html b/docs/private/__builtin__.type-class.html new file mode 100644 index 0000000..0f1957a --- /dev/null +++ b/docs/private/__builtin__.type-class.html @@ -0,0 +1,504 @@ + + + + + __builtin__.type + + + + + + + + + + + + + + + + + + +
+ + Module __builtin__ :: + Class type +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type type

+ +
+object --+
+         |
+        type
+

+ +
+ +type(object) -> the object's type type(name, bases, dict) -> a +new type +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __call__(x, + ...) +
+x.__call__(...) <==> x(...)
 __cmp__(x, + y) +
+x.__cmp__(y) <==> cmp(x,y)
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
list of immediate subclasses__subclasses__() +
+__subclasses__() -> list of immediate subclasses
listmro() +
+return a type's method resolution order
    Inherited from object
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for +signature
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + + + + + + + + + + + + + + +
Class Variable Summary
type__base__ = __builtin__.object
tuple__bases__ = (<type 'object'>,) +
int__basicsize__ = 420                                                                   
int__dictoffset__ = 132                                                                   
int__flags__ = 21995                                                                 
int__itemsize__ = 20                                                                    
tuple__mro__ = (<type 'type'>, <type 'object'>) +
str__name__ = 'type' +
int__weakrefoffset__ = 184                                                                   

+ + + + + + +
Method Details
+ + +
+

__call__(x, + ...) +
(Call operator) +

+ x.__call__(...) <==> x(...) +
+
Returns:
+
+
+x(...)
+
+
+
+
+
+ + +
+

__cmp__(x, + y) +
(Comparison operator) +

+ x.__cmp__(y) <==> cmp(x,y) +
+
Returns:
+
+
+cmp(x,y)
+
+
+
+
+
+ + +
+

__delattr__(...) +

+ x.__delattr__('name') <==> del x.name +
+
Overrides:
+
__builtin__.object.__delattr__
+
+
+
+ + +
+

__getattribute__(...) +

+ x.__getattribute__('name') <==> x.name +
+
Overrides:
+
__builtin__.object.__getattribute__
+
+
+
+ + +
+

__hash__(x) +
(Hashing function) +

+ x.__hash__() <==> hash(x) +
+
Returns:
+
+
+hash(x)
+
+
+
+
Overrides:
+
__builtin__.object.__hash__
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+ T.__new__(S, ...) -> a new object with type S, a subtype of T +
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
Overrides:
+
__builtin__.object.__new__
+
+
+
+ + +
+

__repr__(x) +
(Representation operator) +

+ x.__repr__() <==> repr(x) +
+
Returns:
+
+
+repr(x)
+
+
+
+
Overrides:
+
__builtin__.object.__repr__
+
+
+
+ + +
+

__setattr__(...) +

+ x.__setattr__('name', value) <==> x.name = value +
+
Overrides:
+
__builtin__.object.__setattr__
+
+
+
+ + +
+

__subclasses__() +

+ __subclasses__() -> list of immediate subclasses +
+
Returns:
+
+list of immediate subclasses
+
+
+
+ + +
+

mro() +

+ return a type's method resolution order +
+
Returns:
+
+list
+
+
+
+
+ + + + + + +
Class Variable Details
+
+ +

__bases__

+
+
+
+
+
Type:
+
+ tuple + +
+
Value:
+
+
+(<type 'object'>,)                                                     
+
+
+
+
+
+ +

__basicsize__

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+420                                                                   
+
+
+
+
+
+ +

__dictoffset__

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+132                                                                   
+
+
+
+
+
+ +

__flags__

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+21995                                                                 
+
+
+
+
+
+ +

__itemsize__

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+20                                                                    
+
+
+
+
+
+ +

__mro__

+
+
+
+
+
Type:
+
+ tuple + +
+
Value:
+
+
+(<type 'type'>, <type 'object'>)                                       
+
+
+
+
+
+ +

__name__

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'type'                                                                 
+
+
+
+
+
+ +

__weakrefoffset__

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+184                                                                   
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/epydoc.css b/docs/private/epydoc.css new file mode 100644 index 0000000..46080bd --- /dev/null +++ b/docs/private/epydoc.css @@ -0,0 +1,100 @@ + +/* Body color */ +body { background: #ffffff; color: #000000; } + +/* Tables */ +table.summary, table.details, table.index + { background: #e8f0f8; color: #000000; } +tr.summary, tr.details, tr.index + { background: #70b0f0; color: #000000; + text-align: left; font-size: 120%; } +tr.group { background: #c0e0f8; color: #000000; + text-align: left; font-size: 120%; + font-style: italic; } + +/* Documentation page titles */ +h2.module { margin-top: 0.2em; } +h2.class { margin-top: 0.2em; } + +/* Headings */ +h1.heading { font-size: +140%; font-style: italic; + font-weight: bold; } +h2.heading { font-size: +125%; font-style: italic; + font-weight: bold; } +h3.heading { font-size: +110%; font-style: italic; + font-weight: normal; } + +/* Base tree */ +pre.base-tree { font-size: 80%; margin: 0; } + +/* Details Sections */ +table.func-details { background: #e8f0f8; color: #000000; + border: 2px groove #c0d0d0; + padding: 0 1em 0 1em; margin: 0.4em 0 0 0; } +h3.func-detail { background: transparent; color: #000000; + margin: 0 0 1em 0; } + +table.var-details { background: #e8f0f8; color: #000000; + border: 2px groove #c0d0d0; + padding: 0 1em 0 1em; margin: 0.4em 0 0 0; } +h3.var-details { background: transparent; color: #000000; + margin: 0 0 1em 0; } + +/* Function signatures */ +.sig { background: transparent; color: #000000; + font-weight: bold; } +.sig-name { background: transparent; color: #006080; } +.sig-arg, .sig-kwarg, .sig-vararg + { background: transparent; color: #008060; } +.sig-default { background: transparent; color: #602000; } +.summary-sig { background: transparent; color: #000000; } +.summary-sig-name { background: transparent; color: #204080; } +.summary-sig-arg, .summary-sig-kwarg, .summary-sig-vararg + { background: transparent; color: #008060; } + +/* Doctest blocks */ +.py-src { background: transparent; color: #000000; } +.py-prompt { background: transparent; color: #005050; + font-weight: bold;} +.py-string { background: transparent; color: #006030; } +.py-comment { background: transparent; color: #003060; } +.py-keyword { background: transparent; color: #600000; } +.py-output { background: transparent; color: #404040; } +pre.doctestblock { background: #f4faff; color: #000000; + padding: .5em; margin: 1em; + border: 1px solid #708890; } +table pre.doctestblock + { background: #dce4ec; color: #000000; + padding: .5em; margin: 1em; + border: 1px solid #708890; } + +/* Variable values */ +pre.variable { background: #dce4ec; color: #000000; + padding: .5em; margin: 0; + border: 1px solid #708890; } +.variable-linewrap { background: transparent; color: #604000; } +.variable-ellipsis { background: transparent; color: #604000; } +.variable-quote { background: transparent; color: #604000; } +.re { background: transparent; color: #000000; } +.re-char { background: transparent; color: #006030; } +.re-op { background: transparent; color: #600000; } +.re-group { background: transparent; color: #003060; } +.re-ref { background: transparent; color: #404040; } + +/* Navigation bar */ +table.navbar { background: #a0c0ff; color: #0000ff; + border: 2px groove #c0d0d0; } +th.navbar { background: #a0c0ff; color: #0000ff; } +th.navselect { background: #70b0ff; color: #000000; } +.nomargin { margin: 0; } + +/* Links */ +a:link { background: transparent; color: #0000ff; } +a:visited { background: transparent; color: #204080; } +a.navbar:link { background: transparent; color: #0000ff; + text-decoration: none; } +a.navbar:visited { background: transparent; color: #204080; + text-decoration: none; } + +/* Lists */ +ul { margin-top: 0; } diff --git a/docs/private/exceptions.Exception-class.html b/docs/private/exceptions.Exception-class.html new file mode 100644 index 0000000..4b99d99 --- /dev/null +++ b/docs/private/exceptions.Exception-class.html @@ -0,0 +1,87 @@ + + + + + exceptions.Exception + + + + + + + + + + + + + + + + + + +
+ + Module exceptions :: + Class Exception +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class Exception

+ +
Known Subclasses:
+
+ SFTPError, + SSHException, + BERException, + NeedRekeyException
+ +
+ +Common base class for all exceptions. +
+ + + + + + + + + + + + +
Method Summary
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/frames.html b/docs/private/frames.html new file mode 100644 index 0000000..77678a0 --- /dev/null +++ b/docs/private/frames.html @@ -0,0 +1,13 @@ + + + + API Documentation + + + + + + + + + diff --git a/docs/private/help.html b/docs/private/help.html new file mode 100644 index 0000000..5aab6d0 --- /dev/null +++ b/docs/private/help.html @@ -0,0 +1,224 @@ + + + + + Help + + + + + + + + + + + + + + + + + + +
+ + + +
[show private | hide private]
[frames | no frames]
+ +

API Documentation

+ +

This document contains the API (Application Programming Interface) +documentation for this project. Documentation for the Python +objects defined by the project is divided into separate pages for each +package, module, and class. The API documentation also includes two +pages containing information about the project as a whole: a trees +page, and an index page.

+ +

Object Documentation

+ +

Each Package Documentation page contains: +

    +
  • A description of the package.
  • +
  • A list of the modules and sub-packages contained by the + package.
  • +
  • A summary of the classes defined by the package.
  • +
  • A summary of the functions defined by the package.
  • +
  • A summary of the variables defined by the package.
  • +
  • A detailed description of each function defined by the + package.
  • +
  • A detailed description of each variable defined by the + package.
  • +

+ +

Each Module Documentation page contains: +

    +
  • A description of the module.
  • +
  • A summary of the classes defined by the module.
  • +
  • A summary of the functions defined by the module.
  • +
  • A summary of the variables defined by the module.
  • +
  • A detailed description of each function defined by the + module.
  • +
  • A detailed description of each variable defined by the + module.
  • +

+ +

Each Class Documentation page contains: +

    +
  • A class inheritance diagram.
  • +
  • A list of known subclasses.
  • +
  • A description of the class.
  • +
  • A summary of the methods defined by the class.
  • +
  • A summary of the instance variables defined by the class.
  • +
  • A summary of the class (static) variables defined by the + class.
  • +
  • A detailed description of each method defined by the + class.
  • +
  • A detailed description of each instance variable defined by the + class.
  • +
  • A detailed description of each class (static) variable defined + by the class.
  • +

+ +

Project Documentation

+ +

The Trees page contains the module and class hierarchies: +

    +
  • The module hierarchy lists every package and module, with + modules grouped into packages. At the top level, and within each + package, modules and sub-packages are listed alphabetically.
  • +
  • The class hierarchy lists every class, grouped by base + class. If a class has more than one base class, then it will be + listed under each base class. At the top level, and under each base + class, classes are listed alphabetically.
  • +

+ +

The Index page contains indices of terms and + identifiers: +

    +
  • The term index lists every term indexed by any object's + documentation. For each term, the index provides links to each + place where the term is indexed.
  • +
  • The identifier index lists the (short) name of every package, + module, class, method, function, variable, and parameter. For each + identifier, the index provides a short description, and a link to + its documentation.
  • +

+ +

The Table of Contents

+ +

The table of contents occupies the two frames on the left side of +the window. The upper-left frame displays the project +contents, and the lower-left frame displays the module +contents:

+ +
+ + + + + + + + +
+ Project
Contents
...
+ API
Documentation
Frame


+
+ Module
Contents
 
...
 
+

+
+ +

The project contents frame contains a list of all packages +and modules that are defined by the project. Clicking on an entry +will display its contents in the module contents frame. Clicking on a +special entry, labeled "Everything," will display the contents of +the entire project.

+ +

The module contents frame contains a list of every +submodule, class, type, exception, function, and variable defined by a +module or package. Clicking on an entry will display its +documentation in the API documentation frame. Clicking on the name of +the module, at the top of the frame, will display the documentation +for the module itself.

+ +

The "frames" and "no frames" buttons below the top +navigation bar can be used to control whether the table of contents is +displayed or not.

+ +

The Navigation Bar

+ +

A navigation bar is located at the top and bottom of every page. +It indicates what type of page you are currently viewing, and allows +you to go to related pages. The following table describes the labels +on the navigation bar. Note that not some labels (such as +[Parent]) are not displayed on all pages.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LabelHighlighted when...Links to...
[Parent](never highlighted) the parent of the current package
[Package]viewing a packagethe package containing the current object +
[Module]viewing a modulethe module containing the current object +
[Class]viewing a class the class containing the current object
[Trees]viewing the trees page the trees page
[Index]viewing the index page the index page
[Help]viewing the help page the help page
+ +

The "show private" and "hide private" buttons below +the top navigation bar can be used to control whether documentation +for private objects is displayed. Private objects are usually defined +as objects whose (short) names begin with a single underscore, but do +not end with an underscore. For example, "_x", +"__pprint", and "epydoc.epytext._tokenize" +are private objects; but "re.sub", +"__init__", and "type_" are not. However, +if a module defines the "__all__" variable, then its +contents are used to decide which objects are private.

+ +

A timestamp below the bottom navigation bar indicates when each +page was last updated.

+ + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/private/index.html b/docs/private/index.html new file mode 100644 index 0000000..77678a0 --- /dev/null +++ b/docs/private/index.html @@ -0,0 +1,13 @@ + + + + API Documentation + + + + + + + + + diff --git a/docs/private/indices.html b/docs/private/indices.html new file mode 100644 index 0000000..752a39a --- /dev/null +++ b/docs/private/indices.html @@ -0,0 +1,1635 @@ + + + + + Index + + + + + + + + + + + + + + + + + + +
+ + + +
[show private | hide private]
[frames | no frames]
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Identifier Index
__author__Variable in package paramiko
objectClass in module __builtin__
__bases__Variable in class __builtin__.type
__basicsize__Variable in class __builtin__.type
__bootstrapMethod in class threading.Thread
__call__Method in class __builtin__.type
__call__Method in class paramiko.compress.ZlibCompressor
__call__Method in class paramiko.compress.ZlibDecompressor
typeClass in module __builtin__
__cmp__Method in class __builtin__.type
__cmp__Method in class paramiko.PKey
__date__Variable in package paramiko
__del__Method in class paramiko.BufferedFile
__del__Method in class paramiko.Channel
__del__Method in class paramiko.Packetizer
__del__Method in class paramiko.SFTPClient
__del__Method in class paramiko.SFTPFile
__del__Method in class paramiko.Transport
__delattr__Method in class __builtin__.object
__delattr__Method in class __builtin__.type
__deleteMethod in class threading.Thread
__dictoffset__Variable in class __builtin__.type
__flags__Variable in class __builtin__.type
__getattribute__Method in class __builtin__.object
__getattribute__Method in class __builtin__.type
__getitem__Method in class exceptions.Exception
__hash__Method in class __builtin__.object
__hash__Method in class __builtin__.type
__hash__Method in class paramiko.DSSKey
__hash__Method in class paramiko.RSAKey
__init__Method in class __builtin__.object
__init__Method in class exceptions.Exception
__init__Method in class paramiko.Agent
__init__Method in class paramiko.AgentKey
__init__Method in class paramiko.AuthHandler
__init__Method in class paramiko.BadAuthenticationType
__init__Method in class paramiko.BaseSFTP
__init__Method in class paramiko.BufferedFile
__init__Method in class paramiko.Channel
__init__Method in class paramiko.ChannelFile
__init__Method in class paramiko.DSSKey
__init__Method in class paramiko.Message
__init__Method in class paramiko.PKey
__init__Method in class paramiko.Packetizer
__init__Method in class paramiko.RSAKey
__init__Method in class paramiko.SFTPAttributes
__init__Method in class paramiko.SFTPClient
__init__Method in class paramiko.SFTPFile
__init__Method in class paramiko.SFTPHandle
__init__Method in class paramiko.SFTPServer
__init__Method in class paramiko.SFTPServerInterface
__init__Method in class paramiko.SecurityOptions
__init__Method in class paramiko.SubsystemHandler
__init__Method in class paramiko.Transport
__init__Method in class paramiko.ber.BER
__init__Method in class paramiko.channel.ChannelStderrFile
__init__Method in class paramiko.compress.ZlibCompressor
__init__Method in class paramiko.compress.ZlibDecompressor
__init__Method in class paramiko.kex_gex.KexGex
__init__Method in class paramiko.kex_group1.KexGroup1
__init__Method in class paramiko.logging22.Formatter
__init__Method in class paramiko.logging22.StreamHandler
__init__Method in class paramiko.logging22.logger
__init__Method in class paramiko.pipe.PosixPipe
__init__Method in class paramiko.pipe.WindowsPipe
__init__Method in class paramiko.primes.ModulusPack
__init__Method in class paramiko.server.InteractiveQuery
__init__Method in class paramiko.ssh_exception.PartialAuthentication
__init__Method in class threading.Thread
__init__Method in class threading._Verbose
__itemsize__Variable in class __builtin__.type
__iter__Method in class paramiko.BufferedFile
__license__Variable in package paramiko
__mro__Variable in class __builtin__.type
__name__Variable in class __builtin__.type
__new__Method in class __builtin__.object
__new__Method in class __builtin__.type
__reduce__Method in class __builtin__.object
__reduce_ex__Method in class __builtin__.object
__repr__Method in class __builtin__.object
__repr__Method in class __builtin__.type
__repr__Method in class paramiko.Channel
__repr__Method in class paramiko.ChannelFile
__repr__Method in class paramiko.Message
__repr__Method in class paramiko.SFTPAttributes
__repr__Method in class paramiko.SecurityOptions
__repr__Method in class paramiko.Transport
__repr__Method in class paramiko.ber.BER
__repr__Method in class threading.Thread
__setattr__Method in class __builtin__.object
__setattr__Method in class __builtin__.type
__slots__Variable in class paramiko.SecurityOptions
__stopMethod in class threading.Thread
__str__Method in class __builtin__.object
__str__Method in class exceptions.Exception
__str__Method in class paramiko.AgentKey
__str__Method in class paramiko.BadAuthenticationType
__str__Method in class paramiko.DSSKey
__str__Method in class paramiko.Message
__str__Method in class paramiko.PKey
__str__Method in class paramiko.RSAKey
__str__Method in class paramiko.SFTPAttributes
__str__Method in class paramiko.ber.BER
__subclasses__Method in class __builtin__.type
__version__Variable in package paramiko
__version_info__Variable in package paramiko
__weakrefoffset__Variable in class __builtin__.type
_activate_inboundMethod in class paramiko.Transport
_activate_outboundMethod in class paramiko.Transport
_active_threadsVariable in module paramiko.transport
_addMethod in class paramiko.Message
_adjust_cwdMethod in class paramiko.SFTPClient
_async_requestMethod in class paramiko.SFTPClient
_async_responseMethod in class paramiko.SFTPFile
_auth_triggerMethod in class paramiko.Transport
_build_packetMethod in class paramiko.Packetizer
_channel_handler_tableVariable in class paramiko.Transport
_check_add_windowMethod in class paramiko.Channel
_check_bannerMethod in class paramiko.Transport
_check_exceptionMethod in class paramiko.SFTPFile
_check_fileMethod in class paramiko.SFTPServer
_check_keepaliveMethod in class paramiko.Packetizer
_cipher_infoVariable in class paramiko.Transport
_CIPHER_TABLEVariable in class paramiko.PKey
_CIPHER_TABLEVariable in class paramiko.PKey
_CIPHER_TABLEVariable in class paramiko.PKey
_CIPHER_TABLEVariable in class paramiko.PKey
_CLIENT_IDVariable in class paramiko.Transport
_close_internalMethod in class paramiko.Channel
_compression_infoVariable in class paramiko.Transport
_compute_keyMethod in class paramiko.Transport
_convert_pflagsMethod in class paramiko.SFTPServer
_convert_statusMethod in class paramiko.SFTPClient
_debug_strMethod in class paramiko.SFTPAttributes
_DEFAULT_BUFSIZEVariable in class paramiko.BufferedFile
_DEFAULT_BUFSIZEVariable in class paramiko.BufferedFile
_DEFAULT_BUFSIZEVariable in class paramiko.BufferedFile
_DEFAULT_BUFSIZEVariable in class paramiko.BufferedFile
_disconnect_no_more_authMethod in class paramiko.AuthHandler
_disconnect_service_not_availableMethod in class paramiko.AuthHandler
_expect_packetMethod in class paramiko.Transport
_feedMethod in class paramiko.Channel
_feed_extendedMethod in class paramiko.Channel
_finish_responsesMethod in class paramiko.SFTPClient
_FLAG_APPENDVariable in module paramiko.file
_FLAG_BINARYVariable in module paramiko.file
_FLAG_BUFFEREDVariable in module paramiko.file
_FLAG_LINE_BUFFEREDVariable in module paramiko.file
_FLAG_READVariable in module paramiko.file
_FLAG_UNIVERSAL_NEWLINEVariable in module paramiko.file
_FLAG_WRITEVariable in module paramiko.file
_from_msgMethod in class paramiko.SFTPAttributes
_from_private_key_fileMethod in class paramiko.DSSKey
_from_private_key_fileMethod in class paramiko.RSAKey
_g_thread_counterVariable in module paramiko.util
_g_thread_idsVariable in module paramiko.util
_g_thread_lockVariable in module paramiko.util
_generate_primeFunction in module paramiko.primes
_generate_xMethod in class paramiko.kex_gex.KexGex
_generate_xMethod in class paramiko.kex_group1.KexGroup1
_get_cipherMethod in class paramiko.Transport
_get_ciphersMethod in class paramiko.SecurityOptions
_get_compressionMethod in class paramiko.SecurityOptions
_get_digestsMethod in class paramiko.SecurityOptions
_get_kexMethod in class paramiko.SecurityOptions
_get_key_typesMethod in class paramiko.SecurityOptions
_get_modulus_packMethod in class paramiko.Transport
_get_nameMethod in class paramiko.SFTPHandle
_get_next_filesMethod in class paramiko.SFTPHandle
_get_session_blobMethod in class paramiko.AuthHandler
_get_sizeMethod in class paramiko.BufferedFile
_get_sizeMethod in class paramiko.SFTPFile
_get_subsystem_handlerMethod in class paramiko.Transport
_handle_closeMethod in class paramiko.Channel
_handle_eofMethod in class paramiko.Channel
_handle_requestMethod in class paramiko.Channel
_handler_tableVariable in class paramiko.AuthHandler
_handler_tableVariable in class paramiko.Transport
_hash_classVariable in module paramiko.sftp_server
_interactive_queryMethod in class paramiko.AuthHandler
_join_lingering_threadsFunction in module paramiko.transport
_kex_infoVariable in class paramiko.Transport
_key_infoVariable in class paramiko.Transport
_logMethod in class paramiko.BaseSFTP
_logMethod in class paramiko.Channel
_logMethod in class paramiko.Packetizer
_logMethod in class paramiko.Transport
_loggerVariable in module paramiko.logging22
_mac_infoVariable in class paramiko.Transport
_modulus_packVariable in class paramiko.Transport
_MSG_KEXDH_GEX_GROUPVariable in module paramiko.kex_gex
_MSG_KEXDH_GEX_INITVariable in module paramiko.kex_gex
_MSG_KEXDH_GEX_REPLYVariable in module paramiko.kex_gex
_MSG_KEXDH_GEX_REQUESTVariable in module paramiko.kex_gex
_MSG_KEXDH_INITVariable in module paramiko.kex_group1
_MSG_KEXDH_REPLYVariable in module paramiko.kex_group1
_negotiate_keysMethod in class paramiko.Transport
_noteMethod in class threading._Verbose
_open_folderMethod in class paramiko.SFTPServer
_packMethod in class paramiko.SFTPAttributes
_parse_channel_openMethod in class paramiko.Transport
_parse_channel_open_failureMethod in class paramiko.Transport
_parse_channel_open_successMethod in class paramiko.Transport
_parse_debugMethod in class paramiko.Transport
_parse_disconnectMethod in class paramiko.Transport
_parse_global_requestMethod in class paramiko.Transport
_parse_kex_initMethod in class paramiko.Transport
_parse_kexdh_gex_groupMethod in class paramiko.kex_gex.KexGex
_parse_kexdh_gex_initMethod in class paramiko.kex_gex.KexGex
_parse_kexdh_gex_replyMethod in class paramiko.kex_gex.KexGex
_parse_kexdh_gex_requestMethod in class paramiko.kex_gex.KexGex
_parse_kexdh_initMethod in class paramiko.kex_group1.KexGroup1
_parse_kexdh_replyMethod in class paramiko.kex_group1.KexGroup1
_parse_modulusMethod in class paramiko.primes.ModulusPack
_parse_newkeysMethod in class paramiko.Transport
_parse_request_failureMethod in class paramiko.Transport
_parse_request_successMethod in class paramiko.Transport
_parse_service_acceptMethod in class paramiko.AuthHandler
_parse_service_requestMethod in class paramiko.AuthHandler
_parse_userauth_bannerMethod in class paramiko.AuthHandler
_parse_userauth_failureMethod in class paramiko.AuthHandler
_parse_userauth_info_requestMethod in class paramiko.AuthHandler
_parse_userauth_info_responseMethod in class paramiko.AuthHandler
_parse_userauth_requestMethod in class paramiko.AuthHandler
_parse_userauth_successMethod in class paramiko.AuthHandler
_pfilterVariable in module paramiko.util
_pkcs1imifyMethod in class paramiko.RSAKey
_preferred_ciphersVariable in class paramiko.Transport
_preferred_compressionVariable in class paramiko.Transport
_preferred_kexVariable in class paramiko.Transport
_preferred_keysVariable in class paramiko.Transport
_preferred_macsVariable in class paramiko.Transport
_prefetchMethod in class paramiko.SFTPFile
_processMethod in class paramiko.SFTPServer
_PROTO_IDVariable in class paramiko.Transport
_py22_read_allMethod in class paramiko.Packetizer
_py22_read_timeoutMethod in class paramiko.Packetizer
_readMethod in class paramiko.BufferedFile
_readMethod in class paramiko.ChannelFile
_readMethod in class paramiko.SFTPFile
_readMethod in class paramiko.channel.ChannelStderrFile
_read_allMethod in class paramiko.Agent
_read_allMethod in class paramiko.BaseSFTP
_read_folderMethod in class paramiko.SFTPServer
_read_packetMethod in class paramiko.BaseSFTP
_read_prefetchMethod in class paramiko.SFTPFile
_read_private_key_fileMethod in class paramiko.PKey
_read_responseMethod in class paramiko.SFTPClient
_read_timeoutMethod in class paramiko.Packetizer
_record_newlineMethod in class paramiko.BufferedFile
_requestMethod in class paramiko.SFTPClient
_request_authMethod in class paramiko.AuthHandler
_request_failedMethod in class paramiko.Channel
_request_successMethod in class paramiko.Channel
_responseMethod in class paramiko.SFTPServer
_roll_randomFunction in module paramiko.primes
_runMethod in class paramiko.SubsystemHandler
_rwxMethod in class paramiko.SFTPAttributes
_send_auth_resultMethod in class paramiko.AuthHandler
_send_eofMethod in class paramiko.Channel
_send_handle_responseMethod in class paramiko.SFTPServer
_send_kex_initMethod in class paramiko.Transport
_send_messageMethod in class paramiko.Agent
_send_messageMethod in class paramiko.Transport
_send_packetMethod in class paramiko.BaseSFTP
_send_server_versionMethod in class paramiko.BaseSFTP
_send_statusMethod in class paramiko.SFTPServer
_send_user_messageMethod in class paramiko.Transport
_send_versionMethod in class paramiko.BaseSFTP
_setMethod in class paramiko.SecurityOptions
_set_ciphersMethod in class paramiko.SecurityOptions
_set_closedMethod in class paramiko.Channel
_set_compressionMethod in class paramiko.SecurityOptions
_set_daemonMethod in class threading.Thread
_set_digestsMethod in class paramiko.SecurityOptions
_set_filesMethod in class paramiko.SFTPHandle
_set_K_HMethod in class paramiko.Transport
_set_kexMethod in class paramiko.SecurityOptions
_set_key_typesMethod in class paramiko.SecurityOptions
_set_modeMethod in class paramiko.BufferedFile
_set_nameMethod in class paramiko.SFTPHandle
_set_remote_channelMethod in class paramiko.Channel
_set_transportMethod in class paramiko.Channel
_set_windowMethod in class paramiko.Channel
__initializedVariable in class threading.Thread
__initializedVariable in class threading.Thread
__initializedVariable in class threading.Thread
__initializedVariable in class threading.Thread
_to_unicodeFunction in module paramiko.sftp_client
_transportVariable in class paramiko.SecurityOptions
_trigger_rekeyMethod in class paramiko.Packetizer
_unlinkMethod in class paramiko.Channel
_unlink_channelMethod in class paramiko.Transport
_unpackMethod in class paramiko.SFTPAttributes
_VerboseClass in module threading
_verify_keyMethod in class paramiko.Transport
_VERSIONVariable in module paramiko.sftp
_wait_for_send_windowMethod in class paramiko.Channel
_window_adjustMethod in class paramiko.Channel
_writeMethod in class paramiko.BufferedFile
_writeMethod in class paramiko.ChannelFile
_writeMethod in class paramiko.SFTPFile
_writeMethod in class paramiko.channel.ChannelStderrFile
_write_allMethod in class paramiko.BaseSFTP
_write_allMethod in class paramiko.BufferedFile
_write_private_key_fileMethod in class paramiko.PKey
abortMethod in class paramiko.AuthHandler
acceptMethod in class paramiko.Transport
addMethod in class paramiko.Message
add_booleanMethod in class paramiko.Message
add_byteMethod in class paramiko.Message
add_bytesMethod in class paramiko.Message
add_intMethod in class paramiko.Message
add_int64Method in class paramiko.Message
add_listMethod in class paramiko.Message
add_mpintMethod in class paramiko.Message
add_promptMethod in class paramiko.server.InteractiveQuery
add_server_keyMethod in class paramiko.Transport
add_stringMethod in class paramiko.Message
addFilterMethod in class paramiko.logging22.logger
addHandlerMethod in class paramiko.logging22.logger
AgentClass in package paramiko
agentModule in package paramiko
AgentKeyClass in package paramiko
allowed_typesVariable in class paramiko.BadAuthenticationType
allowed_typesVariable in class paramiko.ssh_exception.PartialAuthentication
AUTH_FAILEDVariable in module paramiko.common
auth_handlerModule in package paramiko
auth_interactiveMethod in class paramiko.AuthHandler
auth_interactiveMethod in class paramiko.Transport
auth_noneMethod in class paramiko.AuthHandler
auth_noneMethod in class paramiko.Transport
AUTH_PARTIALLY_SUCCESSFULVariable in module paramiko.common
auth_passwordMethod in class paramiko.AuthHandler
auth_passwordMethod in class paramiko.Transport
auth_publickeyMethod in class paramiko.AuthHandler
auth_publickeyMethod in class paramiko.Transport
AUTH_SUCCESSFULVariable in module paramiko.common
AuthHandlerClass in package paramiko
BadAuthenticationTypeClass in package paramiko
BaseSFTPClass in package paramiko
berModule in package paramiko
BERClass in module paramiko.ber
BERExceptionClass in module paramiko.ber
bit_lengthFunction in module paramiko.util
BufferedFileClass in package paramiko
can_signMethod in class paramiko.DSSKey
can_signMethod in class paramiko.PKey
can_signMethod in class paramiko.RSAKey
canonicalizeMethod in class paramiko.SFTPServerInterface
ChannelClass in package paramiko
channelModule in package paramiko
ChannelFileClass in package paramiko
ChannelStderrFileClass in module paramiko.channel
chattrMethod in class paramiko.SFTPHandle
chattrMethod in class paramiko.SFTPServerInterface
chdirMethod in class paramiko.SFTPClient
checkMethod in class paramiko.SFTPFile
check_auth_interactiveMethod in class paramiko.ServerInterface
check_auth_interactive_responseMethod in class paramiko.ServerInterface
check_auth_noneMethod in class paramiko.ServerInterface
check_auth_passwordMethod in class paramiko.ServerInterface
check_auth_publickeyMethod in class paramiko.ServerInterface
check_channel_exec_requestMethod in class paramiko.ServerInterface
check_channel_pty_requestMethod in class paramiko.ServerInterface
check_channel_requestMethod in class paramiko.ServerInterface
check_channel_shell_requestMethod in class paramiko.ServerInterface
check_channel_subsystem_requestMethod in class paramiko.ServerInterface
check_channel_window_change_requestMethod in class paramiko.ServerInterface
check_global_requestMethod in class paramiko.ServerInterface
chmodMethod in class paramiko.SFTPClient
chownMethod in class paramiko.SFTPClient
ciphersMethod in class paramiko.SFTPClient in class paramiko.SecurityOptions
clearMethod in class paramiko.pipe.PosixPipe
clearMethod in class paramiko.pipe.WindowsPipe
closeMethod in class paramiko.Agent
closeMethod in class paramiko.BufferedFile
closeMethod in class paramiko.Channel
closeMethod in class paramiko.Packetizer
closeMethod in class paramiko.SFTPClient
closeMethod in class paramiko.SFTPFile
closeMethod in class paramiko.SFTPHandle
closeMethod in class paramiko.Transport
closeMethod in class paramiko.pipe.PosixPipe
closeMethod in class paramiko.pipe.WindowsPipe
CMD_ATTRSVariable in module paramiko.sftp
CMD_CLOSEVariable in module paramiko.sftp
CMD_DATAVariable in module paramiko.sftp
CMD_EXTENDEDVariable in module paramiko.sftp
CMD_EXTENDED_REPLYVariable in module paramiko.sftp
CMD_FSETSTATVariable in module paramiko.sftp
CMD_FSTATVariable in module paramiko.sftp
CMD_HANDLEVariable in module paramiko.sftp
CMD_INITVariable in module paramiko.sftp
CMD_LSTATVariable in module paramiko.sftp
CMD_MKDIRVariable in module paramiko.sftp
CMD_NAMEVariable in module paramiko.sftp
CMD_NAMESVariable in module paramiko.sftp
CMD_OPENVariable in module paramiko.sftp
CMD_OPENDIRVariable in module paramiko.sftp
CMD_READVariable in module paramiko.sftp
CMD_READDIRVariable in module paramiko.sftp
CMD_READLINKVariable in module paramiko.sftp
CMD_REALPATHVariable in module paramiko.sftp
CMD_REMOVEVariable in module paramiko.sftp
CMD_RENAMEVariable in module paramiko.sftp
CMD_RMDIRVariable in module paramiko.sftp
CMD_SETSTATVariable in module paramiko.sftp
CMD_STATVariable in module paramiko.sftp
CMD_STATUSVariable in module paramiko.sftp
CMD_SYMLINKVariable in module paramiko.sftp
CMD_VERSIONVariable in module paramiko.sftp
CMD_WRITEVariable in module paramiko.sftp
commonModule in package paramiko
compressModule in package paramiko
compressionModule in package paramiko in class paramiko.SecurityOptions
connectMethod in class paramiko.Transport
CONNECTION_FAILED_CODEVariable in module paramiko.common
convert_errnoMethod in class paramiko.SFTPServer
CRITICALVariable in module paramiko.common
CRITICALVariable in module paramiko.logging22
DEBUGVariable in module paramiko.common
DEBUGVariable in module paramiko.logging22
decodeMethod in class paramiko.ber.BER
decode_nextMethod in class paramiko.ber.BER
decode_sequenceMethod in class paramiko.ber.BER
deflate_longFunction in module paramiko.util
digestsFunction in module paramiko.util in class paramiko.SecurityOptions
DISCONNECT_AUTH_CANCELLED_BY_USERVariable in module paramiko.common
DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLEVariable in module paramiko.common
DISCONNECT_SERVICE_NOT_AVAILABLEVariable in module paramiko.common
DSSKeyClass in package paramiko
dsskeyModule in package paramiko
encodeMethod in class paramiko.ber.BER
encode_sequenceMethod in class paramiko.ber.BER
encode_tlvMethod in class paramiko.ber.BER
ERRORVariable in module paramiko.common
ERRORVariable in module paramiko.logging22
exc_infoFunction in module sys
ExceptionClass in module exceptions
exec_commandMethod in class paramiko.Channel
fileMethod in class paramiko.SFTPClient
fileModule in package paramiko
filenoMethod in class paramiko.Channel
filenoMethod in class paramiko.pipe.PosixPipe
filenoMethod in class paramiko.pipe.WindowsPipe
filterMethod in class paramiko.util.PFilter
finish_subsystemMethod in class paramiko.SFTPServer
finish_subsystemMethod in class paramiko.SubsystemHandler
FLAG_AMTIMEVariable in class paramiko.SFTPAttributes
FLAG_EXTENDEDVariable in class paramiko.SFTPAttributes
FLAG_PERMISSIONSVariable in class paramiko.SFTPAttributes
FLAG_SIZEVariable in class paramiko.SFTPAttributes
FLAG_UIDGIDVariable in class paramiko.SFTPAttributes
flushMethod in class paramiko.BufferedFile
format_binaryFunction in module paramiko.util
format_binary_lineFunction in module paramiko.util
format_binary_weirdFunction in module paramiko.util
FormatterClass in module paramiko.logging22
from_private_key_fileMethod in class paramiko.PKey
from_statMethod in class paramiko.SFTPAttributes
from_transportMethod in class paramiko.SFTPClient
GVariable in module paramiko.kex_group1
generateMethod in class paramiko.DSSKey
generateMethod in class paramiko.RSAKey
generate_key_bytesFunction in module paramiko.util
getMethod in class paramiko.SFTPClient
get_allowed_authsMethod in class paramiko.ServerInterface
get_base64Method in class paramiko.PKey
get_bitsMethod in class paramiko.DSSKey
get_bitsMethod in class paramiko.PKey
get_bitsMethod in class paramiko.RSAKey
get_booleanMethod in class paramiko.Message
get_byteMethod in class paramiko.Message
get_bytesMethod in class paramiko.Message
get_exceptionMethod in class paramiko.Transport
get_fingerprintMethod in class paramiko.PKey
get_hexdumpMethod in class paramiko.Packetizer
get_hexdumpMethod in class paramiko.Transport
get_idMethod in class paramiko.Channel
get_intMethod in class paramiko.Message
get_int64Method in class paramiko.Message
get_keysMethod in class paramiko.Agent
get_listMethod in class paramiko.Message
get_log_channelMethod in class paramiko.Transport
get_loggerFunction in module paramiko.util
get_mac_size_inMethod in class paramiko.Packetizer
get_mac_size_outMethod in class paramiko.Packetizer
get_modulusMethod in class paramiko.primes.ModulusPack
get_mpintMethod in class paramiko.Message
get_nameMethod in class paramiko.AgentKey
get_nameMethod in class paramiko.Channel
get_nameMethod in class paramiko.DSSKey
get_nameMethod in class paramiko.PKey
get_nameMethod in class paramiko.RSAKey
get_ptyMethod in class paramiko.Channel
get_remainderMethod in class paramiko.Message
get_remote_server_keyMethod in class paramiko.Transport
get_security_optionsMethod in class paramiko.Transport
get_serverMethod in class paramiko.SubsystemHandler
get_server_keyMethod in class paramiko.Transport
get_so_farMethod in class paramiko.Message
get_stringMethod in class paramiko.Message
get_thread_idFunction in module paramiko.util
get_transportMethod in class paramiko.Channel
get_usernameMethod in class paramiko.AuthHandler
get_usernameMethod in class paramiko.Transport
getcwdMethod in class paramiko.SFTPClient
getLoggerFunction in module paramiko.logging22
getNameMethod in class threading.Thread
gettimeoutMethod in class paramiko.Channel
gettimeoutMethod in class paramiko.SFTPFile
global_requestMethod in class paramiko.Transport
hexifyFunction in module paramiko.util
inflate_longFunction in module paramiko.util
INFOVariable in module paramiko.common
INFOVariable in module paramiko.logging22
InteractiveQueryClass in module paramiko.server
invoke_shellMethod in class paramiko.Channel
invoke_subsystemMethod in class paramiko.Channel
is_activeMethod in class paramiko.Transport
is_authenticatedMethod in class paramiko.AuthHandler
is_authenticatedMethod in class paramiko.Transport
isAliveMethod in class threading.Thread
isDaemonMethod in class threading.Thread
joinMethod in class threading.Thread
kexMethod in class threading.Thread in class paramiko.SecurityOptions
kex_gexModule in package paramiko
kex_group1Module in package paramiko
KexGexClass in module paramiko.kex_gex
KexGroup1Class in module paramiko.kex_group1
key_typesClass in module paramiko.kex_group1 in class paramiko.SecurityOptions
list_folderMethod in class paramiko.SFTPServerInterface
listdirMethod in class paramiko.SFTPClient
listdir_attrMethod in class paramiko.SFTPClient
load_host_keysFunction in module paramiko.util
load_server_moduliMethod in class paramiko.Transport
logMethod in class paramiko.logging22.logger
log_to_fileFunction in module paramiko.util
loggerClass in module paramiko.logging22
logging22Module in package paramiko
lookup_ssh_host_configFunction in module paramiko.util
lstatMethod in class paramiko.SFTPClient
lstatMethod in class paramiko.SFTPServerInterface
make_pipeFunction in module paramiko.pipe
makefileMethod in class paramiko.Channel
makefile_stderrMethod in class paramiko.Channel
max_bitsVariable in class paramiko.kex_gex.KexGex
MAX_REQUEST_SIZEVariable in class paramiko.SFTPFile
MessageClass in package paramiko
messageModule in package paramiko
min_bitsVariable in class paramiko.kex_gex.KexGex
MIN_PACKET_SIZEVariable in class paramiko.Channel
mkdirMethod in class paramiko.SFTPClient
mkdirMethod in class paramiko.SFTPServerInterface
mod_inverseFunction in module paramiko.util
ModulusPackClass in module paramiko.primes
mroMethod in class __builtin__.type
MSG_CHANNEL_CLOSEVariable in module paramiko.common
MSG_CHANNEL_DATAVariable in module paramiko.common
MSG_CHANNEL_EOFVariable in module paramiko.common
MSG_CHANNEL_EXTENDED_DATAVariable in module paramiko.common
MSG_CHANNEL_FAILUREVariable in module paramiko.common
MSG_CHANNEL_OPENVariable in module paramiko.common
MSG_CHANNEL_OPEN_FAILUREVariable in module paramiko.common
MSG_CHANNEL_OPEN_SUCCESSVariable in module paramiko.common
MSG_CHANNEL_REQUESTVariable in module paramiko.common
MSG_CHANNEL_SUCCESSVariable in module paramiko.common
MSG_CHANNEL_WINDOW_ADJUSTVariable in module paramiko.common
MSG_DEBUGVariable in module paramiko.common
MSG_DISCONNECTVariable in module paramiko.common
MSG_GLOBAL_REQUESTVariable in module paramiko.common
MSG_IGNOREVariable in module paramiko.common
MSG_KEXINITVariable in module paramiko.common
MSG_NAMESVariable in module paramiko.common
MSG_NEWKEYSVariable in module paramiko.common
MSG_REQUEST_FAILUREVariable in module paramiko.common
MSG_REQUEST_SUCCESSVariable in module paramiko.common
MSG_SERVICE_ACCEPTVariable in module paramiko.common
MSG_SERVICE_REQUESTVariable in module paramiko.common
MSG_UNIMPLEMENTEDVariable in module paramiko.common
MSG_USERAUTH_BANNERVariable in module paramiko.common
MSG_USERAUTH_FAILUREVariable in module paramiko.common
MSG_USERAUTH_INFO_REQUESTVariable in module paramiko.common
MSG_USERAUTH_INFO_RESPONSEVariable in module paramiko.common
MSG_USERAUTH_PK_OKVariable in module paramiko.common
MSG_USERAUTH_REQUESTVariable in module paramiko.common
MSG_USERAUTH_SUCCESSVariable in module paramiko.common
nameVariable in class paramiko.kex_gex.KexGex
nameVariable in class paramiko.kex_group1.KexGroup1
need_rekeyMethod in class paramiko.Packetizer
NeedRekeyExceptionClass in module paramiko.packet
nextMethod in class paramiko.BufferedFile
normalizeMethod in class paramiko.SFTPClient
objectClass in module __builtin__
openMethod in class paramiko.SFTPServerInterface
open_channelMethod in class paramiko.Transport
open_sessionMethod in class paramiko.Transport
open_sftp_clientMethod in class paramiko.Transport
PVariable in module paramiko.kex_group1
packetModule in package paramiko
PacketizerClass in package paramiko
paramikoPackage
parse_nextMethod in class paramiko.kex_gex.KexGex
parse_nextMethod in class paramiko.kex_group1.KexGroup1
parse_ssh_configFunction in module paramiko.util
PartialAuthenticationClass in module paramiko.ssh_exception
PasswordRequiredExceptionClass in package paramiko
PFilterClass in module paramiko.util
pipeModule in package paramiko
PKeyClass in package paramiko
pkeyModule in package paramiko
PosixPipeClass in module paramiko.pipe
preferred_bitsVariable in class paramiko.kex_gex.KexGex
prefetchMethod in class paramiko.SFTPFile
primesModule in package paramiko
putMethod in class paramiko.SFTPClient
readMethod in class paramiko.BufferedFile
readMethod in class paramiko.SFTPHandle
read_allMethod in class paramiko.Packetizer
read_fileMethod in class paramiko.primes.ModulusPack
read_messageMethod in class paramiko.Packetizer
readlineMethod in class paramiko.BufferedFile
readlineMethod in class paramiko.Packetizer
readlinesMethod in class paramiko.BufferedFile
readlinkMethod in class paramiko.SFTPClient
readlinkMethod in class paramiko.SFTPServerInterface
recvMethod in class paramiko.Channel
recv_exit_statusMethod in class paramiko.Channel
recv_readyMethod in class paramiko.Channel
recv_stderrMethod in class paramiko.Channel
recv_stderr_readyMethod in class paramiko.Channel
REKEY_BYTESVariable in class paramiko.Packetizer
REKEY_PACKETSVariable in class paramiko.Packetizer
removeMethod in class paramiko.SFTPClient
removeMethod in class paramiko.SFTPServerInterface
renameMethod in class paramiko.SFTPClient
renameMethod in class paramiko.SFTPServerInterface
renegotiate_keysMethod in class paramiko.Transport
resize_ptyMethod in class paramiko.Channel
rewindMethod in class paramiko.Message
rmdirMethod in class paramiko.SFTPClient
rmdirMethod in class paramiko.SFTPServerInterface
RSAKeyClass in package paramiko
rsakeyModule in package paramiko
runMethod in class paramiko.Transport
runMethod in class threading.Thread
safe_stringFunction in module paramiko.util
SecurityOptionsClass in package paramiko
seekMethod in class paramiko.BufferedFile
seekMethod in class paramiko.SFTPFile
SEEK_CURVariable in class paramiko.BufferedFile
SEEK_CURVariable in class paramiko.BufferedFile
SEEK_CURVariable in class paramiko.BufferedFile
SEEK_CURVariable in class paramiko.BufferedFile
SEEK_ENDVariable in class paramiko.BufferedFile
SEEK_ENDVariable in class paramiko.BufferedFile
SEEK_ENDVariable in class paramiko.BufferedFile
SEEK_ENDVariable in class paramiko.BufferedFile
SEEK_SETVariable in class paramiko.BufferedFile
SEEK_SETVariable in class paramiko.BufferedFile
SEEK_SETVariable in class paramiko.BufferedFile
SEEK_SETVariable in class paramiko.BufferedFile
sendMethod in class paramiko.Channel
send_exit_statusMethod in class paramiko.Channel
send_ignoreMethod in class paramiko.Transport
send_messageMethod in class paramiko.Packetizer
send_stderrMethod in class paramiko.Channel
sendallMethod in class paramiko.Channel
sendall_stderrMethod in class paramiko.Channel
serverModule in package paramiko
ServerInterfaceClass in package paramiko
session_endedMethod in class paramiko.SFTPServerInterface
session_startedMethod in class paramiko.SFTPServerInterface
setMethod in class paramiko.pipe.PosixPipe
setMethod in class paramiko.pipe.WindowsPipe
set_combine_stderrMethod in class paramiko.Channel
set_file_attrMethod in class paramiko.SFTPServer
set_foreverMethod in class paramiko.pipe.PosixPipe
set_foreverMethod in class paramiko.pipe.WindowsPipe
set_hexdumpMethod in class paramiko.Packetizer
set_hexdumpMethod in class paramiko.Transport
set_inbound_cipherMethod in class paramiko.Packetizer
set_inbound_compressorMethod in class paramiko.Packetizer
set_keepaliveMethod in class paramiko.Packetizer
set_keepaliveMethod in class paramiko.Transport
set_logMethod in class paramiko.Packetizer
set_log_channelMethod in class paramiko.Transport
set_nameMethod in class paramiko.Channel
set_outbound_cipherMethod in class paramiko.Packetizer
set_outbound_compressorMethod in class paramiko.Packetizer
set_pipelinedMethod in class paramiko.SFTPFile
set_subsystem_handlerMethod in class paramiko.Transport
setblockingMethod in class paramiko.Channel
setblockingMethod in class paramiko.SFTPFile
setDaemonMethod in class threading.Thread
setFormatterMethod in class paramiko.logging22.StreamHandler
setLevelMethod in class paramiko.logging22.logger
setNameMethod in class threading.Thread
settimeoutMethod in class paramiko.Channel
settimeoutMethod in class paramiko.SFTPFile
SFTPClass in package paramiko
sftpModule in package paramiko
sftp_attrModule in package paramiko
SFTP_BAD_MESSAGEVariable in module paramiko.sftp
sftp_clientModule in package paramiko
SFTP_CONNECTION_LOSTVariable in module paramiko.sftp
SFTP_DESCVariable in module paramiko.sftp
SFTP_EOFVariable in module paramiko.sftp
SFTP_FAILUREVariable in module paramiko.sftp
sftp_fileModule in package paramiko
SFTP_FLAG_APPENDVariable in module paramiko.sftp
SFTP_FLAG_CREATEVariable in module paramiko.sftp
SFTP_FLAG_EXCLVariable in module paramiko.sftp
SFTP_FLAG_READVariable in module paramiko.sftp
SFTP_FLAG_TRUNCVariable in module paramiko.sftp
SFTP_FLAG_WRITEVariable in module paramiko.sftp
sftp_handleModule in package paramiko
SFTP_NO_CONNECTIONVariable in module paramiko.sftp
SFTP_NO_SUCH_FILEVariable in module paramiko.sftp
SFTP_OKVariable in module paramiko.sftp
SFTP_OP_UNSUPPORTEDVariable in module paramiko.sftp
SFTP_PERMISSION_DENIEDVariable in module paramiko.sftp
sftp_serverModule in package paramiko
sftp_siModule in package paramiko
SFTPAttributesClass in package paramiko
SFTPClientClass in package paramiko
SFTPErrorClass in package paramiko
SFTPFileClass in package paramiko
SFTPHandleClass in package paramiko
SFTPServerClass in package paramiko
SFTPServerInterfaceClass in package paramiko
shutdownMethod in class paramiko.Channel
shutdown_readMethod in class paramiko.Channel
shutdown_writeMethod in class paramiko.Channel
sign_ssh_dataMethod in class paramiko.AgentKey
sign_ssh_dataMethod in class paramiko.DSSKey
sign_ssh_dataMethod in class paramiko.PKey
sign_ssh_dataMethod in class paramiko.RSAKey
SSH2_AGENT_IDENTITIES_ANSWERVariable in module paramiko.agent
SSH2_AGENT_SIGN_RESPONSEVariable in module paramiko.agent
SSH2_AGENTC_REQUEST_IDENTITIESVariable in module paramiko.agent
SSH2_AGENTC_SIGN_REQUESTVariable in module paramiko.agent
ssh_exceptionModule in package paramiko
SSHExceptionClass in package paramiko
startMethod in class threading.Thread
start_clientMethod in class paramiko.Transport
start_kexMethod in class paramiko.kex_gex.KexGex
start_kexMethod in class paramiko.kex_group1.KexGroup1
start_serverMethod in class paramiko.Transport
start_subsystemMethod in class paramiko.SFTPServer
start_subsystemMethod in class paramiko.SubsystemHandler
statMethod in class paramiko.SFTPClient
statMethod in class paramiko.SFTPFile
statMethod in class paramiko.SFTPHandle
statMethod in class paramiko.SFTPServerInterface
stop_threadMethod in class paramiko.Transport
StreamHandlerClass in module paramiko.logging22
SubsystemHandlerClass in package paramiko
symlinkMethod in class paramiko.SFTPClient
symlinkMethod in class paramiko.SFTPServerInterface
tb_stringsFunction in module paramiko.util
tellMethod in class paramiko.BufferedFile
ThreadClass in module threading
TransportClass in package paramiko
transportModule in package paramiko
typeClass in module __builtin__
unhexifyFunction in module paramiko.util
use_compressionMethod in class paramiko.Transport
utilModule in package paramiko
utimeMethod in class paramiko.SFTPClient
verify_ssh_sigMethod in class paramiko.DSSKey
verify_ssh_sigMethod in class paramiko.PKey
verify_ssh_sigMethod in class paramiko.RSAKey
wait_for_responseMethod in class paramiko.AuthHandler
WARNINGVariable in module paramiko.common
WARNINGVariable in module paramiko.logging22
WindowsPipeClass in module paramiko.pipe
writeMethod in class paramiko.BufferedFile
writeMethod in class paramiko.SFTPHandle
write_allMethod in class paramiko.Packetizer
write_private_key_fileMethod in class paramiko.DSSKey
write_private_key_fileMethod in class paramiko.PKey
write_private_key_fileMethod in class paramiko.RSAKey
writelinesMethod in class paramiko.BufferedFile
xreadlinesMethod in class paramiko.BufferedFile
ZlibCompressorClass in module paramiko.compress
ZlibDecompressorClass in module paramiko.compress
+
+ + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko-module.html b/docs/private/paramiko-module.html new file mode 100644 index 0000000..4e9f899 --- /dev/null +++ b/docs/private/paramiko-module.html @@ -0,0 +1,407 @@ + + + + + paramiko + + + + + + + + + + + + + + + + + + +
+ + Package paramiko +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Package paramiko

+ +

Paramiko (a combination of the esperanto words for +"paranoid" and "friend") is a module for python 2.3 +or greater that implements the SSH2 protocol for secure (encrypted and +authenticated) connections to remote machines. Unlike SSL (aka TLS), the +SSH2 protocol does not require heirarchical certificates signed by a +powerful central authority. You may know SSH2 as the protocol that +replaced telnet and rsh for secure access to +remote shells, but the protocol also includes the ability to open +arbitrary channels to remote services across an encrypted tunnel. (This +is how sftp works, for example.)

+

To use this package, pass a socket (or socket-like object) to a Transport, and use start_server or start_client to negoatite with the remote +host as either a server or client. As a client, you are responsible for +authenticating using a password or private key, and checking the server's +host key. (Key signature and verification is done by paramiko, but you +will need to provide private keys and check that the content of a public +key matches what you expected to see.) As a server, you are +responsible for deciding which users, passwords, and keys to allow, and +what kind of channels to allow.

+

Once you have finished, either side may request flow-controlled Channels +to the other side, which are python objects that act like sockets, but +send and receive data over the encrypted session.

+

Paramiko is written entirely in python (no C or platform-dependent +code) and is released under the GNU Lesser General Public License +(LGPL).

+Website: http://www.lag.net/paramiko/ +
+

Version: 1.5.2 (rhydon) +

+ +

Author: Robey Pointer +

+ +

Contact: robey@lag.net +

+ +

License: GNU Lesser General Public License (LGPL) +

+ + + + + + + +
Submodules

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Classes
+ AgentClient interface for using private keys from an SSH agent running on +the local machine.
+ AgentKeyPrivate key held in a local SSH agent.
+ BufferedFileReusable base class to implement python-style file buffering around a +simpler stream.
+ ChannelA secure tunnel across an SSH Transport.
+ DSSKeyRepresentation of a DSS key which can be used to sign an verify SSH2 +data.
+ MessageAn SSH2 Message is a stream of bytes that encodes some +combination of strings, integers, bools, and infinite-precision integers +(known in python as longs).
+ RSAKeyRepresentation of an RSA key which can be used to sign and verify SSH2 +data.
+ SecurityOptionsSimple object containing the security preferences of an ssh +transport.
+ SFTPan alias for SFTPClient for backwards compatability
+ SFTPAttributesRepresentation of the attributes of a file (or proxied file) for SFTP +in client or server mode.
+ SFTPClientSFTP client object.
+ SFTPFileProxy object for a file on the remote server, in client mode SFTP.
+ SFTPHandleAbstract object representing a handle to an open file (or folder) in +an SFTP server implementation.
+ SFTPServerServer-side SFTP subsystem support.
+ SubsystemHandlerHandler for a subsytem in server mode.
+ TransportAn SSH Transport attaches to a stream (usually a socket), negotiates +an encrypted session, authenticates, and then creates stream tunnels, +called Channels, across the session.
+ AuthHandlerInternal class to handle the mechanics of authentication.
+ BaseSFTP 
+ ChannelFileA file-like wrapper around Channel.
+ PacketizerImplementation of the base SSH packet protocol.
+ PKeyBase class for public keys.
+ ServerInterfaceThis class defines an interface for controlling the behavior of +paramiko in server mode.
+ SFTPServerInterfaceThis class defines an interface for controlling the behavior of +paramiko when using the SFTPServer subsystem to provide an SFTP +server.
+ xThis class defines an interface for controlling the behavior of +paramiko in server mode.

+ + + + + + + + + + + + + + +
Exceptions
+ BadAuthenticationTypeException raised when an authentication type (like password) is used, +but the server isn't allowing that type.
+ PasswordRequiredExceptionException raised when a password is needed to unlock a private key +file.
+ SFTPError 
+ SSHExceptionException raised by failures in SSH2 protocol negotiation or logic +errors.

+ + + + + + + + + + + + + + + + +
Variable Summary
str__author__ = 'Robey Pointer <robey@lag.net>' +
str__date__ = '04 Dec 2005' +
str__license__ = 'GNU Lesser General Public License (LGPL)'... +
str__version__ = '1.5.2 (rhydon)' +
tuple__version_info__ = (1, 5, 2) +

+ + + + + + +
Variable Details
+
+ +

__author__

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'Robey Pointer <robey@lag.net>'                                        
+
+
+
+
+
+ +

__date__

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'04 Dec 2005'                                                          
+
+
+
+
+
+ +

__license__

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'GNU Lesser General Public License (LGPL)'                             
+
+
+
+
+
+ +

__version__

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'1.5.2 (rhydon)'                                                       
+
+
+
+
+
+ +

__version_info__

+
+
+
+
+
Type:
+
+ tuple + +
+
Value:
+
+
+(1, 5, 2)                                                              
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.Agent-class.html b/docs/private/paramiko.Agent-class.html new file mode 100644 index 0000000..1f4e20b --- /dev/null +++ b/docs/private/paramiko.Agent-class.html @@ -0,0 +1,155 @@ + + + + + paramiko.Agent + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class Agent +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class Agent

+ +
+ +

Client interface for using private keys from an SSH agent running on +the local machine. If an SSH agent is running, this class can be used to +connect to it and retreive PKey objects which can be used when +attempting to authenticate to remote SSH servers.

+Because the SSH agent protocol uses environment variables and +unix-domain sockets, this probably doesn't work on Windows. It does work +on most posix platforms though (Linux and MacOS X, for example). +
+ + + + + + + + + + + + + + + + +
Method Summary
 __init__(self) +
+Open a session with the local machine's SSH agent, if one is +running.
 close(self) +
+Close the SSH agent connection.
tuple of AgentKey +get_keys(self) +
+Return the list of keys available through the SSH agent, if any.
 _read_all(self, + wanted) +
 _send_message(self, + msg) +

+ + + + + + +
Method Details
+ + +
+

__init__(self) +
(Constructor) +

+ Open a session with the local machine's SSH agent, if one is + running. If no agent is running, initialization will succeed, but get_keys will return an empty tuple. +
+
Raises:
+
SSHException - + if an SSH agent is found, but speaks an incompatible + protocol +
+
+
+ + +
+

close(self) +

+ Close the SSH agent connection. +
+
+
+ + +
+

get_keys(self) +

+ Return the list of keys available through the SSH agent, if any. If + no SSH agent was running (or it couldn't be contacted), an empty list + will be returned. +
+
Returns:
+
+ a list of keys available on the SSH agent +
           + (type=tuple of AgentKey) +
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.AgentKey-class.html b/docs/private/paramiko.AgentKey-class.html new file mode 100644 index 0000000..28b1659 --- /dev/null +++ b/docs/private/paramiko.AgentKey-class.html @@ -0,0 +1,319 @@ + + + + + paramiko.AgentKey + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class AgentKey +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type AgentKey

+ +
+object --+    
+         |    
+      PKey --+
+             |
+            AgentKey
+

+ +
+ +Private key held in a local SSH agent. This type of key can be used +for authenticating to a remote server (signing). Most other key +operations work as expected. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + agent, + blob) +
str +__str__(self) +
+Return a string of an SSH Message made up of the public part(s) of +this key.
str +get_name(self) +
+Return the name of this private key implementation.
Message +sign_ssh_data(self, + randpool, + data) +
+Sign a blob of data with this private key, and return a Message +representing an SSH signature message.
    Inherited from PKey
int +__cmp__(self, + other) +
+Compare this key to another.
str +_read_private_key_file(self, + tag, + filename, + password) +
+Read an SSH2-format private key file, looking for a string of the type +"BEGIN xxx PRIVATE KEY" for some xxx, +base64-decode the text we find, and return it as a string.
 _write_private_key_file(self, + tag, + filename, + data, + password) +
+Write an SSH2-format private key file in a form that can be read by +paramiko or openssh.
bool +can_sign(self) +
+Return True if this key has the private part necessary +for signing data.
PKey +from_private_key_file(cl, + filename, + password) +
+Create a key object by reading a private key file. (Class method) +
str +get_base64(self) +
+Return a base64 string containing the public part of this key.
int +get_bits(self) +
+Return the number of significant bits in this key.
str +get_fingerprint(self) +
+Return an MD5 fingerprint of the public part of this key.
boolean +verify_ssh_sig(self, + data, + msg) +
+Given a blob of data, and an SSH message representing a signature of +that data, verify that it was signed with this key.
 write_private_key_file(self, + filename, + password) +
+Write private key contents into a file.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + + + + + +
Class Variable Summary
    Inherited from PKey
dict_CIPHER_TABLE = {'DES-EDE3-CBC': {'blocksize': 8, 'ciphe... +

+ + + + + + +
Instance Method Details
+ + +
+

__str__(self) +
(Informal representation operator) +

+ Return a string of an SSH Message made up of the public part(s) of + this key. This string is suitable for passing to __init__ to re-create the key object + later. +
+
Returns:
+
+ string representation of an SSH key message. +
           + (type=str) +
+
+
Overrides:
+
paramiko.PKey.__str__ (inherited documentation) +
+
+
+
+ + +
+

get_name(self) +

+ Return the name of this private key implementation. +
+
Returns:
+
+ name of this private key type, in SSH terminology (for + example, "ssh-rsa"). +
           + (type=str) +
+
+
Overrides:
+
paramiko.PKey.get_name (inherited documentation) +
+
+
+
+ + +
+

sign_ssh_data(self, + randpool, + data) +

+ Sign a blob of data with this private key, and return a Message representing an SSH signature + message. +
+
Parameters:
+
randpool - + a secure random number generator. +
           + (type=Crypto.Util.randpool.RandomPool) +
data - + the data to sign. +
           + (type=str) +
+
+
Returns:
+
+ an SSH signature message. +
           + (type=Message) +
+
+
Overrides:
+
paramiko.PKey.sign_ssh_data (inherited documentation) +
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.AuthHandler-class.html b/docs/private/paramiko.AuthHandler-class.html new file mode 100644 index 0000000..7c2b235 --- /dev/null +++ b/docs/private/paramiko.AuthHandler-class.html @@ -0,0 +1,282 @@ + + + + + paramiko.AuthHandler + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class AuthHandler +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type AuthHandler

+ +
+object --+
+         |
+        AuthHandler
+

+ +
+ +Internal class to handle the mechanics of authentication. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + transport) +
 _disconnect_no_more_auth(self) +
 _disconnect_service_not_available(self) +
 _get_session_blob(self, + key, + service, + username) +
 _interactive_query(self, + q) +
 _parse_service_accept(self, + m) +
 _parse_service_request(self, + m) +
 _parse_userauth_banner(self, + m) +
 _parse_userauth_failure(self, + m) +
 _parse_userauth_info_request(self, + m) +
 _parse_userauth_info_response(self, + m) +
 _parse_userauth_request(self, + m) +
 _parse_userauth_success(self, + m) +
 _request_auth(self) +
 _send_auth_result(self, + username, + method, + result) +
 abort(self) +
 auth_interactive(self, + username, + handler, + event, + submethods) +
+response_list = handler(title, instructions, prompt_list)
 auth_none(self, + username, + event) +
 auth_password(self, + username, + password, + event) +
 auth_publickey(self, + username, + key, + event) +
 get_username(self) +
 is_authenticated(self) +
 wait_for_response(self, + event) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + +
Class Variable Summary
dict_handler_table = {5: <function _parse_service_request at... +

+ + + + + + +
Method Details
+ + +
+

auth_interactive(self, + username, + handler, + event, + submethods='') +

+ response_list = handler(title, instructions, prompt_list) +
+
+
+
+ + + + + + +
Class Variable Details
+
+ +

_handler_table

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{5: <function _parse_service_request at 0xb7b0ae2c>,
+ 6: <function _parse_service_accept at 0xb7b0ae64>,
+ 50: <function _parse_userauth_request at 0xb7b0af0c>,
+ 51: <function _parse_userauth_failure at 0xb7b0af7c>,
+ 52: <function _parse_userauth_success at 0xb7b0af44>,
+ 53: <function _parse_userauth_banner at 0xb7b0afb4>,
+ 60: <function _parse_userauth_info_request at 0xb7b1302c>,
+ 61: <function _parse_userauth_info_response at 0xb7b13064>}           
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.BadAuthenticationType-class.html b/docs/private/paramiko.BadAuthenticationType-class.html new file mode 100644 index 0000000..023879a --- /dev/null +++ b/docs/private/paramiko.BadAuthenticationType-class.html @@ -0,0 +1,141 @@ + + + + + paramiko.BadAuthenticationType + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class BadAuthenticationType +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class BadAuthenticationType

+ +
+Exception --+    
+            |    
+ SSHException --+
+                |
+               BadAuthenticationType
+

+ +
+ +Exception raised when an authentication type (like password) is used, +but the server isn't allowing that type. (It may only allow public-key, +for example.) +
+ +

Since: 1.1 +

+ + + + + + + + + + + + + + +
Method Summary
 __init__(self, + explanation, + types) +
 __str__(self) +
    Inherited from Exception
 __getitem__(...) +

+ + + + + + + + +
Instance Variable Summary
listallowed_types: list of allowed authentication types provided by the server (possible +values are: "none", +"password", and +"publickey").

+ + + + + + +
Instance Variable Details
+
+ +

allowed_types

+list of allowed authentication types provided by the server (possible +values are: "none", +"password", and +"publickey"). +
+
+
+
+
Type:
+
+ list + +
+
Value:
+
+
+[]                                                                     
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.BaseSFTP-class.html b/docs/private/paramiko.BaseSFTP-class.html new file mode 100644 index 0000000..18917f0 --- /dev/null +++ b/docs/private/paramiko.BaseSFTP-class.html @@ -0,0 +1,149 @@ + + + + + paramiko.BaseSFTP + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class BaseSFTP +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type BaseSFTP

+ +
+object --+
+         |
+        BaseSFTP
+

+ +
Known Subclasses:
+
+ SFTPClient, + SFTPServer
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self) +
 _log(self, + level, + msg) +
 _read_all(self, + n) +
 _read_packet(self) +
 _send_packet(self, + t, + packet) +
 _send_server_version(self) +
 _send_version(self) +
 _write_all(self, + out) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:46 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.BufferedFile-class.html b/docs/private/paramiko.BufferedFile-class.html new file mode 100644 index 0000000..2ab7785 --- /dev/null +++ b/docs/private/paramiko.BufferedFile-class.html @@ -0,0 +1,656 @@ + + + + + paramiko.BufferedFile + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class BufferedFile +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type BufferedFile

+ +
+object --+
+         |
+        BufferedFile
+

+ +
Known Subclasses:
+
+ SFTPFile, + ChannelFile
+ +
+ +Reusable base class to implement python-style file buffering around a +simpler stream. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self) +
 __del__(self) +
iterator +__iter__(self) +
+Returns an iterator that can be used to iterate over the lines in this +file.
 close(self) +
+Close the file.
 flush(self) +
+Write out any data in the write buffer.
str +next(self) +
+Returns the next line from the input, or raises +StopIteration when EOF is hit.
str +read(self, + size) +
+Read at most size bytes from the file (less if we hit the +end of the file first).
str +readline(self, + size) +
+Read one entire line from the file.
list +readlines(self, + sizehint) +
+Read all remaining lines using readline and return them as a list.
 seek(self, + offset, + whence) +
+Set the file's current position, like stdio's fseek.
int +tell(self) +
+Return the file's current position.
 write(self, + data) +
+Write data to the file.
 writelines(self, + sequence) +
+Write a sequence of strings to the file.
iterator +xreadlines(self) +
+Identical to iter(f).
 _get_size(self) +
+(subclass override) Return the size of the file.
 _read(self, + size) +
+(subclass override) Read data from the stream.
 _record_newline(self, + newline) +
 _set_mode(self, + mode, + bufsize) +
+Subclasses call this method to initialize the BufferedFile.
 _write(self, + data) +
+(subclass override) Write data into the stream.
 _write_all(self, + data) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + + + + +
Class Variable Summary
intSEEK_CUR = 1                                                                     
intSEEK_END = 2                                                                     
intSEEK_SET = 0                                                                     
int_DEFAULT_BUFSIZE = 8192                                                                  

+ + + + + + +
Method Details
+ + +
+

__iter__(self) +

+ Returns an iterator that can be used to iterate over the lines in + this file. This iterator happens to return the file itself, since a + file is its own iterator. +
+
Returns:
+
+ an interator. +
           + (type=iterator) +
+
+
Raises:
+
ValueError - + if the file is closed. +
+
+
+ + +
+

close(self) +

+ Close the file. Future read and write operations will fail. +
+
+
+ + +
+

flush(self) +

+ Write out any data in the write buffer. This may do nothing if write + buffering is not turned on. +
+
+
+ + +
+

next(self) +

+ Returns the next line from the input, or raises + StopIteration when EOF is hit. Unlike python file objects, + it's okay to mix calls to next and readline. +
+
Returns:
+
+ a line read from the file. +
           + (type=str) +
+
+
Raises:
+
StopIteration - + when the end of the file is reached. +
+
+
+ + +
+

read(self, + size=None) +

+ Read at most size bytes from the file (less if we hit + the end of the file first). If the size argument is + negative or omitted, read all the remaining data in the file. +
+
Parameters:
+
size - + maximum number of bytes to read. +
           + (type=int) +
+
+
Returns:
+
+ data read from the file, or an empty string if EOF was + encountered immediately. +
           + (type=str) +
+
+
+
+ + +
+

readline(self, + size=None) +

+ Read one entire line from the file. A trailing newline character is + kept in the string (but may be absent when a file ends with an + incomplete line). If the size argument is present and non-negative, it + is a maximum byte count (including the trailing newline) and an + incomplete line may be returned. An empty string is returned only when + EOF is encountered immediately. +
+
Parameters:
+
size - + maximum length of returned string. +
           + (type=int) +
+
+
Returns:
+
+ next line of the file, or an empty string if the end of the + file has been reached. +
           + (type=str) +
+
+

Note: Unlike stdio's fgets(), the returned string contains null +characters ('\0') if they occurred in the input. +

+ +
+
+ + +
+

readlines(self, + sizehint=None) +

+ Read all remaining lines using readline and return them as a list. If + the optional sizehint argument is present, instead of + reading up to EOF, whole lines totalling approximately sizehint bytes + (possibly after rounding up to an internal buffer size) are read. +
+
Parameters:
+
sizehint - + desired maximum number of bytes to read. +
           + (type=int) +
+
+
Returns:
+
+ list of lines read from the file. +
           + (type=list) +
+
+
+
+ + +
+

seek(self, + offset, + whence=0) +

+ Set the file's current position, like stdio's fseek. + Not all file objects support seeking. +
+
Parameters:
+
offset - + position to move to within the file, relative to + whence. +
           + (type=int) +
whence - + type of movement: 0 = absolute; 1 = relative to the current + position; 2 = relative to the end of the file. +
           + (type=int) +
+
+
Raises:
+
IOError - + if the file doesn't support random access. +
+

Note: If a file is opened in append mode ('a' or +'a+'), any seek operations will be undone at the next write +(as the file position will move back to the end of the file). +

+ +
+
+ + +
+

tell(self) +

+ Return the file's current position. This may not be accurate or + useful if the underlying file doesn't support random access, or was + opened in append mode. +
+
Returns:
+
+ file position (in bytes). +
           + (type=int) +
+
+
+
+ + +
+

write(self, + data) +

+ Write data to the file. If write buffering is on + (bufsize was specified and non-zero), some or all of the + data may not actually be written yet. (Use flush or close to force buffered data to be + written out.) +
+
Parameters:
+
data - + data to write. +
           + (type=str) +
+
+
+
+ + +
+

writelines(self, + sequence) +

+ Write a sequence of strings to the file. The sequence can be any + iterable object producing strings, typically a list of strings. (The + name is intended to match readlines; writelines does + not add line separators.) +
+
Parameters:
+
sequence - + an iterable sequence of strings. +
           + (type=sequence) +
+
+
+
+ + +
+

xreadlines(self) +

+ Identical to iter(f). This is a deprecated file + interface that predates python iterator support. +
+
Returns:
+
+ an iterator. +
           + (type=iterator) +
+
+
+
+ + +
+

_get_size(self) +

+ (subclass override) Return the size of the file. This is + called from within _set_mode if the file is opened in append + mode, so the file position can be tracked and seek and tell will work correctly. If the file is + a stream that can't be randomly accessed, you don't need to override + this method, +
+
+
+ + +
+

_read(self, + size) +

+ (subclass override) Read data from the stream. Return + None or raise EOFError to indicate EOF. +
+
+
+ + +
+

_set_mode(self, + mode='r', + bufsize=-1) +

+ Subclasses call this method to initialize the BufferedFile. +
+
+
+ + +
+

_write(self, + data) +

+ (subclass override) Write data into the stream. +
+
+
+
+ + + + + + +
Class Variable Details
+
+ +

SEEK_CUR

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1                                                                     
+
+
+
+
+
+ +

SEEK_END

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ +

SEEK_SET

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+0                                                                     
+
+
+
+
+
+ +

_DEFAULT_BUFSIZE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+8192                                                                  
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.Channel-class.html b/docs/private/paramiko.Channel-class.html new file mode 100644 index 0000000..83ac46e --- /dev/null +++ b/docs/private/paramiko.Channel-class.html @@ -0,0 +1,1329 @@ + + + + + paramiko.Channel + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class Channel +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type Channel

+ +
+object --+
+         |
+        Channel
+

+ +
+ +

A secure tunnel across an SSH Transport. A Channel is meant to behave +like a socket, and has an API that should be indistinguishable from the +python socket API.

+Because SSH2 has a windowing kind of flow control, if you stop reading +data from a Channel and its buffer fills up, the server will be unable to +send you any more data until you read some of it. (This won't affect +other channels on the same transport -- all channels on a single +transport are flow-controlled independently.) Similarly, if the server +isn't reading data you send, calls to send may block, unless you set a timeout. +This is exactly like a normal network socket, so it shouldn't be too +surprising. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + chanid) +
+Create a new channel.
 __del__(self) +
str +__repr__(self) +
+Return a string representation of this object, for debugging.
 close(self) +
+Close the channel.
bool +exec_command(self, + command) +
+Execute a command on the server.
int +fileno(self) +
+Returns an OS-level file descriptor which can be used for polling, but +but not for reading or writing).
int +get_id(self) +
+Return the ID # for this channel.
str +get_name(self) +
+Get the name of this channel that was previously set by set_name.
bool +get_pty(self, + term, + width, + height) +
+Request a pseudo-terminal from the server.
Transport +get_transport(self) +
+Return the Transport associated with this channel.
float +gettimeout(self) +
+Returns the timeout in seconds (as a float) associated with socket +operations, or None if no timeout is set.
bool +invoke_shell(self) +
+Request an interactive shell session on this channel.
bool +invoke_subsystem(self, + subsystem) +
+Request a subsystem on the server (for example, +sftp).
ChannelFile +makefile(self, + *params) +
+Return a file-like object associated with this channel.
ChannelFile +makefile_stderr(self, + *params) +
+Return a file-like object associated with this channel's stderr +stream.
str +recv(self, + nbytes) +
+Receive data from the channel.
int +recv_exit_status(self) +
+Return the exit status from the process on the server.
boolean +recv_ready(self) +
+Returns true if data is buffered and ready to be read from this +channel.
str +recv_stderr(self, + nbytes) +
+Receive data from the channel's stderr stream.
boolean +recv_stderr_ready(self) +
+Returns true if data is buffered and ready to be read from this +channel's stderr stream.
bool +resize_pty(self, + width, + height) +
+Resize the pseudo-terminal.
int +send(self, + s) +
+Send data to the channel.
 send_exit_status(self, + status) +
+Send the exit status of an executed command to the client.
int +send_stderr(self, + s) +
+Send data to the channel on the "stderr" stream.
 sendall(self, + s) +
+Send data to the channel, without allowing partial results.
 sendall_stderr(self, + s) +
+Send data to the channel's "stderr" stream, without allowing +partial results.
bool +set_combine_stderr(self, + combine) +
+Set whether stderr should be combined into stdout on this channel.
 set_name(self, + name) +
+Set a name for this channel.
 setblocking(self, + blocking) +
+Set blocking or non-blocking mode of the channel: if +blocking is 0, the channel is set to non-blocking mode; +otherwise it's set to blocking mode.
 settimeout(self, + timeout) +
+Set a timeout on blocking read/write operations.
 shutdown(self, + how) +
+Shut down one or both halves of the connection.
 shutdown_read(self) +
+Shutdown the receiving side of this socket, closing the stream in the +incoming direction.
 shutdown_write(self) +
+Shutdown the sending side of this socket, closing the stream in the +outgoing direction.
 _check_add_window(self, + n) +
 _close_internal(self) +
 _feed(self, + m) +
 _feed_extended(self, + m) +
 _handle_close(self, + m) +
 _handle_eof(self, + m) +
 _handle_request(self, + m) +
 _log(self, + level, + msg) +
 _request_failed(self, + m) +
 _request_success(self, + m) +
 _send_eof(self) +
 _set_closed(self) +
 _set_remote_channel(self, + chanid, + window_size, + max_packet_size) +
 _set_transport(self, + transport) +
 _set_window(self, + window_size, + max_packet_size) +
 _unlink(self) +
 _wait_for_send_window(self, + size) +
+(You are already holding the lock.) Wait for the send window to open +up, and allocate up to size bytes for transmission.
 _window_adjust(self, + m) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + +
Class Variable Summary
intMIN_PACKET_SIZE = 1024                                                                  

+ + + + + + +
Method Details
+ + +
+

__init__(self, + chanid) +
(Constructor) +

+ Create a new channel. The channel is not associated with any + particular session or Transport until the Transport attaches + it. Normally you would only call this method from the constructor of a + subclass of Channel. +
+
Parameters:
+
chanid - + the ID of this channel, as passed by an existing Transport. +
           + (type=int) +
+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

__repr__(self) +
(Representation operator) +

+ Return a string representation of this object, for debugging. +
+
Returns:
+
+ str +
+
+
Overrides:
+
__builtin__.object.__repr__
+
+
+
+ + +
+

close(self) +

+ Close the channel. All future read/write operations on the channel + will fail. The remote end will receive no more data (after queued data + is flushed). Channels are automatically closed when their Transport is closed or when they are + garbage collected. +
+
+
+ + +
+

exec_command(self, + command) +

+

Execute a command on the server. If the server allows it, the + channel will then be directly connected to the stdin, stdout, and + stderr of the command being executed.

+ When the command finishes executing, the channel will be closed and + can't be reused. You must open a new channel if you wish to execute + another command. +
+
Parameters:
+
command - + a shell command to execute. +
           + (type=str) +
+
+
Returns:
+
+ True if the operation succeeded; + False if not. +
           + (type=bool) +
+
+
+
+ + +
+

fileno(self) +

+

Returns an OS-level file descriptor which can be used for polling, + but but not for reading or writing). This is primaily to allow + python's select module to work.

+ The first time fileno is called on a channel, a pipe is + created to simulate real OS-level file descriptor (FD) behavior. + Because of this, two OS-level FDs are created, which will use up FDs + faster than normal. You won't notice this effect unless you open + hundreds or thousands of channels simultaneously, but it's still + notable. +
+
Returns:
+
+ an OS-level file descriptor +
           + (type=int) +
+
+

Warning: This method causes channel reads to be slightly less efficient. +

+ +
+
+ + +
+

get_id(self) +

+ Return the ID # for this channel. The channel ID is unique across a + Transport and usually a small number. + It's also the number passed to ServerInterface.check_channel_request + when determining whether to accept a channel request in server + mode. +
+
Returns:
+
+ the ID of this channel. +
           + (type=int) +
+
+

Since: ivysaur +

+ +
+
+ + +
+

get_name(self) +

+ Get the name of this channel that was previously set by set_name. +
+
Returns:
+
+ the name of this channel. +
           + (type=str) +
+
+
+
+ + +
+

get_pty(self, + term='vt100', + width=80, + height=24) +

+ Request a pseudo-terminal from the server. This is usually used + right after creating a client channel, to ask the server to provide + some basic terminal semantics for a shell invoked with invoke_shell. It isn't necessary (or + desirable) to call this method if you're going to exectue a single + command with exec_command. +
+
Parameters:
+
term - + the terminal type to emulate (for example, + 'vt100'). +
           + (type=str) +
width - + width (in characters) of the terminal screen +
           + (type=int) +
height - + height (in characters) of the terminal screen +
           + (type=int) +
+
+
Returns:
+
+ True if the operation succeeded; + False if not. +
           + (type=bool) +
+
+
+
+ + +
+

get_transport(self) +

+ Return the Transport associated with this + channel. +
+
Returns:
+
+ the Transport that was used to create + this channel. +
           + (type=Transport) +
+
+
+
+ + +
+

gettimeout(self) +

+ Returns the timeout in seconds (as a float) associated with socket + operations, or None if no timeout is set. This reflects + the last call to setblocking or settimeout. +
+
Returns:
+
+ timeout in seconds, or None. +
           + (type=float) +
+
+
+
+ + +
+

invoke_shell(self) +

+

Request an interactive shell session on this channel. If the server + allows it, the channel will then be directly connected to the stdin, + stdout, and stderr of the shell.

+

Normally you would call get_pty before this, in which case the + shell will operate through the pty, and the channel will be connected + to the stdin and stdout of the pty.

+ When the shell exits, the channel will be closed and can't be + reused. You must open a new channel if you wish to open another + shell. +
+
Returns:
+
+ True if the operation succeeded; + False if not. +
           + (type=bool) +
+
+
+
+ + +
+

invoke_subsystem(self, + subsystem) +

+

Request a subsystem on the server (for example, sftp). + If the server allows it, the channel will then be directly connected to + the requested subsystem.

+ When the subsystem finishes, the channel will be closed and can't be + reused. +
+
Parameters:
+
subsystem - + name of the subsystem being requested. +
           + (type=str) +
+
+
Returns:
+
+ True if the operation succeeded; + False if not. +
           + (type=bool) +
+
+
+
+ + +
+

makefile(self, + *params) +

+ Return a file-like object associated with this channel. The optional + mode and bufsize arguments are interpreted + the same way as by the built-in file() function in + python. +
+
Returns:
+
+ object which can be used for python file I/O. +
           + (type=ChannelFile) +
+
+
+
+ + +
+

makefile_stderr(self, + *params) +

+

Return a file-like object associated with this channel's stderr + stream. Only channels using exec_command or invoke_shell without a pty will ever have + data on the stderr stream.

+ The optional mode and bufsize arguments + are interpreted the same way as by the built-in file() + function in python. For a client, it only makes sense to open this file + for reading. For a server, it only makes sense to open this file for + writing. +
+
Returns:
+
+ object which can be used for python file I/O. +
           + (type=ChannelFile) +
+
+

Since: 1.1 +

+ +
+
+ + +
+

recv(self, + nbytes) +

+ Receive data from the channel. The return value is a string + representing the data received. The maximum amount of data to be + received at once is specified by nbytes. If a string of + length zero is returned, the channel stream has closed. +
+
Parameters:
+
nbytes - + maximum number of bytes to read. +
           + (type=int) +
+
+
Returns:
+
+ data. +
           + (type=str) +
+
+
Raises:
+
socket.timeout - + if no data is ready before the timeout set by settimeout. +
+
+
+ + +
+

recv_exit_status(self) +

+ Return the exit status from the process on the server. This is + mostly useful for retrieving the reults of an exec_command. If the command hasn't + finished yet, this method will wait until it does, or until the channel + is closed. If no exit status is provided by the server, -1 is + returned. +
+
Returns:
+
+ the exit code of the process on the server. +
           + (type=int) +
+
+

Since: 1.2 +

+ +
+
+ + +
+

recv_ready(self) +

+ Returns true if data is buffered and ready to be read from this + channel. A False result does not mean that the channel has + closed; it means you may need to wait before more data arrives. +
+
Returns:
+
+ True if a recv call on this channel would + immediately return at least one byte; False + otherwise. +
           + (type=boolean) +
+
+
+
+ + +
+

recv_stderr(self, + nbytes) +

+ Receive data from the channel's stderr stream. Only channels using + exec_command or invoke_shell without a pty will ever have + data on the stderr stream. The return value is a string representing + the data received. The maximum amount of data to be received at once is + specified by nbytes. If a string of length zero is + returned, the channel stream has closed. +
+
Parameters:
+
nbytes - + maximum number of bytes to read. +
           + (type=int) +
+
+
Returns:
+
+ data. +
           + (type=str) +
+
+
Raises:
+
socket.timeout - + if no data is ready before the timeout set by settimeout. +
+

Since: 1.1 +

+ +
+
+ + +
+

recv_stderr_ready(self) +

+ Returns true if data is buffered and ready to be read from this + channel's stderr stream. Only channels using exec_command or invoke_shell without a pty will ever have + data on the stderr stream. +
+
Returns:
+
+ True if a recv_stderr call on this channel + would immediately return at least one byte; False + otherwise. +
           + (type=boolean) +
+
+

Since: 1.1 +

+ +
+
+ + +
+

resize_pty(self, + width=80, + height=24) +

+ Resize the pseudo-terminal. This can be used to change the width and + height of the terminal emulation created in a previous get_pty call. +
+
Parameters:
+
width - + new width (in characters) of the terminal screen +
           + (type=int) +
height - + new height (in characters) of the terminal screen +
           + (type=int) +
+
+
Returns:
+
+ True if the operation succeeded; + False if not. +
           + (type=bool) +
+
+
+
+ + +
+

send(self, + s) +

+ Send data to the channel. Returns the number of bytes sent, or 0 if + the channel stream is closed. Applications are responsible for checking + that all data has been sent: if only some of the data was transmitted, + the application needs to attempt delivery of the remaining data. +
+
Parameters:
+
s - + data to send. +
           + (type=str) +
+
+
Returns:
+
+ number of bytes actually sent. +
           + (type=int) +
+
+
Raises:
+
socket.timeout - + if no data could be sent before the timeout set by settimeout. +
+
+
+ + +
+

send_exit_status(self, + status) +

+ Send the exit status of an executed command to the client. (This + really only makes sense in server mode.) Many clients expect to get + some sort of status code back from an executed command after it + completes. +
+
Parameters:
+
status - + the exit code of the process +
           + (type=int) +
+
+

Since: 1.2 +

+ +
+
+ + +
+

send_stderr(self, + s) +

+ Send data to the channel on the "stderr" stream. This is + normally only used by servers to send output from shell commands -- + clients won't use this. Returns the number of bytes sent, or 0 if the + channel stream is closed. Applications are responsible for checking + that all data has been sent: if only some of the data was transmitted, + the application needs to attempt delivery of the remaining data. +
+
Parameters:
+
s - + data to send. +
           + (type=str) +
+
+
Returns:
+
+ number of bytes actually sent. +
           + (type=int) +
+
+
Raises:
+
socket.timeout - + if no data could be sent before the timeout set by settimeout. +
+

Since: 1.1 +

+ +
+
+ + +
+

sendall(self, + s) +

+ Send data to the channel, without allowing partial results. Unlike + send, this method continues to send data + from the given string until either all data has been sent or an error + occurs. Nothing is returned. +
+
Parameters:
+
s - + data to send. +
           + (type=str) +
+
+
Raises:
+
socket.timeout - + if sending stalled for longer than the timeout set by settimeout. +
socket.error - + if an error occured before the entire string was sent. +
+

Note: If the channel is closed while only part of the data hase been sent, +there is no way to determine how much data (if any) was sent. This is +irritating, but identically follows python's API. +

+ +
+
+ + +
+

sendall_stderr(self, + s) +

+ Send data to the channel's "stderr" stream, without + allowing partial results. Unlike send_stderr, this method continues to + send data from the given string until all data has been sent or an + error occurs. Nothing is returned. +
+
Parameters:
+
s - + data to send to the client as "stderr" output. +
           + (type=str) +
+
+
Raises:
+
socket.timeout - + if sending stalled for longer than the timeout set by settimeout. +
socket.error - + if an error occured before the entire string was sent. +
+

Since: 1.1 +

+ +
+
+ + +
+

set_combine_stderr(self, + combine) +

+

Set whether stderr should be combined into stdout on this channel. + The default is False, but in some cases it may be + convenient to have both streams combined.

+

If this is False, and exec_command is called (or + invoke_shell with no pty), output to stderr will not show + up through the recv and recv_ready calls. You will have to use recv_stderr and recv_stderr_ready to get stderr + output.

+ If this is True, data will never show up via recv_stderr or recv_stderr_ready. +
+
Parameters:
+
combine - + True if stderr output should be combined into + stdout on this channel. +
           + (type=bool) +
+
+
Returns:
+
+ previous setting. +
           + (type=bool) +
+
+

Since: 1.1 +

+ +
+
+ + +
+

set_name(self, + name) +

+ Set a name for this channel. Currently it's only used to set the + name of the log level used for debugging. The name can be fetched with + the get_name method. +
+
Parameters:
+
name - + new channel name. +
           + (type=str) +
+
+
+
+ + +
+

setblocking(self, + blocking) +

+

Set blocking or non-blocking mode of the channel: if + blocking is 0, the channel is set to non-blocking mode; + otherwise it's set to blocking mode. Initially all channels are in + blocking mode.

+

In non-blocking mode, if a recv call doesn't find any data, or if a + send call can't immediately dispose of + the data, an error exception is raised. In blocking mode, the calls + block until they can proceed.

+ chan.setblocking(0) is equivalent to + chan.settimeout(0); chan.setblocking(1) is + equivalent to chan.settimeout(None). +
+
Parameters:
+
blocking - + 0 to set non-blocking mode; non-0 to set blocking mode. +
           + (type=int) +
+
+
+
+ + +
+

settimeout(self, + timeout) +

+

Set a timeout on blocking read/write operations. The + timeout argument can be a nonnegative float expressing + seconds, or None. If a float is given, subsequent channel + read/write operations will raise a timeout exception if the timeout + period value has elapsed before the operation has completed. Setting a + timeout of None disables timeouts on socket + operations.

+ chan.settimeout(0.0) is equivalent to + chan.setblocking(0); chan.settimeout(None) is + equivalent to chan.setblocking(1). +
+
Parameters:
+
timeout - + seconds to wait for a pending read/write operation before + raising socket.timeout, or None for no + timeout. +
           + (type=float) +
+
+
+
+ + +
+

shutdown(self, + how) +

+ Shut down one or both halves of the connection. If how + is 0, further receives are disallowed. If how is 1, + further sends are disallowed. If how is 2, further sends + and receives are disallowed. This closes the stream in one or both + directions. +
+
Parameters:
+
how - + 0 (stop receiving), 1 (stop sending), or 2 (stop receiving and + sending). +
           + (type=int) +
+
+
+
+ + +
+

shutdown_read(self) +

+ Shutdown the receiving side of this socket, closing the stream in + the incoming direction. After this call, future reads on this channel + will fail instantly. This is a convenience method, equivalent to + shutdown(0), for people who don't make it a habit to + memorize unix constants from the 1970s. +
+

Since: 1.2 +

+ +
+
+ + +
+

shutdown_write(self) +

+ Shutdown the sending side of this socket, closing the stream in the + outgoing direction. After this call, future writes on this channel will + fail instantly. This is a convenience method, equivalent to + shutdown(1), for people who don't make it a habit to + memorize unix constants from the 1970s. +
+

Since: 1.2 +

+ +
+
+ + +
+

_wait_for_send_window(self, + size) +

+ (You are already holding the lock.) Wait for the send window to open + up, and allocate up to size bytes for transmission. If no + space opens up before the timeout, a timeout exception is raised. + Returns the number of bytes available to send (may be less than + requested). +
+
+
+
+ + + + + + +
Class Variable Details
+
+ +

MIN_PACKET_SIZE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1024                                                                  
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.ChannelFile-class.html b/docs/private/paramiko.ChannelFile-class.html new file mode 100644 index 0000000..c3c4fea --- /dev/null +++ b/docs/private/paramiko.ChannelFile-class.html @@ -0,0 +1,347 @@ + + + + + paramiko.ChannelFile + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class ChannelFile +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type ChannelFile

+ +
+  object --+    
+           |    
+BufferedFile --+
+               |
+              ChannelFile
+

+ +
Known Subclasses:
+
+ ChannelStderrFile
+ +
+ +A file-like wrapper around Channel. A ChannelFile is created by +calling Channel.makefile. +
+ +

Bug: To correctly emulate the file object created from a socket's +makefile method, a Channel and its ChannelFile +should be able to be closed or garbage-collected independently. +Currently, closing the ChannelFile does nothing but flush +the buffer. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + channel, + mode, + bufsize) +
str +__repr__(self) +
+Returns a string representation of this object, for debugging.
 _read(self, + size) +
+(subclass override) Read data from the stream.
 _write(self, + data) +
+(subclass override) Write data into the stream.
 seek(self, + offset, + whence) +
+Set the file's current position, like stdio's fseek.
    Inherited from BufferedFile
 __del__(self) +
iterator +__iter__(self) +
+Returns an iterator that can be used to iterate over the lines in this +file.
 close(self) +
+Close the file.
 flush(self) +
+Write out any data in the write buffer.
str +next(self) +
+Returns the next line from the input, or raises +StopIteration when EOF is hit.
str +read(self, + size) +
+Read at most size bytes from the file (less if we hit the +end of the file first).
str +readline(self, + size) +
+Read one entire line from the file.
list +readlines(self, + sizehint) +
+Read all remaining lines using readline and return them as a list.
int +tell(self) +
+Return the file's current position.
 write(self, + data) +
+Write data to the file.
 writelines(self, + sequence) +
+Write a sequence of strings to the file.
iterator +xreadlines(self) +
+Identical to iter(f).
 _get_size(self) +
+(subclass override) Return the size of the file.
 _record_newline(self, + newline) +
 _set_mode(self, + mode, + bufsize) +
+Subclasses call this method to initialize the BufferedFile.
 _write_all(self, + data) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + + + + + + +
Class Variable Summary
    Inherited from BufferedFile
intSEEK_CUR = 1                                                                     
intSEEK_END = 2                                                                     
intSEEK_SET = 0                                                                     
int_DEFAULT_BUFSIZE = 8192                                                                  

+ + + + + + +
Method Details
+ + +
+

__repr__(self) +
(Representation operator) +

+ Returns a string representation of this object, for debugging. +
+
Returns:
+
+ str +
+
+
Overrides:
+
__builtin__.object.__repr__
+
+
+
+ + +
+

_read(self, + size) +

+ (subclass override) Read data from the stream. Return + None or raise EOFError to indicate EOF. +
+
Overrides:
+
paramiko.BufferedFile._read (inherited documentation) +
+
+
+
+ + +
+

_write(self, + data) +

+ (subclass override) Write data into the stream. +
+
Overrides:
+
paramiko.BufferedFile._write (inherited documentation) +
+
+
+
+ + +
+

seek(self, + offset, + whence=0) +

+ Set the file's current position, like stdio's fseek. + Not all file objects support seeking. +
+
Parameters:
+
offset - + position to move to within the file, relative to + whence. +
           + (type=int) +
whence - + type of movement: 0 = absolute; 1 = relative to the current + position; 2 = relative to the end of the file. +
           + (type=int) +
+
+
Raises:
+
IOError - + if the file doesn't support random access. +
+

Note: If a file is opened in append mode ('a' or +'a+'), any seek operations will be undone at the next write +(as the file position will move back to the end of the file). +

+ +
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.DSSKey-class.html b/docs/private/paramiko.DSSKey-class.html new file mode 100644 index 0000000..9d87ee1 --- /dev/null +++ b/docs/private/paramiko.DSSKey-class.html @@ -0,0 +1,486 @@ + + + + + paramiko.DSSKey + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class DSSKey +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type DSSKey

+ +
+object --+    
+         |    
+      PKey --+
+             |
+            DSSKey
+

+ +
+ +Representation of a DSS key which can be used to sign an verify SSH2 +data. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + msg, + data) +
+Create a new instance of this public key type.
 __hash__(self) +
str +__str__(self) +
+Return a string of an SSH Message made up of the public part(s) of +this key.
bool +can_sign(self) +
+Return True if this key has the private part necessary +for signing data.
DSSKey +generate(bits, + progress_func) +
+Generate a new private DSS key. (Static method) +
int +get_bits(self) +
+Return the number of significant bits in this key.
str +get_name(self) +
+Return the name of this private key implementation.
 sign_ssh_data(self, + rpool, + data) +
boolean +verify_ssh_sig(self, + data, + msg) +
+Given a blob of data, and an SSH message representing a signature of +that data, verify that it was signed with this key.
 write_private_key_file(self, + filename, + password) +
+Write private key contents into a file.
 _from_private_key_file(self, + filename, + password) +
    Inherited from PKey
int +__cmp__(self, + other) +
+Compare this key to another.
str +_read_private_key_file(self, + tag, + filename, + password) +
+Read an SSH2-format private key file, looking for a string of the type +"BEGIN xxx PRIVATE KEY" for some xxx, +base64-decode the text we find, and return it as a string.
 _write_private_key_file(self, + tag, + filename, + data, + password) +
+Write an SSH2-format private key file in a form that can be read by +paramiko or openssh.
PKey +from_private_key_file(cl, + filename, + password) +
+Create a key object by reading a private key file. (Class method) +
str +get_base64(self) +
+Return a base64 string containing the public part of this key.
str +get_fingerprint(self) +
+Return an MD5 fingerprint of the public part of this key.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + + + + + +
Class Variable Summary
    Inherited from PKey
dict_CIPHER_TABLE = {'DES-EDE3-CBC': {'blocksize': 8, 'ciphe... +

+ + + + + + +
Instance Method Details
+ + +
+

__init__(self, + msg=None, + data=None, + filename=None, + password=None, + vals=None) +
(Constructor) +

+ Create a new instance of this public key type. If msg + is given, the key's public part(s) will be filled in from the message. + If data is given, the key's public part(s) will be filled + in from the string. +
+
Parameters:
+
msg - + an optional SSH Message containing a public key of + this type. +
           + (type=Message) +
data - + an optional string containing a public key of this type +
           + (type=str) +
+
+
Raises:
+
SSHException - + if a key cannot be created from the data or + msg given, or no key was passed in. +
+
Overrides:
+
paramiko.PKey.__init__ (inherited documentation) +
+
+
+
+ + +
+

__str__(self) +
(Informal representation operator) +

+ Return a string of an SSH Message made up of the public part(s) of + this key. This string is suitable for passing to __init__ to re-create the key object + later. +
+
Returns:
+
+ string representation of an SSH key message. +
           + (type=str) +
+
+
Overrides:
+
paramiko.PKey.__str__ (inherited documentation) +
+
+
+
+ + +
+

can_sign(self) +

+ Return True if this key has the private part necessary + for signing data. +
+
Returns:
+
+ True if this is a private key. +
           + (type=bool) +
+
+
Overrides:
+
paramiko.PKey.can_sign (inherited documentation) +
+
+
+
+ + +
+

get_bits(self) +

+ Return the number of significant bits in this key. This is useful + for judging the relative security of a key. +
+
Returns:
+
+ bits in the key. +
           + (type=int) +
+
+
Overrides:
+
paramiko.PKey.get_bits (inherited documentation) +
+
+
+
+ + +
+

get_name(self) +

+ Return the name of this private key implementation. +
+
Returns:
+
+ name of this private key type, in SSH terminology (for + example, "ssh-rsa"). +
           + (type=str) +
+
+
Overrides:
+
paramiko.PKey.get_name (inherited documentation) +
+
+
+
+ + +
+

verify_ssh_sig(self, + data, + msg) +

+ Given a blob of data, and an SSH message representing a signature of + that data, verify that it was signed with this key. +
+
Parameters:
+
data - + the data that was signed. +
           + (type=str) +
msg - + an SSH signature message +
           + (type=Message) +
+
+
Returns:
+
+ True if the signature verifies correctly; + False otherwise. +
           + (type=boolean) +
+
+
Overrides:
+
paramiko.PKey.verify_ssh_sig (inherited documentation) +
+
+
+
+ + +
+

write_private_key_file(self, + filename, + password=None) +

+ Write private key contents into a file. If the password is not + None, the key is encrypted before writing. +
+
Parameters:
+
filename - + name of the file to write. +
           + (type=str) +
password - + an optional password to use to encrypt the key file. +
           + (type=str) +
+
+
Raises:
+
IOError - + if there was an error writing the file. +
SSHException - + if the key is invalid. +
+
Overrides:
+
paramiko.PKey.write_private_key_file (inherited documentation) +
+
+

Since: fearow +

+ +
+
+
+ + + + + + +
Static Method Details
+ + +
+

generate(bits=1024, + progress_func=None) +

+ Generate a new private DSS key. This factory function can be used to + generate a new host key or authentication key. +
+
Parameters:
+
bits - + number of bits the generated key should be. +
           + (type=int) +
progress_func - + an optional function to call at key points in key generation + (used by pyCrypto.PublicKey). +
           + (type=function) +
+
+
Returns:
+
+ new private key +
           + (type=DSSKey) +
+
+

Since: fearow +

+ +
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.Message-class.html b/docs/private/paramiko.Message-class.html new file mode 100644 index 0000000..d6934e3 --- /dev/null +++ b/docs/private/paramiko.Message-class.html @@ -0,0 +1,654 @@ + + + + + paramiko.Message + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class Message +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type Message

+ +
+object --+
+         |
+        Message
+

+ +
+ +

An SSH2 Message is a stream of bytes that encodes some +combination of strings, integers, bools, and infinite-precision integers +(known in python as longs). This class builds or breaks down such +a byte stream.

+Normally you don't need to deal with anything this low-level, but it's +exposed for people implementing custom extensions, or features that +paramiko doesn't support yet. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + content) +
+Create a new SSH2 Message.
string +__repr__(self) +
+Returns a string representation of this object, for debugging.
string +__str__(self) +
+Return the byte stream content of this Message, as a string.
 add(self, + *seq) +
+Add a sequence of items to the stream.
 add_boolean(self, + b) +
+Add a boolean value to the stream.
 add_byte(self, + b) +
+Write a single byte to the stream, without any formatting.
 add_bytes(self, + b) +
+Write bytes to the stream, without any formatting.
 add_int(self, + n) +
+Add an integer to the stream.
 add_int64(self, + n) +
+Add a 64-bit int to the stream.
 add_list(self, + l) +
+Add a list of strings to the stream.
 add_mpint(self, + z) +
+Add a long int to the stream, encoded as an infinite-precision +integer.
 add_string(self, + s) +
+Add a string to the stream.
bool +get_boolean(self) +
+Fetch a boolean from the stream.
string +get_byte(self) +
+Return the next byte of the Message, without decomposing it.
string +get_bytes(self, + n) +
+Return the next n bytes of the Message, without +decomposing into an int, string, etc.
int +get_int(self) +
+Fetch an int from the stream.
long +get_int64(self) +
+Fetch a 64-bit int from the stream.
list of strings +get_list(self) +
+Fetch a list of strings from the stream.
long +get_mpint(self) +
+Fetch a long int (mpint) from the stream.
string +get_remainder(self) +
+Return the bytes of this Message that haven't already been parsed and +returned.
string +get_so_far(self) +
+Returns the bytes of this Message that have been parsed and +returned.
string +get_string(self) +
+Fetch a string from the stream.
 rewind(self) +
+Rewind the message to the beginning as if no items had been parsed out +of it yet.
 _add(self, + i) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + +
Method Details
+ + +
+

__init__(self, + content=None) +
(Constructor) +

+ Create a new SSH2 Message. +
+
Parameters:
+
content - + the byte stream to use as the Message content (passed in only + when decomposing a Message). +
           + (type=string) +
+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

__repr__(self) +
(Representation operator) +

+ Returns a string representation of this object, for debugging. +
+
Returns:
+
+ string +
+
+
Overrides:
+
__builtin__.object.__repr__
+
+
+
+ + +
+

__str__(self) +
(Informal representation operator) +

+ Return the byte stream content of this Message, as a string. +
+
Returns:
+
+ the contents of this Message. +
           + (type=string) +
+
+
Overrides:
+
__builtin__.object.__str__
+
+
+
+ + +
+

add(self, + *seq) +

+ Add a sequence of items to the stream. The values are encoded based + on their type: str, int, bool, list, or long. +
+
Parameters:
+
seq - + the sequence of items +
           + (type=sequence) +
+
+

Bug: longs are encoded non-deterministically. Don't use this method. +

+ +
+
+ + +
+

add_boolean(self, + b) +

+ Add a boolean value to the stream. +
+
Parameters:
+
b - + boolean value to add +
           + (type=bool) +
+
+
+
+ + +
+

add_byte(self, + b) +

+ Write a single byte to the stream, without any formatting. +
+
Parameters:
+
b - + byte to add +
           + (type=str) +
+
+
+
+ + +
+

add_bytes(self, + b) +

+ Write bytes to the stream, without any formatting. +
+
Parameters:
+
b - + bytes to add +
           + (type=str) +
+
+
+
+ + +
+

add_int(self, + n) +

+ Add an integer to the stream. +
+
Parameters:
+
n - + integer to add +
           + (type=int) +
+
+
+
+ + +
+

add_int64(self, + n) +

+ Add a 64-bit int to the stream. +
+
Parameters:
+
n - + long int to add +
           + (type=long) +
+
+
+
+ + +
+

add_list(self, + l) +

+ Add a list of strings to the stream. They are encoded identically to + a single string of values separated by commas. (Yes, really, that's how + SSH2 does it.) +
+
Parameters:
+
l - + list of strings to add +
           + (type=list(str)) +
+
+
+
+ + +
+

add_mpint(self, + z) +

+ Add a long int to the stream, encoded as an infinite-precision + integer. This method only works on positive numbers. +
+
Parameters:
+
z - + long int to add +
           + (type=long) +
+
+
+
+ + +
+

add_string(self, + s) +

+ Add a string to the stream. +
+
Parameters:
+
s - + string to add +
           + (type=str) +
+
+
+
+ + +
+

get_boolean(self) +

+ Fetch a boolean from the stream. +
+
Returns:
+
+ True or False (from the + Message). +
           + (type=bool) +
+
+
+
+ + +
+

get_byte(self) +

+ Return the next byte of the Message, without decomposing it. This is + equivalent to get_bytes(1). +
+
Returns:
+
+ the next byte of the Message, or '' if there + aren't any bytes remaining. +
           + (type=string) +
+
+
+
+ + +
+

get_bytes(self, + n) +

+ Return the next n bytes of the Message, without + decomposing into an int, string, etc. Just the raw bytes are + returned. +
+
Returns:
+
+ a string of the next n bytes of the Message, or a + string of n zero bytes, if there aren't + n bytes remaining. +
           + (type=string) +
+
+
+
+ + +
+

get_int(self) +

+ Fetch an int from the stream. +
+
Returns:
+
+ a 32-bit unsigned integer. +
           + (type=int) +
+
+
+
+ + +
+

get_int64(self) +

+ Fetch a 64-bit int from the stream. +
+
Returns:
+
+ a 64-bit unsigned integer. +
           + (type=long) +
+
+
+
+ + +
+

get_list(self) +

+ Fetch a list of strings from the stream. These are trivially encoded + as comma-separated values in a string. +
+
Returns:
+
+ a list of strings. +
           + (type=list of strings) +
+
+
+
+ + +
+

get_mpint(self) +

+ Fetch a long int (mpint) from the stream. +
+
Returns:
+
+ an arbitrary-length integer. +
           + (type=long) +
+
+
+
+ + +
+

get_remainder(self) +

+ Return the bytes of this Message that haven't already been parsed + and returned. +
+
Returns:
+
+ a string of the bytes not parsed yet. +
           + (type=string) +
+
+
+
+ + +
+

get_so_far(self) +

+ Returns the bytes of this Message that have been parsed and + returned. The string passed into a Message's constructor can be + regenerated by concatenating get_so_far and get_remainder. +
+
Returns:
+
+ a string of the bytes parsed so far. +
           + (type=string) +
+
+
+
+ + +
+

get_string(self) +

+ Fetch a string from the stream. This could be a byte string and may + contain unprintable characters. (It's not unheard of for a string to + contain another byte-stream Message.) +
+
Returns:
+
+ a string. +
           + (type=string) +
+
+
+
+ + +
+

rewind(self) +

+ Rewind the message to the beginning as if no items had been parsed + out of it yet. +
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:46 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.PKey-class.html b/docs/private/paramiko.PKey-class.html new file mode 100644 index 0000000..3ed3e5f --- /dev/null +++ b/docs/private/paramiko.PKey-class.html @@ -0,0 +1,696 @@ + + + + + paramiko.PKey + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class PKey +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type PKey

+ +
+object --+
+         |
+        PKey
+

+ +
Known Subclasses:
+
+ AgentKey, + DSSKey, + RSAKey
+ +
+ +Base class for public keys. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + msg, + data) +
+Create a new instance of this public key type.
int +__cmp__(self, + other) +
+Compare this key to another.
str +__str__(self) +
+Return a string of an SSH Message made up of the public part(s) of +this key.
str +_read_private_key_file(self, + tag, + filename, + password) +
+Read an SSH2-format private key file, looking for a string of the type +"BEGIN xxx PRIVATE KEY" for some xxx, +base64-decode the text we find, and return it as a string.
 _write_private_key_file(self, + tag, + filename, + data, + password) +
+Write an SSH2-format private key file in a form that can be read by +paramiko or openssh.
bool +can_sign(self) +
+Return True if this key has the private part necessary +for signing data.
PKey +from_private_key_file(cl, + filename, + password) +
+Create a key object by reading a private key file. (Class method) +
str +get_base64(self) +
+Return a base64 string containing the public part of this key.
int +get_bits(self) +
+Return the number of significant bits in this key.
str +get_fingerprint(self) +
+Return an MD5 fingerprint of the public part of this key.
str +get_name(self) +
+Return the name of this private key implementation.
Message +sign_ssh_data(self, + randpool, + data) +
+Sign a blob of data with this private key, and return a Message +representing an SSH signature message.
boolean +verify_ssh_sig(self, + data, + msg) +
+Given a blob of data, and an SSH message representing a signature of +that data, verify that it was signed with this key.
 write_private_key_file(self, + filename, + password) +
+Write private key contents into a file.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + + + +
Class Variable Summary
dict_CIPHER_TABLE = {'DES-EDE3-CBC': {'blocksize': 8, 'ciphe... +

+ + + + + + +
Instance Method Details
+ + +
+

__init__(self, + msg=None, + data=None) +
(Constructor) +

+ Create a new instance of this public key type. If msg + is given, the key's public part(s) will be filled in from the message. + If data is given, the key's public part(s) will be filled + in from the string. +
+
Parameters:
+
msg - + an optional SSH Message containing a public key of + this type. +
           + (type=Message) +
data - + an optional string containing a public key of this type +
           + (type=str) +
+
+
Raises:
+
SSHException - + if a key cannot be created from the data or + msg given, or no key was passed in. +
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

__cmp__(self, + other) +
(Comparison operator) +

+ Compare this key to another. Returns 0 if this key is equivalent to + the given key, or non-0 if they are different. Only the public parts of + the key are compared, so a public key will compare equal to its + corresponding private key. +
+
Parameters:
+
other - + key to compare to. +
           + (type=PKey) +
+
+
Returns:
+
+ 0 if the two keys are equivalent, non-0 otherwise. +
           + (type=int) +
+
+
+
+ + +
+

__str__(self) +
(Informal representation operator) +

+ Return a string of an SSH Message made up of the public part(s) of + this key. This string is suitable for passing to __init__ to re-create the key object + later. +
+
Returns:
+
+ string representation of an SSH key message. +
           + (type=str) +
+
+
Overrides:
+
__builtin__.object.__str__
+
+
+
+ + +
+

_read_private_key_file(self, + tag, + filename, + password=None) +

+ Read an SSH2-format private key file, looking for a string of the + type "BEGIN xxx PRIVATE KEY" for some + xxx, base64-decode the text we find, and return it as a + string. If the private key is encrypted and password is + not None, the given password will be used to decrypt the + key (otherwise PasswordRequiredException is thrown). +
+
Parameters:
+
tag - + "RSA" or "DSA", + the tag used to mark the data block. +
           + (type=str) +
filename - + name of the file to read. +
           + (type=str) +
password - + an optional password to use to decrypt the key file, if it's + encrypted. +
           + (type=str) +
+
+
Returns:
+
+ data blob that makes up the private key. +
           + (type=str) +
+
+
Raises:
+
IOError - + if there was an error reading the file. +
PasswordRequiredException - + if the private key file is encrypted, and + password is None. +
SSHException - + if the key file is invalid. +
+
+
+ + +
+

_write_private_key_file(self, + tag, + filename, + data, + password=None) +

+ Write an SSH2-format private key file in a form that can be read by + paramiko or openssh. If no password is given, the key is written in a + trivially-encoded format (base64) which is completely insecure. If a + password is given, DES-EDE3-CBC is used. +
+
Parameters:
+
tag - + "RSA" or "DSA", + the tag used to mark the data block. +
           + (type=str) +
filename - + name of the file to write. +
           + (type=str) +
data - + data blob that makes up the private key. +
           + (type=str) +
password - + an optional password to use to encrypt the file. +
           + (type=str) +
+
+
Raises:
+
IOError - + if there was an error writing the file. +
+
+
+ + +
+

can_sign(self) +

+ Return True if this key has the private part necessary + for signing data. +
+
Returns:
+
+ True if this is a private key. +
           + (type=bool) +
+
+
+
+ + +
+

get_base64(self) +

+ Return a base64 string containing the public part of this key. + Nothing secret is revealed. This format is compatible with that used to + store public key files or recognized host keys. +
+
Returns:
+
+ a base64 string containing the public part of the key. +
           + (type=str) +
+
+

Since: fearow +

+ +
+
+ + +
+

get_bits(self) +

+ Return the number of significant bits in this key. This is useful + for judging the relative security of a key. +
+
Returns:
+
+ bits in the key. +
           + (type=int) +
+
+
+
+ + +
+

get_fingerprint(self) +

+ Return an MD5 fingerprint of the public part of this key. Nothing + secret is revealed. +
+
Returns:
+
+ a 16-byte string (binary) of the MD5 fingerprint, in SSH + format. +
           + (type=str) +
+
+
+
+ + +
+

get_name(self) +

+ Return the name of this private key implementation. +
+
Returns:
+
+ name of this private key type, in SSH terminology (for + example, "ssh-rsa"). +
           + (type=str) +
+
+
+
+ + +
+

sign_ssh_data(self, + randpool, + data) +

+ Sign a blob of data with this private key, and return a Message representing an SSH signature + message. +
+
Parameters:
+
randpool - + a secure random number generator. +
           + (type=Crypto.Util.randpool.RandomPool) +
data - + the data to sign. +
           + (type=str) +
+
+
Returns:
+
+ an SSH signature message. +
           + (type=Message) +
+
+
+
+ + +
+

verify_ssh_sig(self, + data, + msg) +

+ Given a blob of data, and an SSH message representing a signature of + that data, verify that it was signed with this key. +
+
Parameters:
+
data - + the data that was signed. +
           + (type=str) +
msg - + an SSH signature message +
           + (type=Message) +
+
+
Returns:
+
+ True if the signature verifies correctly; + False otherwise. +
           + (type=boolean) +
+
+
+
+ + +
+

write_private_key_file(self, + filename, + password=None) +

+ Write private key contents into a file. If the password is not + None, the key is encrypted before writing. +
+
Parameters:
+
filename - + name of the file to write. +
           + (type=str) +
password - + an optional password to use to encrypt the key file. +
           + (type=str) +
+
+
Raises:
+
IOError - + if there was an error writing the file. +
SSHException - + if the key is invalid. +
+

Since: fearow +

+ +
+
+
+ + + + + + +
Class Method Details
+ + +
+

from_private_key_file(cl, + filename, + password=None) +

+ Create a key object by reading a private key file. If the private + key is encrypted and password is not None, + the given password will be used to decrypt the key (otherwise PasswordRequiredException is thrown). + Through the magic of python, this factory method will exist in all + subclasses of PKey (such as RSAKey or DSSKey), but is useless on the abstract + PKey class. +
+
Parameters:
+
filename - + name of the file to read. +
           + (type=str) +
password - + an optional password to use to decrypt the key file, if it's + encrypted +
           + (type=str) +
+
+
Returns:
+
+ a new key object based on the given private key. +
           + (type=PKey) +
+
+
Raises:
+
IOError - + if there was an error reading the file. +
PasswordRequiredException - + if the private key file is encrypted, and + password is None. +
SSHException - + if the key file is invalid. +
+

Since: fearow +

+ +
+
+
+ + + + + + +
Class Variable Details
+
+ +

_CIPHER_TABLE

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{'DES-EDE3-CBC': {'blocksize': 8,
+                  'cipher': <module 'Crypto.Cipher.DES3' from '/usr/li\
+b/python2.4/site-packages/Crypto/Cipher/DES3.so'>,
+                  'keysize': 24,
+                  'mode': 2}}                                          
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.Packetizer-class.html b/docs/private/paramiko.Packetizer-class.html new file mode 100644 index 0000000..f3be97b --- /dev/null +++ b/docs/private/paramiko.Packetizer-class.html @@ -0,0 +1,441 @@ + + + + + paramiko.Packetizer + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class Packetizer +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type Packetizer

+ +
+object --+
+         |
+        Packetizer
+

+ +
+ +Implementation of the base SSH packet protocol. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + socket) +
 __del__(self) +
 _build_packet(self, + payload) +
 _check_keepalive(self) +
 _log(self, + level, + msg) +
 _py22_read_all(self, + n) +
 _py22_read_timeout(self, + timeout) +
 _read_timeout(self, + timeout) +
 _trigger_rekey(self) +
 close(self) +
 get_hexdump(self) +
 get_mac_size_in(self) +
 get_mac_size_out(self) +
 need_rekey(self) +
+Returns True if a new set of keys needs to be +negotiated.
str +read_all(self, + n, + check_rekey) +
+Read as close to N bytes as possible, blocking as long as +necessary.
 read_message(self) +
+Only one thread should ever be in this function (no other locking is +done).
 readline(self, + timeout) +
+Read a line from the socket.
 send_message(self, + data) +
+Write a block of data using the current cipher, as an SSH block.
 set_hexdump(self, + hexdump) +
 set_inbound_cipher(self, + block_engine, + block_size, + mac_engine, + mac_size, + mac_key) +
+Switch inbound data cipher.
 set_inbound_compressor(self, + compressor) +
 set_keepalive(self, + interval, + callback) +
+Turn on/off the callback keepalive.
 set_log(self, + log) +
+Set the python log object to use for logging.
 set_outbound_cipher(self, + block_engine, + block_size, + mac_engine, + mac_size, + mac_key) +
+Switch outbound data cipher.
 set_outbound_compressor(self, + compressor) +
 write_all(self, + out) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + +
Class Variable Summary
intREKEY_BYTES = 1073741824                                                            
intREKEY_PACKETS = 1073741824                                                            

+ + + + + + +
Method Details
+ + +
+

need_rekey(self) +

+ Returns True if a new set of keys needs to be + negotiated. This will be triggered during a packet read or write, so it + should be checked after every read or write, or at least after every + few. +
+
Returns:
+
+ True if a new set of keys needs to be + negotiated +
+
+
+
+ + +
+

read_all(self, + n, + check_rekey=False) +

+ Read as close to N bytes as possible, blocking as long as + necessary. +
+
Parameters:
+
n - + number of bytes to read +
           + (type=int) +
+
+
Returns:
+
+ the data read +
           + (type=str) +
+
+
Raises:
+
EOFError - + if the socket was closed before all the bytes could be + read +
+
+
+ + +
+

read_message(self) +

+ Only one thread should ever be in this function (no other locking is + done). +
+
Raises:
+
SSHException - + if the packet is mangled +
NeedRekeyException - + if the transport should rekey +
+
+
+ + +
+

readline(self, + timeout) +

+ Read a line from the socket. This is done in a fairly inefficient + way, but is only used for initial banner negotiation so it's not worth + optimising. +
+
+
+ + +
+

send_message(self, + data) +

+ Write a block of data using the current cipher, as an SSH block. +
+
+
+ + +
+

set_inbound_cipher(self, + block_engine, + block_size, + mac_engine, + mac_size, + mac_key) +

+ Switch inbound data cipher. +
+
+
+ + +
+

set_keepalive(self, + interval, + callback) +

+ Turn on/off the callback keepalive. If interval seconds + pass with no data read from or written to the socket, the callback will + be executed and the timer will be reset. +
+
+
+ + +
+

set_log(self, + log) +

+ Set the python log object to use for logging. +
+
+
+ + +
+

set_outbound_cipher(self, + block_engine, + block_size, + mac_engine, + mac_size, + mac_key) +

+ Switch outbound data cipher. +
+
+
+
+ + + + + + +
Class Variable Details
+
+ +

REKEY_BYTES

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1073741824                                                            
+
+
+
+
+
+ +

REKEY_PACKETS

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1073741824                                                            
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:46 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.PasswordRequiredException-class.html b/docs/private/paramiko.PasswordRequiredException-class.html new file mode 100644 index 0000000..2b7fb88 --- /dev/null +++ b/docs/private/paramiko.PasswordRequiredException-class.html @@ -0,0 +1,91 @@ + + + + + paramiko.PasswordRequiredException + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class PasswordRequiredException +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class PasswordRequiredException

+ +
+Exception --+    
+            |    
+ SSHException --+
+                |
+               PasswordRequiredException
+

+ +
+ +Exception raised when a password is needed to unlock a private key +file. +
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.RSAKey-class.html b/docs/private/paramiko.RSAKey-class.html new file mode 100644 index 0000000..0550d72 --- /dev/null +++ b/docs/private/paramiko.RSAKey-class.html @@ -0,0 +1,504 @@ + + + + + paramiko.RSAKey + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class RSAKey +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type RSAKey

+ +
+object --+    
+         |    
+      PKey --+
+             |
+            RSAKey
+

+ +
+ +Representation of an RSA key which can be used to sign and verify SSH2 +data. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + msg, + data) +
+Create a new instance of this public key type.
 __hash__(self) +
str +__str__(self) +
+Return a string of an SSH Message made up of the public part(s) of +this key.
bool +can_sign(self) +
+Return True if this key has the private part necessary +for signing data.
RSAKey +generate(bits, + progress_func) +
+Generate a new private RSA key. (Static method) +
int +get_bits(self) +
+Return the number of significant bits in this key.
str +get_name(self) +
+Return the name of this private key implementation.
 sign_ssh_data(self, + rpool, + data) +
boolean +verify_ssh_sig(self, + data, + msg) +
+Given a blob of data, and an SSH message representing a signature of +that data, verify that it was signed with this key.
 write_private_key_file(self, + filename, + password) +
+Write private key contents into a file.
 _from_private_key_file(self, + filename, + password) +
 _pkcs1imify(self, + data) +
+turn a 20-byte SHA1 hash into a blob of data as large as the key's N, +using PKCS1's "emsa-pkcs1-v1_5" encoding.
    Inherited from PKey
int +__cmp__(self, + other) +
+Compare this key to another.
str +_read_private_key_file(self, + tag, + filename, + password) +
+Read an SSH2-format private key file, looking for a string of the type +"BEGIN xxx PRIVATE KEY" for some xxx, +base64-decode the text we find, and return it as a string.
 _write_private_key_file(self, + tag, + filename, + data, + password) +
+Write an SSH2-format private key file in a form that can be read by +paramiko or openssh.
PKey +from_private_key_file(cl, + filename, + password) +
+Create a key object by reading a private key file. (Class method) +
str +get_base64(self) +
+Return a base64 string containing the public part of this key.
str +get_fingerprint(self) +
+Return an MD5 fingerprint of the public part of this key.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + + + + + +
Class Variable Summary
    Inherited from PKey
dict_CIPHER_TABLE = {'DES-EDE3-CBC': {'blocksize': 8, 'ciphe... +

+ + + + + + +
Instance Method Details
+ + +
+

__init__(self, + msg=None, + data=None, + filename=None, + password=None, + vals=None) +
(Constructor) +

+ Create a new instance of this public key type. If msg + is given, the key's public part(s) will be filled in from the message. + If data is given, the key's public part(s) will be filled + in from the string. +
+
Parameters:
+
msg - + an optional SSH Message containing a public key of + this type. +
           + (type=Message) +
data - + an optional string containing a public key of this type +
           + (type=str) +
+
+
Raises:
+
SSHException - + if a key cannot be created from the data or + msg given, or no key was passed in. +
+
Overrides:
+
paramiko.PKey.__init__ (inherited documentation) +
+
+
+
+ + +
+

__str__(self) +
(Informal representation operator) +

+ Return a string of an SSH Message made up of the public part(s) of + this key. This string is suitable for passing to __init__ to re-create the key object + later. +
+
Returns:
+
+ string representation of an SSH key message. +
           + (type=str) +
+
+
Overrides:
+
paramiko.PKey.__str__ (inherited documentation) +
+
+
+
+ + +
+

can_sign(self) +

+ Return True if this key has the private part necessary + for signing data. +
+
Returns:
+
+ True if this is a private key. +
           + (type=bool) +
+
+
Overrides:
+
paramiko.PKey.can_sign (inherited documentation) +
+
+
+
+ + +
+

get_bits(self) +

+ Return the number of significant bits in this key. This is useful + for judging the relative security of a key. +
+
Returns:
+
+ bits in the key. +
           + (type=int) +
+
+
Overrides:
+
paramiko.PKey.get_bits (inherited documentation) +
+
+
+
+ + +
+

get_name(self) +

+ Return the name of this private key implementation. +
+
Returns:
+
+ name of this private key type, in SSH terminology (for + example, "ssh-rsa"). +
           + (type=str) +
+
+
Overrides:
+
paramiko.PKey.get_name (inherited documentation) +
+
+
+
+ + +
+

verify_ssh_sig(self, + data, + msg) +

+ Given a blob of data, and an SSH message representing a signature of + that data, verify that it was signed with this key. +
+
Parameters:
+
data - + the data that was signed. +
           + (type=str) +
msg - + an SSH signature message +
           + (type=Message) +
+
+
Returns:
+
+ True if the signature verifies correctly; + False otherwise. +
           + (type=boolean) +
+
+
Overrides:
+
paramiko.PKey.verify_ssh_sig (inherited documentation) +
+
+
+
+ + +
+

write_private_key_file(self, + filename, + password=None) +

+ Write private key contents into a file. If the password is not + None, the key is encrypted before writing. +
+
Parameters:
+
filename - + name of the file to write. +
           + (type=str) +
password - + an optional password to use to encrypt the key file. +
           + (type=str) +
+
+
Raises:
+
IOError - + if there was an error writing the file. +
SSHException - + if the key is invalid. +
+
Overrides:
+
paramiko.PKey.write_private_key_file (inherited documentation) +
+
+

Since: fearow +

+ +
+
+ + +
+

_pkcs1imify(self, + data) +

+ turn a 20-byte SHA1 hash into a blob of data as large as the key's + N, using PKCS1's "emsa-pkcs1-v1_5" encoding. totally + bizarre. +
+
+
+
+ + + + + + +
Static Method Details
+ + +
+

generate(bits, + progress_func=None) +

+ Generate a new private RSA key. This factory function can be used to + generate a new host key or authentication key. +
+
Parameters:
+
bits - + number of bits the generated key should be. +
           + (type=int) +
progress_func - + an optional function to call at key points in key generation + (used by pyCrypto.PublicKey). +
           + (type=function) +
+
+
Returns:
+
+ new private key +
           + (type=RSAKey) +
+
+

Since: fearow +

+ +
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.SFTP-class.html b/docs/private/paramiko.SFTP-class.html new file mode 100644 index 0000000..7ba1c7f --- /dev/null +++ b/docs/private/paramiko.SFTP-class.html @@ -0,0 +1,347 @@ + + + + + paramiko.SFTP + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class SFTP +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SFTP

+ +
+object --+        
+         |        
+  BaseSFTP --+    
+             |    
+    SFTPClient --+
+                 |
+                SFTP
+

+ +
+ +an alias for SFTPClient for backwards compatability +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
    Inherited from SFTPClient
 __init__(self, + sock) +
+Create an SFTP client from an existing Channel.
 __del__(self) +
 chdir(self, + path) +
+Change the "current directory" of this SFTP session.
 chmod(self, + path, + mode) +
+Change the mode (permissions) of a file.
 chown(self, + path, + uid, + gid) +
+Change the owner (uid) and group (gid) of a +file.
 close(self) +
+Close the SFTP session and its underlying channel.
SFTPFile +file(self, + filename, + mode, + bufsize) +
+Open a file on the remote server.
SFTPClient +from_transport(selfclass, + t) +
+Create an SFTP client channel from an open Transport. (Class method) +
 get(self, + remotepath, + localpath) +
+Copy a remote file (remotepath) from the SFTP server to +the local host as localpath.
str +getcwd(self) +
+Return the "current working directory" for this SFTP +session, as emulated by paramiko.
list of str +listdir(self, + path) +
+Return a list containing the names of the entries in the given +path.
list of SFTPAttributes +listdir_attr(self, + path) +
+Return a list containing SFTPAttributes objects corresponding to +files in the given path.
SFTPAttributes +lstat(self, + path) +
+Retrieve information about a file on the remote system, without +following symbolic links (shortcuts).
 mkdir(self, + path, + mode) +
+Create a folder (directory) named path with numeric mode +mode.
str +normalize(self, + path) +
+Return the normalized path (on the server) of a given path.
SFTPFile +open(self, + filename, + mode, + bufsize) +
+Open a file on the remote server.
 put(self, + localpath, + remotepath) +
+Copy a local file (localpath) to the SFTP server as +remotepath.
str +readlink(self, + path) +
+Return the target of a symbolic link (shortcut).
 remove(self, + path) +
+Remove the file at the given path.
 rename(self, + oldpath, + newpath) +
+Rename a file or folder from oldpath to +newpath.
 rmdir(self, + path) +
+Remove the folder named path.
SFTPAttributes +stat(self, + path) +
+Retrieve information about a file on the remote system.
 symlink(self, + source, + dest) +
+Create a symbolic link (shortcut) of the source path at +destination.
 unlink(self, + path) +
+Remove the file at the given path.
 utime(self, + path, + times) +
+Set the access and modified times of the file specified by +path.
 _adjust_cwd(self, + path) +
+Return an adjusted path if we're emulating a "current working +directory" for the server.
 _async_request(self, + fileobj, + t, + *arg) +
 _convert_status(self, + msg) +
+Raises EOFError or IOError on error status; otherwise does +nothing.
 _finish_responses(self, + fileobj) +
 _read_response(self, + waitfor) +
 _request(self, + t, + *arg) +
    Inherited from BaseSFTP
 _log(self, + level, + msg) +
 _read_all(self, + n) +
 _read_packet(self) +
 _send_packet(self, + t, + packet) +
 _send_server_version(self) +
 _send_version(self) +
 _write_all(self, + out) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.SFTPAttributes-class.html b/docs/private/paramiko.SFTPAttributes-class.html new file mode 100644 index 0000000..a98d008 --- /dev/null +++ b/docs/private/paramiko.SFTPAttributes-class.html @@ -0,0 +1,385 @@ + + + + + paramiko.SFTPAttributes + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class SFTPAttributes +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SFTPAttributes

+ +
+object --+
+         |
+        SFTPAttributes
+

+ +
+ +Representation of the attributes of a file (or proxied file) for SFTP +in client or server mode. It attemps to mirror the object returned by +os.stat as closely as possible, so it may have the following +fields, with the same meanings as those returned by an +os.stat object: +
    +
  • + st_size +
  • +
  • + st_uid +
  • +
  • + st_gid +
  • +
  • + st_mode +
  • +
  • + st_atime +
  • +
  • + st_mtime +
  • +
+Because SFTP allows flags to have other arbitrary named attributes, +these are stored in a dict named attr. Occasionally, the +filename is also stored, in filename. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self) +
+Create a new (empty) SFTPAttributes object.
 __repr__(self) +
 __str__(self) +
+create a unix-style long description of the file (like ls -l)
SFTPAttributes +from_stat(cls, + obj, + filename) +
+Create an SFTPAttributes object from an existing stat +object (an object returned by os.stat). (Class method) +
 _debug_str(self) +
 _from_msg(cls, + msg, + filename) +
+ (Class method) +
 _pack(self, + msg) +
 _rwx(n, + suid, + sticky) +
+ (Static method) +
 _unpack(self, + msg) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + + + + + + + + + + + +
Class Variable Summary
intFLAG_AMTIME = 8                                                                     
longFLAG_EXTENDED = 2147483648L +
intFLAG_PERMISSIONS = 4                                                                     
intFLAG_SIZE = 1                                                                     
intFLAG_UIDGID = 2                                                                     

+ + + + + + +
Instance Method Details
+ + +
+

__init__(self) +
(Constructor) +

+ Create a new (empty) SFTPAttributes object. All fields will be + empty. +
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

__str__(self) +
(Informal representation operator) +

+ create a unix-style long description of the file (like ls -l) +
+
Overrides:
+
__builtin__.object.__str__
+
+
+
+
+ + + + + + +
Class Method Details
+ + +
+

from_stat(cls, + obj, + filename=None) +

+ Create an SFTPAttributes object from an existing stat + object (an object returned by os.stat). +
+
Parameters:
+
obj - + an object returned by os.stat (or + equivalent). +
           + (type=object) +
filename - + the filename associated with this file. +
           + (type=str) +
+
+
Returns:
+
+ new SFTPAttributes object with the same + attribute fields. +
           + (type=SFTPAttributes) +
+
+
+
+
+ + + + + + +
Class Variable Details
+
+ +

FLAG_AMTIME

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+8                                                                     
+
+
+
+
+
+ +

FLAG_EXTENDED

+
+
+
+
+
Type:
+
+ long + +
+
Value:
+
+
+2147483648L                                                            
+
+
+
+
+
+ +

FLAG_PERMISSIONS

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+4                                                                     
+
+
+
+
+
+ +

FLAG_SIZE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1                                                                     
+
+
+
+
+
+ +

FLAG_UIDGID

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.SFTPClient-class.html b/docs/private/paramiko.SFTPClient-class.html new file mode 100644 index 0000000..a6ed5c0 --- /dev/null +++ b/docs/private/paramiko.SFTPClient-class.html @@ -0,0 +1,1091 @@ + + + + + paramiko.SFTPClient + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class SFTPClient +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SFTPClient

+ +
+object --+    
+         |    
+  BaseSFTP --+
+             |
+            SFTPClient
+

+ +
Known Subclasses:
+
+ SFTP
+ +
+ +SFTP client object. SFTPClient is used to open an sftp +session across an open ssh Transport and do remote file +operations. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + sock) +
+Create an SFTP client from an existing Channel.
 __del__(self) +
 chdir(self, + path) +
+Change the "current directory" of this SFTP session.
 chmod(self, + path, + mode) +
+Change the mode (permissions) of a file.
 chown(self, + path, + uid, + gid) +
+Change the owner (uid) and group (gid) of a +file.
 close(self) +
+Close the SFTP session and its underlying channel.
SFTPFile +file(self, + filename, + mode, + bufsize) +
+Open a file on the remote server.
SFTPClient +from_transport(selfclass, + t) +
+Create an SFTP client channel from an open Transport. (Class method) +
 get(self, + remotepath, + localpath) +
+Copy a remote file (remotepath) from the SFTP server to +the local host as localpath.
str +getcwd(self) +
+Return the "current working directory" for this SFTP +session, as emulated by paramiko.
list of str +listdir(self, + path) +
+Return a list containing the names of the entries in the given +path.
list of SFTPAttributes +listdir_attr(self, + path) +
+Return a list containing SFTPAttributes objects corresponding to +files in the given path.
SFTPAttributes +lstat(self, + path) +
+Retrieve information about a file on the remote system, without +following symbolic links (shortcuts).
 mkdir(self, + path, + mode) +
+Create a folder (directory) named path with numeric mode +mode.
str +normalize(self, + path) +
+Return the normalized path (on the server) of a given path.
SFTPFile +open(self, + filename, + mode, + bufsize) +
+Open a file on the remote server.
 put(self, + localpath, + remotepath) +
+Copy a local file (localpath) to the SFTP server as +remotepath.
str +readlink(self, + path) +
+Return the target of a symbolic link (shortcut).
 remove(self, + path) +
+Remove the file at the given path.
 rename(self, + oldpath, + newpath) +
+Rename a file or folder from oldpath to +newpath.
 rmdir(self, + path) +
+Remove the folder named path.
SFTPAttributes +stat(self, + path) +
+Retrieve information about a file on the remote system.
 symlink(self, + source, + dest) +
+Create a symbolic link (shortcut) of the source path at +destination.
 unlink(self, + path) +
+Remove the file at the given path.
 utime(self, + path, + times) +
+Set the access and modified times of the file specified by +path.
 _adjust_cwd(self, + path) +
+Return an adjusted path if we're emulating a "current working +directory" for the server.
 _async_request(self, + fileobj, + t, + *arg) +
 _convert_status(self, + msg) +
+Raises EOFError or IOError on error status; otherwise does +nothing.
 _finish_responses(self, + fileobj) +
 _read_response(self, + waitfor) +
 _request(self, + t, + *arg) +
    Inherited from BaseSFTP
 _log(self, + level, + msg) +
 _read_all(self, + n) +
 _read_packet(self) +
 _send_packet(self, + t, + packet) +
 _send_server_version(self) +
 _send_version(self) +
 _write_all(self, + out) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + +
Instance Method Details
+ + +
+

__init__(self, + sock) +
(Constructor) +

+

Create an SFTP client from an existing Channel. The channel should already have + requested the "sftp" subsystem.

+ An alternate way to create an SFTP client context is by using from_transport. +
+
Parameters:
+
sock - + an open Channel using the + "sftp" subsystem. +
           + (type=Channel) +
+
+
Overrides:
+
paramiko.BaseSFTP.__init__
+
+
+
+ + +
+

chdir(self, + path) +

+ Change the "current directory" of this SFTP session. Since + SFTP doesn't really have the concept of a current working directory, + this is emulated by paramiko. Once you use this method to set a working + directory, all operations on this SFTPClient object will be relative to + that path. +
+
Parameters:
+
path - + new current working directory +
           + (type=str) +
+
+
Raises:
+
IOError - + if the requested path doesn't exist on the server +
+

Since: 1.4 +

+ +
+
+ + +
+

chmod(self, + path, + mode) +

+ Change the mode (permissions) of a file. The permissions are + unix-style and identical to those used by python's + os.chmod function. +
+
Parameters:
+
path - + path of the file to change the permissions of. +
           + (type=string) +
mode - + new permissions. +
           + (type=int) +
+
+
+
+ + +
+

chown(self, + path, + uid, + gid) +

+ Change the owner (uid) and group (gid) of + a file. As with python's os.chown function, you must pass + both arguments, so if you only want to change one, use stat first to retrieve the current owner + and group. +
+
Parameters:
+
path - + path of the file to change the owner and group of. +
           + (type=string) +
uid - + new owner's uid +
           + (type=int) +
gid - + new group id +
           + (type=int) +
+
+
+
+ + +
+

close(self) +

+ Close the SFTP session and its underlying channel. +
+

Since: 1.4 +

+ +
+
+ + +
+

file(self, + filename, + mode='r', + bufsize=-1) +

+

Open a file on the remote server. The arguments are the same as for + python's built-in file (aka open). A + file-like object is returned, which closely mimics the behavior of a + normal python file object.

+

The mode indicates how the file is to be opened: 'r' + for reading, 'w' for writing (truncating an existing + file), 'a' for appending, 'r+' for + reading/writing, 'w+' for reading/writing (truncating an + existing file), 'a+' for reading/appending. The python + 'b' flag is ignored, since SSH treats all files as binary. + The 'U' flag is supported in a compatible way.

+

Since 1.5.2, an 'x' flag indicates that the operation + should only succeed if the file was created and did not previously + exist. This has no direct mapping to python's file flags, but is + commonly known as the O_EXCL flag in posix.

+ The file will be buffered in standard python style by default, but + can be altered with the bufsize parameter. 0 + turns off buffering, 1 uses line buffering, and any number + greater than 1 (>1) uses that specific buffer size. +
+
Parameters:
+
filename - + name of the file to open. +
           + (type=string) +
mode - + mode (python-style) to open in. +
           + (type=string) +
bufsize - + desired buffering (-1 = default buffer size) +
           + (type=int) +
+
+
Returns:
+
+ a file object representing the open file. +
           + (type=SFTPFile) +
+
+
Raises:
+
IOError - + if the file could not be opened. +
+
+
+ + +
+

get(self, + remotepath, + localpath) +

+ Copy a remote file (remotepath) from the SFTP server to + the local host as localpath. Any exception raised by + operations will be passed through. This method is primarily provided as + a convenience. +
+
Parameters:
+
remotepath - + the remote file to copy +
           + (type=str) +
localpath - + the destination path on the local host +
           + (type=str) +
+
+

Since: 1.4 +

+ +
+
+ + +
+

getcwd(self) +

+ Return the "current working directory" for this SFTP + session, as emulated by paramiko. If no directory has been set with chdir, this method will return + None. +
+
Returns:
+
+ the current working directory on the server, or + None +
           + (type=str) +
+
+

Since: 1.4 +

+ +
+
+ + +
+

listdir(self, + path='.') +

+ Return a list containing the names of the entries in the given + path. The list is in arbitrary order. It does not include + the special entries '.' and '..' even if they + are present in the folder. This method is meant to mirror + os.listdir as closely as possible. For a list of full SFTPAttributes objects, see listdir_attr. +
+
Parameters:
+
path - + path to list (defaults to '.') +
           + (type=str) +
+
+
Returns:
+
+ list of filenames +
           + (type=list of str) +
+
+
+
+ + +
+

listdir_attr(self, + path='.') +

+ Return a list containing SFTPAttributes objects corresponding to + files in the given path. The list is in arbitrary order. + It does not include the special entries '.' and + '..' even if they are present in the folder. +
+
Parameters:
+
path - + path to list (defaults to '.') +
           + (type=str) +
+
+
Returns:
+
+ list of attributes +
           + (type=list of SFTPAttributes) +
+
+

Since: 1.2 +

+ +
+
+ + +
+

lstat(self, + path) +

+ Retrieve information about a file on the remote system, without + following symbolic links (shortcuts). This otherwise behaves exactly + the same as stat. +
+
Parameters:
+
path - + the filename to stat. +
           + (type=string) +
+
+
Returns:
+
+ an object containing attributes about the given file. +
           + (type=SFTPAttributes) +
+
+
+
+ + +
+

mkdir(self, + path, + mode=511) +

+ Create a folder (directory) named path with numeric + mode mode. The default mode is 0777 (octal). On some + systems, mode is ignored. Where it is used, the current umask value is + first masked out. +
+
Parameters:
+
path - + name of the folder to create. +
           + (type=string) +
mode - + permissions (posix-style) for the newly-created folder. +
           + (type=int) +
+
+
+
+ + +
+

normalize(self, + path) +

+ Return the normalized path (on the server) of a given path. This can + be used to quickly resolve symbolic links or determine what the server + is considering to be the "current folder" (by passing + '.' as path). +
+
Parameters:
+
path - + path to be normalized. +
           + (type=str) +
+
+
Returns:
+
+ normalized form of the given path. +
           + (type=str) +
+
+
Raises:
+
IOError - + if the path can't be resolved on the server +
+
+
+ + +
+

open(self, + filename, + mode='r', + bufsize=-1) +

+

Open a file on the remote server. The arguments are the same as for + python's built-in file (aka open). A + file-like object is returned, which closely mimics the behavior of a + normal python file object.

+

The mode indicates how the file is to be opened: 'r' + for reading, 'w' for writing (truncating an existing + file), 'a' for appending, 'r+' for + reading/writing, 'w+' for reading/writing (truncating an + existing file), 'a+' for reading/appending. The python + 'b' flag is ignored, since SSH treats all files as binary. + The 'U' flag is supported in a compatible way.

+

Since 1.5.2, an 'x' flag indicates that the operation + should only succeed if the file was created and did not previously + exist. This has no direct mapping to python's file flags, but is + commonly known as the O_EXCL flag in posix.

+ The file will be buffered in standard python style by default, but + can be altered with the bufsize parameter. 0 + turns off buffering, 1 uses line buffering, and any number + greater than 1 (>1) uses that specific buffer size. +
+
Parameters:
+
filename - + name of the file to open. +
           + (type=string) +
mode - + mode (python-style) to open in. +
           + (type=string) +
bufsize - + desired buffering (-1 = default buffer size) +
           + (type=int) +
+
+
Returns:
+
+ a file object representing the open file. +
           + (type=SFTPFile) +
+
+
Raises:
+
IOError - + if the file could not be opened. +
+
+
+ + +
+

put(self, + localpath, + remotepath) +

+

Copy a local file (localpath) to the SFTP server as + remotepath. Any exception raised by operations will be + passed through. This method is primarily provided as a convenience.

+ The SFTP operations use pipelining for speed. +
+
Parameters:
+
localpath - + the local file to copy +
           + (type=str) +
remotepath - + the destination path on the SFTP server +
           + (type=str) +
+
+

Since: 1.4 +

+ +
+
+ + +
+

readlink(self, + path) +

+ Return the target of a symbolic link (shortcut). You can use symlink to create these. The result may + be either an absolute or relative pathname. +
+
Parameters:
+
path - + path of the symbolic link file. +
           + (type=str) +
+
+
Returns:
+
+ target path. +
           + (type=str) +
+
+
+
+ + +
+

remove(self, + path) +

+ Remove the file at the given path. +
+
Parameters:
+
path - + path (absolute or relative) of the file to remove. +
           + (type=string) +
+
+
Raises:
+
IOError - + if the path refers to a folder (directory). Use rmdir to remove a folder. +
+
+
+ + +
+

rename(self, + oldpath, + newpath) +

+ Rename a file or folder from oldpath to + newpath. +
+
Parameters:
+
oldpath - + existing name of the file or folder. +
           + (type=string) +
newpath - + new name for the file or folder. +
           + (type=string) +
+
+
Raises:
+
IOError - + if newpath is a folder, or something else goes + wrong. +
+
+
+ + +
+

rmdir(self, + path) +

+ Remove the folder named path. +
+
Parameters:
+
path - + name of the folder to remove. +
           + (type=string) +
+
+
+
+ + +
+

stat(self, + path) +

+

Retrieve information about a file on the remote system. The return + value is an object whose attributes correspond to the attributes of + python's stat structure as returned by + os.stat, except that it contains fewer fields. An SFTP + server may return as much or as little info as it wants, so the results + may vary from server to server.

+

Unlike a python stat object, the result may not be + accessed as a tuple. This is mostly due to the author's slack + factor.

+ The fields supported are: st_mode, + st_size, st_uid, st_gid, + st_atime, and st_mtime. +
+
Parameters:
+
path - + the filename to stat. +
           + (type=string) +
+
+
Returns:
+
+ an object containing attributes about the given file. +
           + (type=SFTPAttributes) +
+
+
+
+ + +
+

symlink(self, + source, + dest) +

+ Create a symbolic link (shortcut) of the source path at + destination. +
+
Parameters:
+
source - + path of the original file. +
           + (type=string) +
dest - + path of the newly created symlink. +
           + (type=string) +
+
+
+
+ + +
+

unlink(self, + path) +

+ Remove the file at the given path. +
+
Parameters:
+
path - + path (absolute or relative) of the file to remove. +
           + (type=string) +
+
+
Raises:
+
IOError - + if the path refers to a folder (directory). Use rmdir to remove a folder. +
+
+
+ + +
+

utime(self, + path, + times) +

+ Set the access and modified times of the file specified by + path. If times is None, then the + file's access and modified times are set to the current time. + Otherwise, times must be a 2-tuple of numbers, of the form + (atime, mtime), which is used to set the access and + modified times, respectively. This bizarre API is mimicked from python + for the sake of consistency -- I apologize. +
+
Parameters:
+
path - + path of the file to modify. +
           + (type=string) +
times - + None or a tuple of (access time, modified time) + in standard internet epoch time (seconds since 01 January 1970 + GMT). +
           + (type=tuple of int) +
+
+
+
+ + +
+

_adjust_cwd(self, + path) +

+ Return an adjusted path if we're emulating a "current working + directory" for the server. +
+
+
+ + +
+

_convert_status(self, + msg) +

+ Raises EOFError or IOError on error status; otherwise does + nothing. +
+
+
+
+ + + + + + +
Class Method Details
+ + +
+

from_transport(selfclass, + t) +

+ Create an SFTP client channel from an open Transport. +
+
Parameters:
+
t - + an open Transport which is already + authenticated. +
           + (type=Transport) +
+
+
Returns:
+
+ a new SFTPClient object, referring to an + sftp session (channel) across the transport. +
           + (type=SFTPClient) +
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.SFTPError-class.html b/docs/private/paramiko.SFTPError-class.html new file mode 100644 index 0000000..2b7aa97 --- /dev/null +++ b/docs/private/paramiko.SFTPError-class.html @@ -0,0 +1,85 @@ + + + + + paramiko.SFTPError + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class SFTPError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class SFTPError

+ +
+Exception --+
+            |
+           SFTPError
+

+ +
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.SFTPFile-class.html b/docs/private/paramiko.SFTPFile-class.html new file mode 100644 index 0000000..0c59d5f --- /dev/null +++ b/docs/private/paramiko.SFTPFile-class.html @@ -0,0 +1,667 @@ + + + + + paramiko.SFTPFile + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class SFTPFile +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SFTPFile

+ +
+  object --+    
+           |    
+BufferedFile --+
+               |
+              SFTPFile
+

+ +
+ +Proxy object for a file on the remote server, in client mode SFTP. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + sftp, + handle, + mode, + bufsize) +
 __del__(self) +
str +check(self, + hash_algorithm, + offset, + length, + block_size) +
+Ask the server for a hash of a section of this file.
 close(self) +
+Close the file.
float +gettimeout(self) +
+Returns the timeout in seconds (as a float) associated with the socket +or ssh Channel used for this file.
 prefetch(self) +
+Pre-fetch the remaining contents of this file in anticipation of +future read calls.
 seek(self, + offset, + whence) +
+Set the file's current position, like stdio's fseek.
 set_pipelined(self, + pipelined) +
+Turn on/off the pipelining of write operations to this file.
 setblocking(self, + blocking) +
+Set blocking or non-blocking mode on the underiying socket or ssh Channel.
 settimeout(self, + timeout) +
+Set a timeout on read/write operations on the underlying socket or ssh +Channel.
SFTPAttributes +stat(self) +
+Retrieve information about this file from the remote system.
 _async_response(self, + t, + msg) +
 _check_exception(self) +
+if there's a saved exception, raise & clear it
 _get_size(self) +
+(subclass override) Return the size of the file.
 _prefetch(self) +
 _read(self, + size) +
+(subclass override) Read data from the stream.
 _read_prefetch(self, + size) +
 _write(self, + data) +
+(subclass override) Write data into the stream.
    Inherited from BufferedFile
iterator +__iter__(self) +
+Returns an iterator that can be used to iterate over the lines in this +file.
 flush(self) +
+Write out any data in the write buffer.
str +next(self) +
+Returns the next line from the input, or raises +StopIteration when EOF is hit.
str +read(self, + size) +
+Read at most size bytes from the file (less if we hit the +end of the file first).
str +readline(self, + size) +
+Read one entire line from the file.
list +readlines(self, + sizehint) +
+Read all remaining lines using readline and return them as a list.
int +tell(self) +
+Return the file's current position.
 write(self, + data) +
+Write data to the file.
 writelines(self, + sequence) +
+Write a sequence of strings to the file.
iterator +xreadlines(self) +
+Identical to iter(f).
 _record_newline(self, + newline) +
 _set_mode(self, + mode, + bufsize) +
+Subclasses call this method to initialize the BufferedFile.
 _write_all(self, + data) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + + + + + + + + +
Class Variable Summary
intMAX_REQUEST_SIZE = 32768                                                                 
    Inherited from BufferedFile
intSEEK_CUR = 1                                                                     
intSEEK_END = 2                                                                     
intSEEK_SET = 0                                                                     
int_DEFAULT_BUFSIZE = 8192                                                                  

+ + + + + + +
Method Details
+ + +
+

check(self, + hash_algorithm, + offset=0, + length=0, + block_size=0) +

+

Ask the server for a hash of a section of this file. This can be + used to verify a successful upload or download, or for various + rsync-like operations.

+

The file is hashed from offset, for length + bytes. If length is 0, the remainder of the file is + hashed. Thus, if both offset and length are + zero, the entire file is hashed.

+

Normally, block_size will be 0 (the default), and this + method will return a byte string representing the requested hash (for + example, a string of length 16 for MD5, or 20 for SHA-1). If a non-zero + block_size is given, each chunk of the file (from + offset to offset + length) of + block_size bytes is computed as a separate hash. The hash + results are all concatenated and returned as a single string.

+ For example, check('sha1', 0, 1024, 512) will return a + string of length 40. The first 20 bytes will be the SHA-1 of the first + 512 bytes of the file, and the last 20 bytes will be the SHA-1 of the + next 512 bytes. +
+
Parameters:
+
hash_algorithm - + the name of the hash algorithm to use (normally + "sha1" or + "md5") +
           + (type=str) +
offset - + offset into the file to begin hashing (0 means to start from + the beginning) +
           + (type=int or long) +
length - + number of bytes to hash (0 means continue to the end of the + file) +
           + (type=int or long) +
block_size - + number of bytes to hash per result (must not be less than 256; + 0 means to compute only one hash of the entire segment) +
           + (type=int) +
+
+
Returns:
+
+ string of bytes representing the hash of each block, + concatenated together +
           + (type=str) +
+
+
Raises:
+
IOError - + if the server doesn't support the "check-file" + extension, or possibly doesn't support the hash algorithm + requested +
+

Note: Many (most?) servers don't support this extension yet. +

+ +

Since: 1.4 +

+ +
+
+ + +
+

close(self, + _async=False) +

+ Close the file. Future read and write operations will fail. +
+
Overrides:
+
paramiko.BufferedFile.close (inherited documentation) +
+
+
+
+ + +
+

gettimeout(self) +

+ Returns the timeout in seconds (as a float) associated with the + socket or ssh Channel used for this file. +
+
Returns:
+
+ float +
+
+

See Also: Channel.gettimeout +

+ +
+
+ + +
+

prefetch(self) +

+ Pre-fetch the remaining contents of this file in anticipation of + future read calls. If reading the entire file, + pre-fetching can dramatically improve the download speed by avoiding + roundtrip latency. The file's contents are incrementally buffered in a + background thread. +
+

Since: 1.5.1 +

+ +
+
+ + +
+

seek(self, + offset, + whence=0) +

+ Set the file's current position, like stdio's fseek. + Not all file objects support seeking. +
+
Parameters:
+
offset - + position to move to within the file, relative to + whence. +
           + (type=int) +
whence - + type of movement: 0 = absolute; 1 = relative to the current + position; 2 = relative to the end of the file. +
           + (type=int) +
+
+
Raises:
+
IOError - + if the file doesn't support random access. +
+
Overrides:
+
paramiko.BufferedFile.seek (inherited documentation) +
+
+

Note: If a file is opened in append mode ('a' or +'a+'), any seek operations will be undone at the next write +(as the file position will move back to the end of the file). +

+ +
+
+ + +
+

set_pipelined(self, + pipelined=True) +

+

Turn on/off the pipelining of write operations to this file. When + pipelining is on, paramiko won't wait for the server response after + each write operation. Instead, they're collected as they come in. At + the first non-write operation (including close), all remaining server responses + are collected. This means that if there was an error with one of your + later writes, an exception might be thrown from within close instead of write.

+ By default, files are not pipelined. +
+
Parameters:
+
pipelined - + True if pipelining should be turned on for this + file; False otherwise +
           + (type=bool) +
+
+

Since: 1.5 +

+ +
+
+ + +
+

setblocking(self, + blocking) +

+ Set blocking or non-blocking mode on the underiying socket or ssh Channel. +
+
Parameters:
+
blocking - + 0 to set non-blocking mode; non-0 to set blocking mode. +
           + (type=int) +
+
+

See Also: Channel.setblocking +

+ +
+
+ + +
+

settimeout(self, + timeout) +

+ Set a timeout on read/write operations on the underlying socket or + ssh Channel. +
+
Parameters:
+
timeout - + seconds to wait for a pending read/write operation before + raising socket.timeout, or None for no + timeout +
           + (type=float) +
+
+

See Also: Channel.settimeout +

+ +
+
+ + +
+

stat(self) +

+ Retrieve information about this file from the remote system. This is + exactly like SFTP.stat, except that it operates on an + already-open file. +
+
Returns:
+
+ an object containing attributes about this file. +
           + (type=SFTPAttributes) +
+
+
+
+ + +
+

_check_exception(self) +

+ if there's a saved exception, raise & clear it +
+
+
+ + +
+

_get_size(self) +

+ (subclass override) Return the size of the file. This is + called from within _set_mode if the file is opened in append + mode, so the file position can be tracked and seek and tell will work correctly. If the file is + a stream that can't be randomly accessed, you don't need to override + this method, +
+
Overrides:
+
paramiko.BufferedFile._get_size (inherited documentation) +
+
+
+
+ + +
+

_read(self, + size) +

+ (subclass override) Read data from the stream. Return + None or raise EOFError to indicate EOF. +
+
Overrides:
+
paramiko.BufferedFile._read (inherited documentation) +
+
+
+
+ + +
+

_write(self, + data) +

+ (subclass override) Write data into the stream. +
+
Overrides:
+
paramiko.BufferedFile._write (inherited documentation) +
+
+
+
+
+ + + + + + +
Class Variable Details
+
+ +

MAX_REQUEST_SIZE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+32768                                                                 
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.SFTPHandle-class.html b/docs/private/paramiko.SFTPHandle-class.html new file mode 100644 index 0000000..958dbba --- /dev/null +++ b/docs/private/paramiko.SFTPHandle-class.html @@ -0,0 +1,364 @@ + + + + + paramiko.SFTPHandle + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class SFTPHandle +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SFTPHandle

+ +
+object --+
+         |
+        SFTPHandle
+

+ +
+ +

Abstract object representing a handle to an open file (or folder) in +an SFTP server implementation. Each handle has a string representation +used by the client to refer to the underlying file.

+Server implementations can (and should) subclass SFTPHandle to +implement features of a file handle, like stat or chattr. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self) +
int +chattr(self, + attr) +
+Change the attributes of this file.
 close(self) +
+When a client closes a file, this method is called on the handle.
str +read(self, + offset, + length) +
+Read up to length bytes from this file, starting at +position offset.
SFTPAttributes or error + code +stat(self) +
+Return an SFTPAttributes object referring to this +open file, or an error code.
 write(self, + offset, + data) +
+Write data into this file at position +offset.
 _get_name(self) +
 _get_next_files(self) +
+Used by the SFTP server code to retreive a cached directory +listing.
 _set_files(self, + files) +
+Used by the SFTP server code to cache a directory listing.
 _set_name(self, + name) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + +
Method Details
+ + +
+

chattr(self, + attr) +

+ Change the attributes of this file. The attr object + will contain only those fields provided by the client in its request, + so you should check for the presence of fields before using them. +
+
Parameters:
+
attr - + the attributes to change on this file. +
           + (type=SFTPAttributes) +
+
+
Returns:
+
+ an error code like SFTP_OK. +
           + (type=int) +
+
+
+
+ + +
+

close(self) +

+

When a client closes a file, this method is called on the handle. + Normally you would use this method to close the underlying OS level + file object(s).

+ The default implementation checks for attributes on + self named readfile and/or + writefile, and if either or both are present, their + close() methods are called. This means that if you are + using the default implementations of read and write, this method's default + implementation should be fine also. +
+
+
+ + +
+

read(self, + offset, + length) +

+

Read up to length bytes from this file, starting at + position offset. The offset may be a python long, since + SFTP allows it to be 64 bits.

+

If the end of the file has been reached, this method may return an + empty string to signify EOF, or it may also return SFTP_EOF.

+ The default implementation checks for an attribute on + self named readfile, and if present, performs + the read operation on the python file-like object found there. (This is + meant as a time saver for the common case where you are wrapping a + python file object.) +
+
Parameters:
+
offset - + position in the file to start reading from. +
           + (type=int or long) +
length - + number of bytes to attempt to read. +
           + (type=int) +
+
+
Returns:
+
+ data read from the file, or an SFTP error code. +
           + (type=str) +
+
+
+
+ + +
+

stat(self) +

+ Return an SFTPAttributes object referring to this + open file, or an error code. This is equivalent to SFTPServerInterface.stat, except it's + called on an open file instead of a path. +
+
Returns:
+
+ an attributes object for the given file, or an SFTP error code + (like SFTP_PERMISSION_DENIED). +
           + (type=SFTPAttributes or error + code) +
+
+
+
+ + +
+

write(self, + offset, + data) +

+

Write data into this file at position + offset. Extending the file past its original end is + expected. Unlike python's normal write() methods, this + method cannot do a partial write: it must write all of + data or else return an error.

+ The default implementation checks for an attribute on + self named writefile, and if present, + performs the write operation on the python file-like object found + there. The attribute is named differently from readfile to + make it easy to implement read-only (or write-only) files, but if both + attributes are present, they should refer to the same file. +
+
Parameters:
+
offset - + position in the file to start reading from. +
           + (type=int or long) +
data - + data to write into the file. +
           + (type=str) +
+
+
Returns:
+
+ an SFTP error code like SFTP_OK. +
+
+
+
+ + +
+

_get_next_files(self) +

+ Used by the SFTP server code to retreive a cached directory + listing. +
+
+
+ + +
+

_set_files(self, + files) +

+ Used by the SFTP server code to cache a directory listing. (In the + SFTP protocol, listing a directory is a multi-stage process requiring a + temporary handle.) +
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.SFTPServer-class.html b/docs/private/paramiko.SFTPServer-class.html new file mode 100644 index 0000000..07a16b0 --- /dev/null +++ b/docs/private/paramiko.SFTPServer-class.html @@ -0,0 +1,511 @@ + + + + + paramiko.SFTPServer + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class SFTPServer +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SFTPServer

+ +
+object --+            
+         |            
+  _Verbose --+        
+             |        
+        Thread --+    
+                 |    
+  SubsystemHandler --+
+                     |
+        object --+   |
+                 |   |
+          BaseSFTP --+
+                     |
+                    SFTPServer
+

+ +
+ +Server-side SFTP subsystem support. Since this is a SubsystemHandler, it can be (and is meant +to be) set as the handler for "sftp" requests. Use +Transport.set_subsystem_handler to activate +this class. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + channel, + name, + server, + sftp_si, + *largs, + **kwargs) +
+The constructor for SFTPServer is meant to be called from within the +Transport as a subsystem handler.
int +convert_errno(e) +
+Convert an errno value (as from an OSError or +IOError) into a standard SFTP result code. (Static method) +
 finish_subsystem(self) +
+Perform any cleanup at the end of a subsystem.
 set_file_attr(filename, + attr) +
+Change a file's attributes on the local filesystem. (Static method) +
 start_subsystem(self, + name, + transport, + channel) +
+Process an ssh subsystem in server mode.
 _check_file(self, + request_number, + msg) +
 _convert_pflags(self, + pflags) +
+convert SFTP-style open() flags to python's os.open() flags
 _open_folder(self, + request_number, + path) +
 _process(self, + t, + request_number, + msg) +
 _read_folder(self, + request_number, + folder) +
 _response(self, + request_number, + t, + *arg) +
 _send_handle_response(self, + request_number, + handle, + folder) +
 _send_status(self, + request_number, + code, + desc) +
    Inherited from BaseSFTP
 _log(self, + level, + msg) +
 _read_all(self, + n) +
 _read_packet(self) +
 _send_packet(self, + t, + packet) +
 _send_server_version(self) +
 _send_version(self) +
 _write_all(self, + out) +
    Inherited from SubsystemHandler
ServerInterface +get_server(self) +
+Return the ServerInterface object associated with this +channel and subsystem.
 _run(self) +
    Inherited from Thread
 __repr__(self) +
 getName(self) +
 isAlive(self) +
 isDaemon(self) +
 join(self, + timeout) +
 run(self) +
 setDaemon(self, + daemonic) +
 setName(self, + name) +
 start(self) +
 _set_daemon(self) +
    Inherited from _Verbose
 _note(self, + format, + *args) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + +
Class Variable Summary
    Inherited from Thread
bool_Thread__initialized = False +

+ + + + + + +
Instance Method Details
+ + +
+

__init__(self, + channel, + name, + server, + sftp_si=<class 'paramiko.SFTPServerInterface'>, + *largs, + **kwargs) +
(Constructor) +

+ The constructor for SFTPServer is meant to be called from within the + Transport as a subsystem handler. + server and any additional parameters or keyword parameters + are passed from the original call to Transport.set_subsystem_handler. +
+
Parameters:
+
channel - + channel passed from the Transport. +
           + (type=Channel) +
name - + name of the requested subsystem. +
           + (type=str) +
server - + the server object associated with this channel and + subsystem +
           + (type=ServerInterface) +
sftp_si - + a subclass of SFTPServerInterface to use for + handling individual requests. +
           + (type=class) +
+
+
Overrides:
+
paramiko.BaseSFTP.__init__
+
+
+
+ + +
+

finish_subsystem(self) +

+ Perform any cleanup at the end of a subsystem. The default + implementation just closes the channel. +
+
Overrides:
+
paramiko.SubsystemHandler.finish_subsystem (inherited documentation) +
+
+

Since: 1.1 +

+ +
+
+ + +
+

start_subsystem(self, + name, + transport, + channel) +

+

Process an ssh subsystem in server mode. This method is called on a + new object (and in a new thread) for each subsystem request. It is + assumed that all subsystem logic will take place here, and when the + subsystem is finished, this method will return. After this method + returns, the channel is closed.

+ The combination of transport and channel + are unique; this handler corresponds to exactly one Channel on one Transport. +
+
Parameters:
+
name - + name of the requested subsystem. +
           + (type=str) +
transport - + the server-mode Transport. +
           + (type=Transport) +
channel - + the channel associated with this subsystem request. +
           + (type=Channel) +
+
+
Overrides:
+
paramiko.SubsystemHandler.start_subsystem (inherited documentation) +
+
+

Note: It is the responsibility of this method to exit if the underlying Transport is closed. This can be done by +checking Transport.is_active or noticing an EOF on +the Channel. If this method loops forever +without checking for this case, your python interpreter may refuse to +exit because this thread will still be running. +

+ +
+
+ + +
+

_convert_pflags(self, + pflags) +

+ convert SFTP-style open() flags to python's os.open() flags +
+
+
+
+ + + + + + +
Static Method Details
+ + +
+

convert_errno(e) +

+ Convert an errno value (as from an OSError or + IOError) into a standard SFTP result code. This is a + convenience function for trapping exceptions in server code and + returning an appropriate result. +
+
Parameters:
+
e - + an errno code, as from OSError.errno. +
           + (type=int) +
+
+
Returns:
+
+ an SFTP error code like SFTP_NO_SUCH_FILE. +
           + (type=int) +
+
+
+
+ + +
+

set_file_attr(filename, + attr) +

+

Change a file's attributes on the local filesystem. The contents of + attr are used to change the permissions, owner, group + ownership, and/or modification & access time of the file, depending + on which attributes are present in attr.

+ This is meant to be a handy helper function for translating SFTP + file requests into local file operations. +
+
Parameters:
+
filename - + name of the file to alter (should usually be an absolute + path). +
           + (type=str) +
attr - + attributes to change. +
           + (type=SFTPAttributes) +
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.SFTPServerInterface-class.html b/docs/private/paramiko.SFTPServerInterface-class.html new file mode 100644 index 0000000..a0bd429 --- /dev/null +++ b/docs/private/paramiko.SFTPServerInterface-class.html @@ -0,0 +1,744 @@ + + + + + paramiko.SFTPServerInterface + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class SFTPServerInterface +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SFTPServerInterface

+ +
+object --+
+         |
+        SFTPServerInterface
+

+ +
+ +

This class defines an interface for controlling the behavior of +paramiko when using the SFTPServer subsystem to provide an SFTP +server.

+Methods on this class are called from the SFTP session's thread, so +you can block as long as necessary without affecting other sessions (even +other SFTP sessions). However, raising an exception will usually cause +the SFTP session to abruptly end, so you will usually want to catch +exceptions and return an appropriate error code. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + server, + *largs, + **kwargs) +
+Create a new SFTPServerInterface object.
 canonicalize(self, + path) +
+Return the canonical form of a path on the server.
int +chattr(self, + path, + attr) +
+Change the attributes of a file.
list of SFTPAttributes or error + code +list_folder(self, + path) +
+Return a list of files within a given folder.
SFTPAttributes or error + code +lstat(self, + path) +
+Return an SFTPAttributes object for a path on the +server, or an error code.
int +mkdir(self, + path, + attr) +
+Create a new directory with the given attributes.
 open(self, + path, + flags, + attr) +
+Open a file on the server and create a handle for future operations on +that file.
str or error code +readlink(self, + path) +
+Return the target of a symbolic link (or shortcut) on the server.
int +remove(self, + path) +
+Delete a file, if possible.
int +rename(self, + oldpath, + newpath) +
+Rename (or move) a file.
int +rmdir(self, + path) +
+Remove a directory if it exists.
 session_ended(self) +
+The SFTP server session has just ended, either cleanly or via an +exception.
 session_started(self) +
+The SFTP server session has just started.
SFTPAttributes or error + code +stat(self, + path) +
+Return an SFTPAttributes object for a path on the +server, or an error code.
int +symlink(self, + target_path, + path) +
+Create a symbolic link on the server, as new pathname +path, with target_path as the target of the +link.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + +
Method Details
+ + +
+

__init__(self, + server, + *largs, + **kwargs) +
(Constructor) +

+ Create a new SFTPServerInterface object. This method does nothing by + default and is meant to be overridden by subclasses. +
+
Parameters:
+
server - + the server object associated with this channel and SFTP + subsystem +
           + (type=ServerInterface) +
+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

canonicalize(self, + path) +

+

Return the canonical form of a path on the server. For example, if + the server's home folder is /home/foo, the path + "../betty" would be canonicalized to + "/home/betty". Note the obvious security issues: + if you're serving files only from a specific folder, you probably don't + want this method to reveal path names outside that folder.

+

You may find the python methods in os.path useful, + especially os.path.normpath and + os.path.realpath.

+ The default implementation returns os.path.normpath('/' + + path). +
+
+
+ + +
+

chattr(self, + path, + attr) +

+ Change the attributes of a file. The attr object will + contain only those fields provided by the client in its request, so you + should check for the presence of fields before using them. +
+
Parameters:
+
path - + requested path (relative or absolute) of the file to + change. +
           + (type=str) +
attr - + requested attributes to change on the file. +
           + (type=SFTPAttributes) +
+
+
Returns:
+
+ an error code like SFTP_OK. +
           + (type=int) +
+
+
+
+ + +
+

list_folder(self, + path) +

+

Return a list of files within a given folder. The path + will use posix notation ("/" separates folder + names) and may be an absolute or relative path.

+

The list of files is expected to be a list of SFTPAttributes objects, which are similar + in structure to the objects returned by os.stat. In + addition, each object should have its filename field + filled in, since this is important to a directory listing and not + normally present in os.stat results. The method + SFTPAttributes.from_stat will usually do what you + want.

+ In case of an error, you should return one of the + SFTP_* error codes, such as SFTP_PERMISSION_DENIED. +
+
Parameters:
+
path - + the requested path (relative or absolute) to be listed. +
           + (type=str) +
+
+
Returns:
+
+ a list of the files in the given folder, using SFTPAttributes objects. +
           + (type=list of SFTPAttributes or error + code) +
+
+

Note: You should normalize the given path first (see the +os.path module) and check appropriate permissions before +returning the list of files. Be careful of malicious clients attempting +to use relative paths to escape restricted folders, if you're doing a +direct translation from the SFTP server path to your local +filesystem. +

+ +
+
+ + +
+

lstat(self, + path) +

+ Return an SFTPAttributes object for a path on the + server, or an error code. If your server supports symbolic links (also + known as "aliases"), you should not follow them -- + instead, you should return data on the symlink or alias itself. (stat is the corresponding call that + follows symlinks/aliases.) +
+
Parameters:
+
path - + the requested path (relative or absolute) to fetch file + statistics for. +
           + (type=str) +
+
+
Returns:
+
+ an attributes object for the given file, or an SFTP error code + (like SFTP_PERMISSION_DENIED). +
           + (type=SFTPAttributes or error + code) +
+
+
+
+ + +
+

mkdir(self, + path, + attr) +

+

Create a new directory with the given attributes. The + attr object may be considered a "hint" and + ignored.

+ The attr object will contain only those fields provided + by the client in its request, so you should use hasattr to + check for the presense of fields before using them. In some cases, the + attr object may be completely empty. +
+
Parameters:
+
path - + requested path (relative or absolute) of the new folder. +
           + (type=str) +
attr - + requested attributes of the new folder. +
           + (type=SFTPAttributes) +
+
+
Returns:
+
+ an SFTP error code like SFTP_OK. +
           + (type=int) +
+
+
+
+ + +
+

open(self, + path, + flags, + attr) +

+

Open a file on the server and create a handle for future operations + on that file. On success, a new object subclassed from SFTPHandle should be returned. This + handle will be used for future operations on the file (read, write, + etc). On failure, an error code such as SFTP_PERMISSION_DENIED should be + returned.

+ flags contains the requested mode for opening + (read-only, write-append, etc) as a bitset of flags from the + os module: +
    +
  • + os.O_RDONLY +
  • +
  • + os.O_WRONLY +
  • +
  • + os.O_RDWR +
  • +
  • + os.O_APPEND +
  • +
  • + os.O_CREAT +
  • +
  • + os.O_TRUNC +
  • +
  • + os.O_EXCL +
  • +
+

(One of os.O_RDONLY, os.O_WRONLY, or + os.O_RDWR will always be set.)

+ The attr object contains requested attributes of the + file if it has to be created. Some or all attribute fields may be + missing if the client didn't specify them. +
+
Parameters:
+
path - + the requested path (relative or absolute) of the file to be + opened. +
           + (type=str) +
flags - + flags or'd together from the os module indicating + the requested mode for opening the file. +
           + (type=int) +
attr - + requested attributes of the file if it is newly created. +
           + (type=SFTPAttributes) +
+
+
Returns:
+
+ a new SFTPHandle or error code. + @rtype SFTPHandle +
+
+

Note: The SFTP protocol defines all files to be in "binary" mode. +There is no equivalent to python's "text" mode. +

+ +
+
+ + +
+

readlink(self, + path) +

+ Return the target of a symbolic link (or shortcut) on the server. If + the specified path doesn't refer to a symbolic link, an error should be + returned. +
+
Parameters:
+
path - + path (relative or absolute) of the symbolic link. +
           + (type=str) +
+
+
Returns:
+
+ the target path of the symbolic link, or an error code like SFTP_NO_SUCH_FILE. +
           + (type=str or error code) +
+
+
+
+ + +
+

remove(self, + path) +

+ Delete a file, if possible. +
+
Parameters:
+
path - + the requested path (relative or absolute) of the file to + delete. +
           + (type=str) +
+
+
Returns:
+
+ an SFTP error code like SFTP_OK. +
           + (type=int) +
+
+
+
+ + +
+

rename(self, + oldpath, + newpath) +

+ Rename (or move) a file. The SFTP specification implies that this + method can be used to move an existing file into a different folder, + and since there's no other (easy) way to move files via SFTP, it's + probably a good idea to implement "move" in this method too, + even for files that cross disk partition boundaries, if at all + possible. +
+
Parameters:
+
oldpath - + the requested path (relative or absolute) of the existing + file. +
           + (type=str) +
newpath - + the requested new path of the file. +
           + (type=str) +
+
+
Returns:
+
+ an SFTP error code like SFTP_OK. +
           + (type=int) +
+
+

Note: You should return an error if a file with the same name as +newpath already exists. (The rename operation should be +non-desctructive.) +

+ +
+
+ + +
+

rmdir(self, + path) +

+ Remove a directory if it exists. The path should refer + to an existing, empty folder -- otherwise this method should return an + error. +
+
Parameters:
+
path - + requested path (relative or absolute) of the folder to + remove. +
           + (type=str) +
+
+
Returns:
+
+ an SFTP error code like SFTP_OK. +
           + (type=int) +
+
+
+
+ + +
+

session_ended(self) +

+ The SFTP server session has just ended, either cleanly or via an + exception. This method is meant to be overridden to perform any + necessary cleanup before this SFTPServerInterface object + is destroyed. +
+
+
+ + +
+

session_started(self) +

+ The SFTP server session has just started. This method is meant to be + overridden to perform any necessary setup before handling callbacks + from SFTP operations. +
+
+
+ + +
+

stat(self, + path) +

+ Return an SFTPAttributes object for a path on the + server, or an error code. If your server supports symbolic links (also + known as "aliases"), you should follow them. (lstat is the corresponding call that + doesn't follow symlinks/aliases.) +
+
Parameters:
+
path - + the requested path (relative or absolute) to fetch file + statistics for. +
           + (type=str) +
+
+
Returns:
+
+ an attributes object for the given file, or an SFTP error code + (like SFTP_PERMISSION_DENIED). +
           + (type=SFTPAttributes or error + code) +
+
+
+
+ + +
+

symlink(self, + target_path, + path) +

+ Create a symbolic link on the server, as new pathname + path, with target_path as the target of the + link. +
+
Parameters:
+
target_path - + path (relative or absolute) of the target for this new + symbolic link. +
           + (type=str) +
path - + path (relative or absolute) of the symbolic link to + create. +
           + (type=str) +
+
+
Returns:
+
+ an error code like SFTP_OK. +
           + (type=int) +
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.SSHException-class.html b/docs/private/paramiko.SSHException-class.html new file mode 100644 index 0000000..74d34e6 --- /dev/null +++ b/docs/private/paramiko.SSHException-class.html @@ -0,0 +1,95 @@ + + + + + paramiko.SSHException + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class SSHException +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class SSHException

+ +
+Exception --+
+            |
+           SSHException
+

+ +
Known Subclasses:
+
+ BadAuthenticationType, + PasswordRequiredException, + PartialAuthentication
+ +
+ +Exception raised by failures in SSH2 protocol negotiation or logic +errors. +
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.SecurityOptions-class.html b/docs/private/paramiko.SecurityOptions-class.html new file mode 100644 index 0000000..1763962 --- /dev/null +++ b/docs/private/paramiko.SecurityOptions-class.html @@ -0,0 +1,373 @@ + + + + + paramiko.SecurityOptions + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class SecurityOptions +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SecurityOptions

+ +
+object --+
+         |
+        SecurityOptions
+

+ +
+ +

Simple object containing the security preferences of an ssh transport. +These are tuples of acceptable ciphers, digests, key types, and key +exchange algorithms, listed in order of preference.

+Changing the contents and/or order of these fields affects the +underlying Transport (but only if you change them +before starting the session). If you try to add an algorithm that +paramiko doesn't recognize, ValueError will be raised. If +you try to assign something besides a tuple to one of the fields, +TypeError will be raised. +
+ +

Since: ivysaur +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + transport) +
str +__repr__(self) +
+Returns a string representation of this object, for debugging.
 _get_ciphers(self) +
 _get_compression(self) +
 _get_digests(self) +
 _get_kex(self) +
 _get_key_types(self) +
 _set(self, + name, + orig, + x) +
 _set_ciphers(self, + x) +
 _set_compression(self, + x) +
 _set_digests(self, + x) +
 _set_kex(self, + x) +
 _set_key_types(self, + x) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + +
Property Summary
 ciphers: Symmetric encryption ciphers
 compression: Compression algorithms
 digests: Digest (one-way hash) algorithms
 kex: Key exchange algorithms
 key_types: Public-key algorithms

+ + + + + + + + + + +
Class Variable Summary
list__slots__ = ['ciphers', 'digests', 'key_types', 'kex', '... +
member_descriptor_transport = <member '_transport' of 'SecurityOptions' o... +

+ + + + + + +
Method Details
+ + +
+

__repr__(self) +
(Representation operator) +

+ Returns a string representation of this object, for debugging. +
+
Returns:
+
+ str +
+
+
Overrides:
+
__builtin__.object.__repr__
+
+
+
+
+ + + + + + +
Property Details
+
+ + +

ciphers

+Symmetric encryption ciphers +
+
+
+
+
Get Method:
+
_get_ciphers(self) +
+
Set Method:
+
_set_ciphers(self, + x) +
+
+
+
+ + +

compression

+Compression algorithms +
+
+
+
+
Get Method:
+
_get_compression(self) +
+
Set Method:
+
_set_compression(self, + x) +
+
+
+
+ + +

digests

+Digest (one-way hash) algorithms +
+
+
+
+
Get Method:
+
_get_digests(self) +
+
Set Method:
+
_set_digests(self, + x) +
+
+
+
+ + +

kex

+Key exchange algorithms +
+
+
+
+
Get Method:
+
_get_kex(self) +
+
Set Method:
+
_set_kex(self, + x) +
+
+
+
+ + +

key_types

+Public-key algorithms +
+
+
+
+
Get Method:
+
_get_key_types(self) +
+
Set Method:
+
_set_key_types(self, + x) +
+
+
+

+ + + + + + +
Class Variable Details
+
+ +

__slots__

+
+
+
+
+
Type:
+
+ list + +
+
Value:
+
+
+['ciphers', 'digests', 'key_types', 'kex', 'compression', '_transport'\
+]                                                                      
+
+
+
+
+
+ +

_transport

+
+
+
+
+
Type:
+
+ member_descriptor + +
+
Value:
+
+
+<member '_transport' of 'SecurityOptions' objects>                     
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.ServerInterface-class.html b/docs/private/paramiko.ServerInterface-class.html new file mode 100644 index 0000000..5cf358f --- /dev/null +++ b/docs/private/paramiko.ServerInterface-class.html @@ -0,0 +1,894 @@ + + + + + paramiko.ServerInterface + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class ServerInterface +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type ServerInterface

+ +
+object --+
+         |
+        ServerInterface
+

+ +
+ +

This class defines an interface for controlling the behavior of +paramiko in server mode.

+Methods on this class are called from paramiko's primary thread, so +you shouldn't do too much work in them. (Certainly nothing that blocks or +sleeps.) +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
int or InteractiveQuery +check_auth_interactive(self, + username, + submethods) +
+Begin an interactive authentication challenge, if supported.
int or InteractiveQuery +check_auth_interactive_response(self, + responses) +
+Continue or finish an interactive authentication challenge, if +supported.
int +check_auth_none(self, + username) +
+Determine if a client may open channels with no (further) +authentication.
int +check_auth_password(self, + username, + password) +
+Determine if a given username and password supplied by the client is +acceptable for use in authentication.
int +check_auth_publickey(self, + username, + key) +
+Determine if a given key supplied by the client is acceptable for use +in authentication.
bool +check_channel_exec_request(self, + channel, + command) +
+Determine if a shell command will be executed for the client.
bool +check_channel_pty_request(self, + channel, + term, + width, + height, + pixelwidth, + pixelheight, + modes) +
+Determine if a pseudo-terminal of the given dimensions (usually +requested for shell access) can be provided on the given channel.
int +check_channel_request(self, + kind, + chanid) +
+Determine if a channel request of a given type will be granted, and +return OPEN_SUCCEEDED or an error code.
bool +check_channel_shell_request(self, + channel) +
+Determine if a shell will be provided to the client on the given +channel.
bool +check_channel_subsystem_request(self, + channel, + name) +
+Determine if a requested subsystem will be provided to the client on +the given channel.
bool +check_channel_window_change_request(self, + channel, + width, + height, + pixelwidth, + pixelheight) +
+Determine if the pseudo-terminal on the given channel can be +resized.
bool +check_global_request(self, + kind, + msg) +
+Handle a global request of the given kind.
str +get_allowed_auths(self, + username) +
+Return a list of authentication methods supported by the server.
    Inherited from object
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for +signature
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + +
Method Details
+ + +
+

check_auth_interactive(self, + username, + submethods) +

+

Begin an interactive authentication challenge, if supported. You + should override this method in server mode if you want to support the + "keyboard-interactive" auth type, which requires + you to send a series of questions for the client to answer.

+

Return AUTH_FAILED if this auth method isn't + supported. Otherwise, you should return an InteractiveQuery object containing the + prompts and instructions for the user. The response will be sent via a + call to check_auth_interactive_response.

+ The default implementation always returns AUTH_FAILED. +
+
Parameters:
+
username - + the username of the authenticating client +
           + (type=str) +
submethods - + a comma-separated list of methods preferred by the client + (usually empty) +
           + (type=str) +
+
+
Returns:
+
+ AUTH_FAILED if this auth method + isn't supported; otherwise an object containing queries for the + user +
           + (type=int or InteractiveQuery) +
+
+
+
+ + +
+

check_auth_interactive_response(self, + responses) +

+

Continue or finish an interactive authentication challenge, if + supported. You should override this method in server mode if you want + to support the "keyboard-interactive" auth + type.

+

Return AUTH_FAILED if the responses are not + accepted, AUTH_SUCCESSFUL if the responses are + accepted and complete the authentication, or AUTH_PARTIALLY_SUCCESSFUL if your + authentication is stateful, and this set of responses is accepted for + authentication, but more authentication is required. (In this latter + case, get_allowed_auths will be called to + report to the client what options it has for continuing the + authentication.)

+

If you wish to continue interactive authentication with more + questions, you may return an InteractiveQuery object, which should + cause the client to respond with more answers, calling this method + again. This cycle can continue indefinitely.

+ The default implementation always returns AUTH_FAILED. +
+
Parameters:
+
responses - + list of responses from the client +
           + (type=list(str)) +
+
+
Returns:
+
+ AUTH_FAILED if the authentication + fails; AUTH_SUCCESSFUL if it succeeds; AUTH_PARTIALLY_SUCCESSFUL if the + interactive auth is successful, but authentication must continue; + otherwise an object containing queries for the user +
           + (type=int or InteractiveQuery) +
+
+
+
+ + +
+

check_auth_none(self, + username) +

+

Determine if a client may open channels with no (further) + authentication.

+

Return AUTH_FAILED if the client must + authenticate, or AUTH_SUCCESSFUL if it's okay for the + client to not authenticate.

+ The default implementation always returns AUTH_FAILED. +
+
Parameters:
+
username - + the username of the client. +
           + (type=str) +
+
+
Returns:
+
+ AUTH_FAILED if the authentication + fails; AUTH_SUCCESSFUL if it succeeds. +
           + (type=int) +
+
+
+
+ + +
+

check_auth_password(self, + username, + password) +

+

Determine if a given username and password supplied by the client is + acceptable for use in authentication.

+

Return AUTH_FAILED if the password is not + accepted, AUTH_SUCCESSFUL if the password is + accepted and completes the authentication, or AUTH_PARTIALLY_SUCCESSFUL if your + authentication is stateful, and this key is accepted for + authentication, but more authentication is required. (In this latter + case, get_allowed_auths will be called to + report to the client what options it has for continuing the + authentication.)

+ The default implementation always returns AUTH_FAILED. +
+
Parameters:
+
username - + the username of the authenticating client. +
           + (type=str) +
password - + the password given by the client. +
           + (type=str) +
+
+
Returns:
+
+ AUTH_FAILED if the authentication + fails; AUTH_SUCCESSFUL if it succeeds; AUTH_PARTIALLY_SUCCESSFUL if the + password auth is successful, but authentication must + continue. +
           + (type=int) +
+
+
+
+ + +
+

check_auth_publickey(self, + username, + key) +

+

Determine if a given key supplied by the client is acceptable for + use in authentication. You should override this method in server mode + to check the username and key and decide if you would accept a + signature made using this key.

+

Return AUTH_FAILED if the key is not accepted, + AUTH_SUCCESSFUL if the key is accepted + and completes the authentication, or AUTH_PARTIALLY_SUCCESSFUL if your + authentication is stateful, and this password is accepted for + authentication, but more authentication is required. (In this latter + case, get_allowed_auths will be called to + report to the client what options it has for continuing the + authentication.)

+

Note that you don't have to actually verify any key signtature here. + If you're willing to accept the key, paramiko will do the work of + verifying the client's signature.

+ The default implementation always returns AUTH_FAILED. +
+
Parameters:
+
username - + the username of the authenticating client +
           + (type=str) +
key - + the key object provided by the client +
           + (type=PKey) +
+
+
Returns:
+
+ AUTH_FAILED if the client can't + authenticate with this key; AUTH_SUCCESSFUL if it can; AUTH_PARTIALLY_SUCCESSFUL if it can + authenticate with this key but must continue with + authentication +
           + (type=int) +
+
+
+
+ + +
+

check_channel_exec_request(self, + channel, + command) +

+

Determine if a shell command will be executed for the client. If + this method returns True, the channel should be connected + to the stdin, stdout, and stderr of the shell command.

+ The default implementation always returns False. +
+
Parameters:
+
channel - + the Channel the request arrived on. +
           + (type=Channel) +
command - + the command to execute. +
           + (type=str) +
+
+
Returns:
+
+ True if this channel is now hooked up to the + stdin, stdout, and stderr of the executing command; + False if the command will not be executed. +
           + (type=bool) +
+
+

Since: 1.1 +

+ +
+
+ + +
+

check_channel_pty_request(self, + channel, + term, + width, + height, + pixelwidth, + pixelheight, + modes) +

+

Determine if a pseudo-terminal of the given dimensions (usually + requested for shell access) can be provided on the given channel.

+ The default implementation always returns False. +
+
Parameters:
+
channel - + the Channel the pty request arrived + on. +
           + (type=Channel) +
term - + type of terminal requested (for example, + "vt100"). +
           + (type=str) +
width - + width of screen in characters. +
           + (type=int) +
height - + height of screen in characters. +
           + (type=int) +
pixelwidth - + width of screen in pixels, if known (may be 0 if + unknown). +
           + (type=int) +
pixelheight - + height of screen in pixels, if known (may be 0 if + unknown). +
           + (type=int) +
+
+
Returns:
+
+ True if the psuedo-terminal has been allocated; + False otherwise. +
           + (type=bool) +
+
+
+
+ + +
+

check_channel_request(self, + kind, + chanid) +

+

Determine if a channel request of a given type will be granted, and + return OPEN_SUCCEEDED or an error code. This method is + called in server mode when the client requests a channel, after + authentication is complete.

+ If you allow channel requests (and an ssh server that didn't would + be useless), you should also override some of the channel request + methods below, which are used to determine which services will be + allowed on a given channel: + +

The chanid parameter is a small number that uniquely + identifies the channel within a Transport. A Channel object is not created unless this + method returns OPEN_SUCCEEDED -- once a Channel object is created, you can call + Channel.get_id to retrieve the channel + ID.

+ The return value should either be OPEN_SUCCEEDED (or + 0) to allow the channel request, or one of the following + error codes to reject it: +
    +
  • + OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED +
  • +
  • + OPEN_FAILED_CONNECT_FAILED +
  • +
  • + OPEN_FAILED_UNKNOWN_CHANNEL_TYPE +
  • +
  • + OPEN_FAILED_RESOURCE_SHORTAGE +
  • +
+ The default implementation always returns + OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED. +
+
Parameters:
+
kind - + the kind of channel the client would like to open (usually + "session"). +
           + (type=str) +
chanid - + ID of the channel +
           + (type=int) +
+
+
Returns:
+
+ a success or failure code (listed above) +
           + (type=int) +
+
+
+
+ + +
+

check_channel_shell_request(self, + channel) +

+

Determine if a shell will be provided to the client on the given + channel. If this method returns True, the channel should + be connected to the stdin/stdout of a shell (or something that acts + like a shell).

+ The default implementation always returns False. +
+
Parameters:
+
channel - + the Channel the request arrived on. +
           + (type=Channel) +
+
+
Returns:
+
+ True if this channel is now hooked up to a shell; + False if a shell can't or won't be provided. +
           + (type=bool) +
+
+
+
+ + +
+

check_channel_subsystem_request(self, + channel, + name) +

+

Determine if a requested subsystem will be provided to the client on + the given channel. If this method returns True, all future + I/O through this channel will be assumed to be connected to the + requested subsystem. An example of a subsystem is + sftp.

+ The default implementation checks for a subsystem handler assigned + via Transport.set_subsystem_handler. If one + has been set, the handler is invoked and this method returns + True. Otherwise it returns False. +
+
Parameters:
+
channel - + the Channel the pty request arrived + on. +
           + (type=Channel) +
name - + name of the requested subsystem. +
           + (type=str) +
+
+
Returns:
+
+ True if this channel is now hooked up to the + requested subsystem; False if that subsystem can't + or won't be provided. +
           + (type=bool) +
+
+

Note: Because the default implementation uses the Transport to identify valid subsystems, you +probably won't need to override this method. +

+ +
+
+ + +
+

check_channel_window_change_request(self, + channel, + width, + height, + pixelwidth, + pixelheight) +

+

Determine if the pseudo-terminal on the given channel can be + resized. This only makes sense if a pty was previously allocated on + it.

+ The default implementation always returns False. +
+
Parameters:
+
channel - + the Channel the pty request arrived + on. +
           + (type=Channel) +
width - + width of screen in characters. +
           + (type=int) +
height - + height of screen in characters. +
           + (type=int) +
pixelwidth - + width of screen in pixels, if known (may be 0 if + unknown). +
           + (type=int) +
pixelheight - + height of screen in pixels, if known (may be 0 if + unknown). +
           + (type=int) +
+
+
Returns:
+
+ True if the terminal was resized; + False if not. +
           + (type=bool) +
+
+
+
+ + +
+

check_global_request(self, + kind, + msg) +

+

Handle a global request of the given kind. This method + is called in server mode and client mode, whenever the remote host + makes a global request. If there are any arguments to the request, they + will be in msg.

+

There aren't any useful global requests defined, aside from port + forwarding, so usually this type of request is an extension to the + protocol.

+

If the request was successful and you would like to return + contextual data to the remote host, return a tuple. Items in the tuple + will be sent back with the successful result. (Note that the items in + the tuple can only be strings, ints, longs, or bools.)

+ The default implementation always returns False, + indicating that it does not support any global requests. +
+
Parameters:
+
kind - + the kind of global request being made. +
           + (type=str) +
msg - + any extra arguments to the request. +
           + (type=Message) +
+
+
Returns:
+
+ True or a tuple of data if the request was + granted; False otherwise. +
           + (type=bool) +
+
+
+
+ + +
+

get_allowed_auths(self, + username) +

+

Return a list of authentication methods supported by the server. + This list is sent to clients attempting to authenticate, to inform them + of authentication methods that might be successful.

+

The "list" is actually a string of comma-separated names + of types of authentication. Possible values are + "password", "publickey", + and "none".

+ The default implementation always returns + "password". +
+
Parameters:
+
username - + the username requesting authentication. +
           + (type=str) +
+
+
Returns:
+
+ a comma-separated list of authentication types +
           + (type=str) +
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.SubsystemHandler-class.html b/docs/private/paramiko.SubsystemHandler-class.html new file mode 100644 index 0000000..1d8116a --- /dev/null +++ b/docs/private/paramiko.SubsystemHandler-class.html @@ -0,0 +1,352 @@ + + + + + paramiko.SubsystemHandler + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class SubsystemHandler +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SubsystemHandler

+ +
+object --+        
+         |        
+  _Verbose --+    
+             |    
+        Thread --+
+                 |
+                SubsystemHandler
+

+ +
Known Subclasses:
+
+ SFTPServer
+ +
+ +

Handler for a subsytem in server mode. If you create a subclass of +this class and pass it to Transport.set_subsystem_handler, an object +of this class will be created for each request for this subsystem. Each +new object will be executed within its own new thread by calling start_subsystem. When that method +completes, the channel is closed.

+For example, if you made a subclass MP3Handler and +registered it as the handler for subsystem "mp3", +then whenever a client has successfully authenticated and requests +subsytem "mp3", an object of class +MP3Handler will be created, and start_subsystem will be called on it from a +new thread. +
+ +

Since: ivysaur +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + channel, + name, + server) +
+Create a new handler for a channel.
 finish_subsystem(self) +
+Perform any cleanup at the end of a subsystem.
ServerInterface +get_server(self) +
+Return the ServerInterface object associated with this +channel and subsystem.
 start_subsystem(self, + name, + transport, + channel) +
+Process an ssh subsystem in server mode.
 _run(self) +
    Inherited from Thread
 __repr__(self) +
 getName(self) +
 isAlive(self) +
 isDaemon(self) +
 join(self, + timeout) +
 run(self) +
 setDaemon(self, + daemonic) +
 setName(self, + name) +
 start(self) +
 _set_daemon(self) +
    Inherited from _Verbose
 _note(self, + format, + *args) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + +
Class Variable Summary
    Inherited from Thread
bool_Thread__initialized = False +

+ + + + + + +
Method Details
+ + +
+

__init__(self, + channel, + name, + server) +
(Constructor) +

+ Create a new handler for a channel. This is used by ServerInterface to start up a new handler + when a channel requests this subsystem. You don't need to override this + method, but if you do, be sure to pass the channel and + name parameters through to the original + __init__ method here. +
+
Parameters:
+
channel - + the channel associated with this subsystem request. +
           + (type=Channel) +
name - + name of the requested subsystem. +
           + (type=str) +
server - + the server object for the session that started this + subsystem +
           + (type=ServerInterface) +
+
+
Overrides:
+
threading.Thread.__init__
+
+
+
+ + +
+

finish_subsystem(self) +

+ Perform any cleanup at the end of a subsystem. The default + implementation just closes the channel. +
+

Since: 1.1 +

+ +
+
+ + +
+

get_server(self) +

+ Return the ServerInterface object associated with + this channel and subsystem. +
+
Returns:
+
+ ServerInterface +
+
+
+
+ + +
+

start_subsystem(self, + name, + transport, + channel) +

+

Process an ssh subsystem in server mode. This method is called on a + new object (and in a new thread) for each subsystem request. It is + assumed that all subsystem logic will take place here, and when the + subsystem is finished, this method will return. After this method + returns, the channel is closed.

+ The combination of transport and channel + are unique; this handler corresponds to exactly one Channel on one Transport. +
+
Parameters:
+
name - + name of the requested subsystem. +
           + (type=str) +
transport - + the server-mode Transport. +
           + (type=Transport) +
channel - + the channel associated with this subsystem request. +
           + (type=Channel) +
+
+

Note: It is the responsibility of this method to exit if the underlying Transport is closed. This can be done by +checking Transport.is_active or noticing an EOF on +the Channel. If this method loops forever +without checking for this case, your python interpreter may refuse to +exit because this thread will still be running. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.Transport-class.html b/docs/private/paramiko.Transport-class.html new file mode 100644 index 0000000..5b96b90 --- /dev/null +++ b/docs/private/paramiko.Transport-class.html @@ -0,0 +1,2151 @@ + + + + + paramiko.Transport + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class Transport +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type Transport

+ +
+object --+        
+         |        
+  _Verbose --+    
+             |    
+        Thread --+
+                 |
+                Transport
+

+ +
+ +An SSH Transport attaches to a stream (usually a socket), negotiates +an encrypted session, authenticates, and then creates stream tunnels, +called Channels, across the session. Multiple +channels can be multiplexed across a single session (and often are, in +the case of port forwardings). +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + sock) +
+Create a new SSH session over an existing socket, or socket-like +object.
 __del__(self) +
str +__repr__(self) +
+Returns a string representation of this object, for debugging.
Channel +accept(self, + timeout) +
+Return the next channel opened by the client over this transport, in +server mode.
 add_server_key(self, + key) +
+Add a host key to the list of keys used for server mode.
list +auth_interactive(self, + username, + handler, + submethods) +
+Authenticate to the server interactively.
list +auth_none(self, + username) +
+Try to authenticate to the server using no authentication at all.
list +auth_password(self, + username, + password, + event, + fallback) +
+Authenticate to the server using a password.
list +auth_publickey(self, + username, + key, + event) +
+Authenticate to the server using a private key.
 close(self) +
+Close this session, and any open channels that are tied to it.
 connect(self, + hostkey, + username, + password, + pkey) +
+Negotiate an SSH2 session, and optionally verify the server's host key +and authenticate using a password or private key.
Exception +get_exception(self) +
+Return any exception that happened during the last server request.
bool +get_hexdump(self) +
+Return True if the transport is currently logging hex +dumps of protocol traffic.
str +get_log_channel(self) +
+Return the channel name used for this transport's logging.
PKey +get_remote_server_key(self) +
+Return the host key of the server (in client mode).
SecurityOptions +get_security_options(self) +
+Return a SecurityOptions object which can be used to +tweak the encryption algorithms this transport will permit, and the order +of preference for them.
PKey +get_server_key(self) +
+Return the active host key, in server mode.
string +get_username(self) +
+Return the username this connection is authenticated for.
Message +global_request(self, + kind, + data, + wait) +
+Make a global request to the remote host.
bool +is_active(self) +
+Return true if this session is active (open).
bool +is_authenticated(self) +
+Return true if this session is active and authenticated.
bool +load_server_moduli(filename) +
+(optional) Load a file of prime moduli for use in doing +group-exchange key negotiation in server mode. (Static method) +
Channel +open_channel(self, + kind, + dest_addr, + src_addr) +
+Request a new channel to the server.
Channel +open_session(self) +
+Request a new channel to the server, of type +"session".
SFTPClient +open_sftp_client(self) +
+Create an SFTP client channel from an open transport.
bool +renegotiate_keys(self) +
+Force this session to switch to new keys.
 run(self) +
 send_ignore(self, + bytes) +
+Send a junk packet across the encrypted link.
 set_hexdump(self, + hexdump) +
+Turn on/off logging a hex dump of protocol traffic at DEBUG level in +the logs.
 set_keepalive(self, + interval) +
+Turn on/off keepalive packets (default is off).
 set_log_channel(self, + name) +
+Set the channel for this transport's logging.
 set_subsystem_handler(self, + name, + handler, + *larg, + **kwarg) +
+Set the handler class for a subsystem in server mode.
 start_client(self, + event) +
+Negotiate a new SSH2 session as a client.
 start_server(self, + event, + server) +
+Negotiate a new SSH2 session as a server.
 stop_thread(self) +
 use_compression(self, + compress) +
+Turn on/off compression.
 _activate_inbound(self) +
+switch on newly negotiated encryption parameters for inbound +traffic
 _activate_outbound(self) +
+switch on newly negotiated encryption parameters for outbound +traffic
 _auth_trigger(self) +
 _check_banner(self) +
 _compute_key(self, + id, + nbytes) +
+id is 'A' - 'F' for the various keys used by ssh
 _expect_packet(self, + type) +
+used by a kex object to register the next packet type it expects to +see
 _get_cipher(self, + name, + key, + iv) +
 _get_modulus_pack(self) +
+used by KexGex to find primes for group exchange
 _get_subsystem_handler(self, + name) +
 _log(self, + level, + msg) +
 _negotiate_keys(self, + m) +
 _parse_channel_open(self, + m) +
 _parse_channel_open_failure(self, + m) +
 _parse_channel_open_success(self, + m) +
 _parse_debug(self, + m) +
 _parse_disconnect(self, + m) +
 _parse_global_request(self, + m) +
 _parse_kex_init(self, + m) +
 _parse_newkeys(self, + m) +
 _parse_request_failure(self, + m) +
 _parse_request_success(self, + m) +
 _send_kex_init(self) +
+announce to the other side that we'd like to negotiate keys, and what +kind of key negotiation we support.
 _send_message(self, + data) +
 _send_user_message(self, + data) +
+send a message, but block if we're in key negotiation.
 _set_K_H(self, + k, + h) +
+used by a kex object to set the K (root key) and H (exchange hash)
 _unlink_channel(self, + chanid) +
+used by a Channel to remove itself from the active channel list
 _verify_key(self, + host_key, + sig) +
    Inherited from Thread
 getName(self) +
 isAlive(self) +
 isDaemon(self) +
 join(self, + timeout) +
 setDaemon(self, + daemonic) +
 setName(self, + name) +
 start(self) +
 _set_daemon(self) +
    Inherited from _Verbose
 _note(self, + format, + *args) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Class Variable Summary
dict_channel_handler_table = {96: <unbound method Channel._h... +
dict_cipher_info = {'blowfish-cbc': {'block-size': 8, 'key-s... +
str_CLIENT_ID = 'paramiko_1.5.2' +
dict_compression_info = {'none': (None, None), 'zlib': (<cla... +
dict_handler_table = {80: <function _parse_global_request at... +
dict_kex_info = {'diffie-hellman-group1-sha1': <class 'param... +
dict_key_info = {'ssh-dss': <class 'paramiko.DSSKey'>, 'ssh-... +
dict_mac_info = {'hmac-sha1': {'class': <module 'Crypto.Hash... +
NoneType_modulus_pack = None                                                                  
tuple_preferred_ciphers = ('aes128-cbc', 'blowfish-cbc', 'aes... +
tuple_preferred_compression = ('none',) +
tuple_preferred_kex = ('diffie-hellman-group1-sha1', 'diffie-... +
tuple_preferred_keys = ('ssh-rsa', 'ssh-dss') +
tuple_preferred_macs = ('hmac-sha1', 'hmac-md5', 'hmac-sha1-9... +
str_PROTO_ID = '2.0' +
    Inherited from Thread
bool_Thread__initialized = False +

+ + + + + + +
Instance Method Details
+ + +
+

__init__(self, + sock) +
(Constructor) +

+

Create a new SSH session over an existing socket, or socket-like + object. This only creates the Transport object; it doesn't begin the + SSH session yet. Use connect or start_client to begin a client session, + or start_server to begin a server + session.

+ If the object is not actually a socket, it must have the following + methods: +
    +
  • + send(str): Writes from 1 to len(str) + bytes, and returns an int representing the number of bytes written. + Returns 0 or raises EOFError if the stream has been + closed. +
  • +
  • + recv(int): Reads from 1 to int bytes + and returns them as a string. Returns 0 or raises + EOFError if the stream has been closed. +
  • +
  • + close(): Closes the socket. +
  • +
  • + settimeout(n): Sets a (float) timeout on I/O + operations. +
  • +
+ For ease of use, you may also pass in an address (as a tuple) or a + host string as the sock argument. (A host string is a + hostname with an optional port (separated by + ":") which will be converted into a tuple of + (hostname, port).) A socket will be connected to this + address and used for communication. Exceptions from the + socket call may be thrown in this case. +
+
Parameters:
+
sock - + a socket or socket-like object to create the session over. +
           + (type=socket) +
+
+
Overrides:
+
threading.Thread.__init__
+
+
+
+ + +
+

__repr__(self) +
(Representation operator) +

+ Returns a string representation of this object, for debugging. +
+
Returns:
+
+ str +
+
+
Overrides:
+
threading.Thread.__repr__
+
+
+
+ + +
+

accept(self, + timeout=None) +

+ Return the next channel opened by the client over this transport, in + server mode. If no channel is opened before the given timeout, + None is returned. +
+
Parameters:
+
timeout - + seconds to wait for a channel, or None to wait + forever +
           + (type=int) +
+
+
Returns:
+
+ a new Channel opened by the client +
           + (type=Channel) +
+
+
+
+ + +
+

add_server_key(self, + key) +

+ Add a host key to the list of keys used for server mode. When + behaving as a server, the host key is used to sign certain packets + during the SSH2 negotiation, so that the client can trust that we are + who we say we are. Because this is used for signing, the key must + contain private key info, not just the public half. Only one key of + each type (RSA or DSS) is kept. +
+
Parameters:
+
key - + the host key to add, usually an RSAKey or DSSKey. +
           + (type=PKey) +
+
+
+
+ + +
+

auth_interactive(self, + username, + handler, + submethods='') +

+

Authenticate to the server interactively. A handler is used to + answer arbitrary questions from the server. On many servers, this is + just a dumb wrapper around PAM.

+

This method will block until the authentication succeeds or fails, + peroidically calling the handler asynchronously to get answers to + authentication questions. The handler may be called more than once if + the server continues to ask questions.

+

The handler is expected to be a callable that will handle calls of + the form: handler(title, instructions, prompt_list). The + title is meant to be a dialog-window title, and the + instructions are user instructions (both are strings). + prompt_list will be a list of prompts, each prompt being a + tuple of (str, bool). The string is the prompt and the + boolean indicates whether the user text should be echoed.

+

A sample call would thus be: handler('title', 'instructions', + [('Password:', False)]).

+

The handler should return a list or tuple of answers to the server's + questions.

+ If the server requires multi-step authentication (which is very + rare), this method will return a list of auth types permissible for the + next step. Otherwise, in the normal case, an empty list is + returned. +
+
Parameters:
+
username - + the username to authenticate as +
           + (type=string) +
handler - + a handler for responding to server questions +
           + (type=callable) +
submethods - + a string list of desired submethods (optional) +
           + (type=str) +
+
+
Returns:
+
+ list of auth types permissible for the next stage of + authentication (normally empty). +
           + (type=list) +
+
+
Raises:
+
BadAuthenticationType - + if public-key authentication isn't allowed by the server for + this user +
SSHException - + if the authentication failed +
+

Since: 1.5 +

+ +
+
+ + +
+

auth_none(self, + username) +

+ Try to authenticate to the server using no authentication at all. + This will almost always fail. It may be useful for determining the list + of authentication types supported by the server, by catching the BadAuthenticationType exception + raised. +
+
Parameters:
+
username - + the username to authenticate as +
           + (type=string) +
+
+
Returns:
+
+ list of auth types permissible for the next stage of + authentication (normally empty) +
           + (type=list) +
+
+
Raises:
+
BadAuthenticationType - + if "none" authentication isn't allowed by the server + for this user +
SSHException - + if the authentication failed due to a network error +
+

Since: 1.5 +

+ +
+
+ + +
+

auth_password(self, + username, + password, + event=None, + fallback=True) +

+

Authenticate to the server using a password. The username and + password are sent over an encrypted link.

+

If an event is passed in, this method will return + immediately, and the event will be triggered once authentication + succeeds or fails. On success, is_authenticated will return + True. On failure, you may use get_exception to get more detailed error + information.

+

Since 1.1, if no event is passed, this method will block until the + authentication succeeds or fails. On failure, an exception is raised. + Otherwise, the method simply returns.

+

Since 1.5, if no event is passed and fallback is + True (the default), if the server doesn't support plain + password authentication but does support so-called + "keyboard-interactive" mode, an attempt will be made to + authenticate using this interactive mode. If it fails, the normal + exception will be thrown as if the attempt had never been made. This is + useful for some recent Gentoo and Debian distributions, which turn off + plain password authentication in a misguided belief that interactive + authentication is "more secure". (It's not.)

+ If the server requires multi-step authentication (which is very + rare), this method will return a list of auth types permissible for the + next step. Otherwise, in the normal case, an empty list is + returned. +
+
Parameters:
+
username - + the username to authenticate as +
           + (type=string) +
password - + the password to authenticate with +
           + (type=string) +
event - + an event to trigger when the authentication attempt is + complete (whether it was successful or not) +
           + (type=threading.Event) +
fallback - + True if an attempt at an automated + "interactive" password auth should be made if the + server doesn't support normal password auth +
           + (type=bool) +
+
+
Returns:
+
+ list of auth types permissible for the next stage of + authentication (normally empty) +
           + (type=list) +
+
+
Raises:
+
BadAuthenticationType - + if password authentication isn't allowed by the server for + this user (and no event was passed in) +
SSHException - + if the authentication failed (and no event was passed in) +
+
+
+ + +
+

auth_publickey(self, + username, + key, + event=None) +

+

Authenticate to the server using a private key. The key is used to + sign data from the server, so it must include the private part.

+

If an event is passed in, this method will return + immediately, and the event will be triggered once authentication + succeeds or fails. On success, is_authenticated will return + True. On failure, you may use get_exception to get more detailed error + information.

+

Since 1.1, if no event is passed, this method will block until the + authentication succeeds or fails. On failure, an exception is raised. + Otherwise, the method simply returns.

+ If the server requires multi-step authentication (which is very + rare), this method will return a list of auth types permissible for the + next step. Otherwise, in the normal case, an empty list is + returned. +
+
Parameters:
+
username - + the username to authenticate as +
           + (type=string) +
key - + the private key to authenticate with +
           + (type=PKey) +
event - + an event to trigger when the authentication attempt is + complete (whether it was successful or not) +
           + (type=threading.Event) +
+
+
Returns:
+
+ list of auth types permissible for the next stage of + authentication (normally empty). +
           + (type=list) +
+
+
Raises:
+
BadAuthenticationType - + if public-key authentication isn't allowed by the server for + this user (and no event was passed in). +
SSHException - + if the authentication failed (and no event was passed in). +
+
+
+ + +
+

close(self) +

+ Close this session, and any open channels that are tied to it. +
+
+
+ + +
+

connect(self, + hostkey=None, + username='', + password=None, + pkey=None) +

+

Negotiate an SSH2 session, and optionally verify the server's host + key and authenticate using a password or private key. This is a + shortcut for start_client, get_remote_server_key, and Transport.auth_password or Transport.auth_publickey. Use those + methods if you want more control.

+ You can use this method immediately after creating a Transport to + negotiate encryption with a server. If it fails, an exception will be + thrown. On success, the method will return cleanly, and an encrypted + session exists. You may immediately call open_channel or open_session to get a Channel object, which is used for data + transfer. +
+
Parameters:
+
hostkey - + the host key expected from the server, or None if + you don't want to do host key verification. +
           + (type=PKey) +
username - + the username to authenticate as. +
           + (type=str) +
password - + a password to use for authentication, if you want to use + password authentication; otherwise None. +
           + (type=str) +
pkey - + a private key to use for authentication, if you want to use + private key authentication; otherwise None. +
           + (type=PKey) +
+
+
Raises:
+
SSHException - + if the SSH2 negotiation fails, the host key supplied by the + server is incorrect, or authentication fails. +
+

Note: If you fail to supply a password or private key, this method may +succeed, but a subsequent open_channel or open_session call may fail because you +haven't authenticated yet. +

+ +

Since: doduo +

+ +
+
+ + +
+

get_exception(self) +

+ Return any exception that happened during the last server request. + This can be used to fetch more specific error information after using + calls like start_client. The exception (if any) is + cleared after this call. +
+
Returns:
+
+ an exception, or None if there is no stored + exception. +
           + (type=Exception) +
+
+

Since: 1.1 +

+ +
+
+ + +
+

get_hexdump(self) +

+ Return True if the transport is currently logging hex + dumps of protocol traffic. +
+
Returns:
+
+ True if hex dumps are being logged +
           + (type=bool) +
+
+

Since: 1.4 +

+ +
+
+ + +
+

get_log_channel(self) +

+ Return the channel name used for this transport's logging. +
+
Returns:
+
+ channel name. +
           + (type=str) +
+
+

Since: 1.2 +

+ +
+
+ + +
+

get_remote_server_key(self) +

+ Return the host key of the server (in client mode). +
+
Returns:
+
+ public key of the remote server. +
           + (type=PKey) +
+
+
Raises:
+
SSHException - + if no session is currently active. +
+

Note: Previously this call returned a tuple of (key type, key string). You +can get the same effect by calling PKey.get_name for the key type, and +str(key) for the key string. +

+ +
+
+ + +
+

get_security_options(self) +

+ Return a SecurityOptions object which can be used + to tweak the encryption algorithms this transport will permit, and the + order of preference for them. +
+
Returns:
+
+ an object that can be used to change the preferred algorithms + for encryption, digest (hash), public key, and key exchange. +
           + (type=SecurityOptions) +
+
+

Since: ivysaur +

+ +
+
+ + +
+

get_server_key(self) +

+ Return the active host key, in server mode. After negotiating with + the client, this method will return the negotiated host key. If only + one type of host key was set with add_server_key, that's the only key that + will ever be returned. But in cases where you have set more than one + type of host key (for example, an RSA key and a DSS key), the key type + will be negotiated by the client, and this method will return the key + of the type agreed on. If the host key has not been negotiated yet, + None is returned. In client mode, the behavior is + undefined. +
+
Returns:
+
+ host key of the type negotiated by the client, or + None. +
           + (type=PKey) +
+
+
+
+ + +
+

get_username(self) +

+ Return the username this connection is authenticated for. If the + session is not authenticated (or authentication failed), this method + returns None. +
+
Returns:
+
+ username that was authenticated, or None. +
           + (type=string) +
+
+

Since: fearow +

+ +
+
+ + +
+

global_request(self, + kind, + data=None, + wait=True) +

+ Make a global request to the remote host. These are normally + extensions to the SSH2 protocol. +
+
Parameters:
+
kind - + name of the request. +
           + (type=str) +
data - + an optional tuple containing additional data to attach to the + request. +
           + (type=tuple) +
wait - + True if this method should not return until a + response is received; False otherwise. +
           + (type=bool) +
+
+
Returns:
+
+ a Message containing possible + additional data if the request was successful (or an empty Message if wait was + False); None if the request was + denied. +
           + (type=Message) +
+
+

Since: fearow +

+ +
+
+ + +
+

is_active(self) +

+ Return true if this session is active (open). +
+
Returns:
+
+ True if the session is still active (open); False if the + session is closed. +
           + (type=bool) +
+
+
+
+ + +
+

is_authenticated(self) +

+ Return true if this session is active and authenticated. +
+
Returns:
+
+ True if the session is still open and has been authenticated + successfully; False if authentication failed and/or the session + is closed. +
           + (type=bool) +
+
+
+
+ + +
+

open_channel(self, + kind, + dest_addr=None, + src_addr=None) +

+ Request a new channel to the server. Channels are socket-like objects used for + the actual transfer of data across the session. You may only request a + channel after negotiating encryption (using connect or start_client) and authenticating. +
+
Parameters:
+
kind - + the kind of channel requested (usually + "session", + "forwarded-tcpip" or + "direct-tcpip"). +
           + (type=str) +
dest_addr - + the destination address of this port forwarding, if + kind is "forwarded-tcpip" or + "direct-tcpip" (ignored for other channel + types). +
           + (type=(str, int)) +
src_addr - + the source address of this port forwarding, if + kind is "forwarded-tcpip" or + "direct-tcpip". +
           + (type=(str, int)) +
+
+
Returns:
+
+ a new Channel on success, or + None if the request is rejected or the session ends + prematurely. +
           + (type=Channel) +
+
+
+
+ + +
+

open_session(self) +

+ Request a new channel to the server, of type + "session". This is just an alias for + open_channel('session'). +
+
Returns:
+
+ a new Channel on success, or + None if the request is rejected or the session ends + prematurely. +
           + (type=Channel) +
+
+
+
+ + +
+

open_sftp_client(self) +

+ Create an SFTP client channel from an open transport. On success, an + SFTP session will be opened with the remote host, and a new SFTPClient + object will be returned. +
+
Returns:
+
+ a new SFTPClient object, referring to an + sftp session (channel) across this transport +
           + (type=SFTPClient) +
+
+
+
+ + +
+

renegotiate_keys(self) +

+ Force this session to switch to new keys. Normally this is done + automatically after the session hits a certain number of packets or + bytes sent or received, but this method gives you the option of forcing + new keys whenever you want. Negotiating new keys causes a pause in + traffic both ways as the two sides swap keys and do computations. This + method returns when the session has switched to new keys, or the + session has died mid-negotiation. +
+
Returns:
+
+ True if the renegotiation was successful, and the link is + using new keys; False if the session dropped during + renegotiation. +
           + (type=bool) +
+
+
+
+ + +
+

send_ignore(self, + bytes=None) +

+ Send a junk packet across the encrypted link. This is sometimes used + to add "noise" to a connection to confuse would-be attackers. + It can also be used as a keep-alive for long lived connections + traversing firewalls. +
+
Parameters:
+
bytes - + the number of random bytes to send in the payload of the + ignored packet -- defaults to a random number from 10 to 41. +
           + (type=int) +
+
+

Since: fearow +

+ +
+
+ + +
+

set_hexdump(self, + hexdump) +

+ Turn on/off logging a hex dump of protocol traffic at DEBUG level in + the logs. Normally you would want this off (which is the default), but + if you are debugging something, it may be useful. +
+
Parameters:
+
hexdump - + True to log protocol traffix (in hex) to the log; + False otherwise. +
           + (type=bool) +
+
+
+
+ + +
+

set_keepalive(self, + interval) +

+ Turn on/off keepalive packets (default is off). If this is set, + after interval seconds without sending any data over the + connection, a "keepalive" packet will be sent (and ignored by + the remote host). This can be useful to keep connections alive over a + NAT, for example. +
+
Parameters:
+
interval - + seconds to wait before sending a keepalive packet (or 0 to + disable keepalives). +
           + (type=int) +
+
+

Since: fearow +

+ +
+
+ + +
+

set_log_channel(self, + name) +

+ Set the channel for this transport's logging. The default is + "paramiko.transport" but it can be set to + anything you want. (See the logging module for more info.) + SSH Channels will log to a sub-channel of the one specified. +
+
Parameters:
+
name - + new channel name for logging. +
           + (type=str) +
+
+

Since: 1.1 +

+ +
+
+ + +
+

set_subsystem_handler(self, + name, + handler, + *larg, + **kwarg) +

+

Set the handler class for a subsystem in server mode. If a request + for this subsystem is made on an open ssh channel later, this handler + will be constructed and called -- see SubsystemHandler for more detailed + documentation.

+ Any extra parameters (including keyword arguments) are saved and + passed to the SubsystemHandler constructor later. +
+
Parameters:
+
name - + name of the subsystem. +
           + (type=str) +
handler - + subclass of SubsystemHandler that handles this + subsystem. +
           + (type=class) +
+
+
+
+ + +
+

start_client(self, + event=None) +

+

Negotiate a new SSH2 session as a client. This is the first step + after creating a new Transport. A separate thread is created + for protocol negotiation.

+

If an event is passed in, this method returns immediately. When + negotiation is done (successful or not), the given Event + will be triggered. On failure, is_active will return + False.

+

(Since 1.4) If event is None, this method + will not return until negotation is done. On success, the method + returns normally. Otherwise an SSHException is raised.

+ After a successful negotiation, you will usually want to + authenticate, calling auth_password or auth_publickey. +
+
Parameters:
+
event - + an event to trigger when negotiation is complete + (optional) +
           + (type=threading.Event) +
+
+
Raises:
+
SSHException - + if negotiation fails (and no event was passed + in) +
+

Notes: +

    +
  • connect is a simpler method for connecting +as a client. +
  • +
  • After calling this method (or start_server or connect), you should no longer directly +read from or write to the original socket object. + +
  • +

+ +
+
+ + +
+

start_server(self, + event=None, + server=None) +

+

Negotiate a new SSH2 session as a server. This is the first step + after creating a new Transport and setting up your server host + key(s). A separate thread is created for protocol negotiation.

+

If an event is passed in, this method returns immediately. When + negotiation is done (successful or not), the given Event + will be triggered. On failure, is_active will return + False.

+

(Since 1.4) If event is None, this method + will not return until negotation is done. On success, the method + returns normally. Otherwise an SSHException is raised.

+

After a successful negotiation, the client will need to + authenticate. Override the methods get_allowed_auths, check_auth_none, check_auth_password, and check_auth_publickey in the given + server object to control the authentication process.

+ After a successful authentication, the client should request to open + a channel. Override check_channel_request in the given + server object to allow channels to be opened. +
+
Parameters:
+
event - + an event to trigger when negotiation is complete. +
           + (type=threading.Event) +
server - + an object used to perform authentication and create Channels. +
           + (type=server.ServerInterface) +
+
+
Raises:
+
SSHException - + if negotiation fails (and no event was passed + in) +
+

Note: After calling this method (or start_client or connect), you should no longer directly +read from or write to the original socket object. +

+ +
+
+ + +
+

use_compression(self, + compress=True) +

+ Turn on/off compression. This will only have an affect before + starting the transport (ie before calling connect, etc). By default, compression is + off since it negatively affects interactive sessions and is not fully + tested. +
+
Parameters:
+
compress - + True to ask the remote client/server to compress + traffic; False to refuse compression +
           + (type=bool) +
+
+

Since: 1.5.2 +

+ +
+
+ + +
+

_activate_inbound(self) +

+ switch on newly negotiated encryption parameters for inbound + traffic +
+
+
+ + +
+

_activate_outbound(self) +

+ switch on newly negotiated encryption parameters for outbound + traffic +
+
+
+ + +
+

_compute_key(self, + id, + nbytes) +

+ id is 'A' - 'F' for the various keys used by ssh +
+
+
+ + +
+

_expect_packet(self, + type) +

+ used by a kex object to register the next packet type it expects to + see +
+
+
+ + +
+

_get_modulus_pack(self) +

+ used by KexGex to find primes for group exchange +
+
+
+ + +
+

_send_kex_init(self) +

+ announce to the other side that we'd like to negotiate keys, and + what kind of key negotiation we support. +
+
+
+ + +
+

_send_user_message(self, + data) +

+ send a message, but block if we're in key negotiation. this is used + for user-initiated requests. +
+
+
+ + +
+

_set_K_H(self, + k, + h) +

+ used by a kex object to set the K (root key) and H (exchange + hash) +
+
+
+ + +
+

_unlink_channel(self, + chanid) +

+ used by a Channel to remove itself from the active channel list +
+
+
+
+ + + + + + +
Static Method Details
+ + +
+

load_server_moduli(filename=None) +

+

(optional) Load a file of prime moduli for use in doing + group-exchange key negotiation in server mode. It's a rather obscure + option and can be safely ignored.

+ In server mode, the remote client may request + "group-exchange" key negotiation, which asks the server to + send a random prime number that fits certain criteria. These primes are + pretty difficult to compute, so they can't be generated on demand. But + many systems contain a file of suitable primes (usually named something + like /etc/ssh/moduli). If you call + load_server_moduli and it returns True, then + this file of primes has been loaded and we will support + "group-exchange" in server mode. Otherwise server mode will + just claim that it doesn't support that method of key negotiation. +
+
Parameters:
+
filename - + optional path to the moduli file, if you happen to know that + it's not in a standard location. +
           + (type=str) +
+
+
Returns:
+
+ True if a moduli file was successfully loaded; False + otherwise. +
           + (type=bool) +
+
+

Note: This has no effect when used in client mode. +

+ +

Since: doduo +

+ +
+
+
+ + + + + + +
Class Variable Details
+
+ +

_channel_handler_table

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{93: <unbound method Channel._window_adjust>,
+ 94: <unbound method Channel._feed>,
+ 95: <unbound method Channel._feed_extended>,
+ 96: <unbound method Channel._handle_eof>,
+ 97: <unbound method Channel._handle_close>,
+ 98: <unbound method Channel._handle_request>,
+ 99: <unbound method Channel._request_success>,
+ 100: <unbound method Channel._request_failed>}                        
+
+
+
+
+
+ +

_cipher_info

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{'3des-cbc': {'block-size': 8,
+              'class': <module 'Crypto.Cipher.DES3' from '/usr/lib/pyt\
+hon2.4/site-packages/Crypto/Cipher/DES3.so'>,
+              'key-size': 24,
+              'mode': 2},
+ 'aes128-cbc': {'block-size': 16,
+                'class': <module 'Crypto.Cipher.AES' from '/usr/lib/py\
+thon2.4/site-packages/Crypto/Cipher/AES.so'>,
+...                                                                    
+
+
+
+
+
+ +

_CLIENT_ID

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'paramiko_1.5.2'                                                       
+
+
+
+
+
+ +

_compression_info

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{'none': (None, None),
+ 'zlib': (<class 'paramiko.compress.ZlibCompressor'>,
+          <class 'paramiko.compress.ZlibDecompressor'>),
+ 'zlib@openssh.com': (<class 'paramiko.compress.ZlibCompressor'>,
+                      <class 'paramiko.compress.ZlibDecompressor'>)}   
+
+
+
+
+
+ +

_handler_table

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{20: <function _negotiate_keys at 0xb7b13dbc>,
+ 21: <function _parse_newkeys at 0xb7b13f44>,
+ 80: <function _parse_global_request at 0xb7b13fb4>,
+ 81: <function _parse_request_success at 0xb7b1e02c>,
+ 82: <function _parse_request_failure at 0xb7b1e064>,
+ 90: <function _parse_channel_open at 0xb7b1e10c>,
+ 91: <function _parse_channel_open_success at 0xb7b1e09c>,
+ 92: <function _parse_channel_open_failure at 0xb7b1e0d4>}             
+
+
+
+
+
+ +

_kex_info

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{'diffie-hellman-group-exchange-sha1': <class 'paramiko.kex_gex.KexGex\
+'>,
+ 'diffie-hellman-group1-sha1': <class 'paramiko.kex_group1.KexGroup1'>\
+}                                                                      
+
+
+
+
+
+ +

_key_info

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{'ssh-dss': <class 'paramiko.DSSKey'>, 'ssh-rsa': <class 'paramiko.RSA\
+Key'>}                                                                 
+
+
+
+
+
+ +

_mac_info

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{'hmac-md5': {'class': <module 'Crypto.Hash.MD5' from '/usr/lib/python\
+2.4/site-packages/Crypto/Hash/MD5.pyc'>,
+              'size': 16},
+ 'hmac-md5-96': {'class': <module 'Crypto.Hash.MD5' from '/usr/lib/pyt\
+hon2.4/site-packages/Crypto/Hash/MD5.pyc'>,
+                 'size': 12},
+ 'hmac-sha1': {'class': <module 'Crypto.Hash.SHA' from '/usr/lib/pytho\
+n2.4/site-packages/Crypto/Hash/SHA.pyc'>,
+...                                                                    
+
+
+
+
+
+ +

_modulus_pack

+
+
+
+
+
Type:
+
+ NoneType + +
+
Value:
+
+
+None                                                                  
+
+
+
+
+
+ +

_preferred_ciphers

+
+
+
+
+
Type:
+
+ tuple + +
+
Value:
+
+
+('aes128-cbc', 'blowfish-cbc', 'aes256-cbc', '3des-cbc')               
+
+
+
+
+
+ +

_preferred_compression

+
+
+
+
+
Type:
+
+ tuple + +
+
Value:
+
+
+('none',)                                                              
+
+
+
+
+
+ +

_preferred_kex

+
+
+
+
+
Type:
+
+ tuple + +
+
Value:
+
+
+('diffie-hellman-group1-sha1', 'diffie-hellman-group-exchange-sha1')   
+
+
+
+
+
+ +

_preferred_keys

+
+
+
+
+
Type:
+
+ tuple + +
+
Value:
+
+
+('ssh-rsa', 'ssh-dss')                                                 
+
+
+
+
+
+ +

_preferred_macs

+
+
+
+
+
Type:
+
+ tuple + +
+
Value:
+
+
+('hmac-sha1', 'hmac-md5', 'hmac-sha1-96', 'hmac-md5-96')               
+
+
+
+
+
+ +

_PROTO_ID

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'2.0'                                                                  
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.agent-module.html b/docs/private/paramiko.agent-module.html new file mode 100644 index 0000000..889d9ea --- /dev/null +++ b/docs/private/paramiko.agent-module.html @@ -0,0 +1,164 @@ + + + + + paramiko.agent + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module agent +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.agent

+ +SSH Agent interface for Unix clients. +
+ + + + + + + + + + + + + +
Variable Summary
intSSH2_AGENT_IDENTITIES_ANSWER = 12                                                                    
intSSH2_AGENT_SIGN_RESPONSE = 14                                                                    
intSSH2_AGENTC_REQUEST_IDENTITIES = 11                                                                    
intSSH2_AGENTC_SIGN_REQUEST = 13                                                                    

+ + + + + + +
Variable Details
+
+ +

SSH2_AGENT_IDENTITIES_ANSWER

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+12                                                                    
+
+
+
+
+
+ +

SSH2_AGENT_SIGN_RESPONSE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+14                                                                    
+
+
+
+
+
+ +

SSH2_AGENTC_REQUEST_IDENTITIES

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+11                                                                    
+
+
+
+
+
+ +

SSH2_AGENTC_SIGN_REQUEST

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+13                                                                    
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.auth_handler-module.html b/docs/private/paramiko.auth_handler-module.html new file mode 100644 index 0000000..464b764 --- /dev/null +++ b/docs/private/paramiko.auth_handler-module.html @@ -0,0 +1,62 @@ + + + + + paramiko.auth_handler + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module auth_handler +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.auth_handler

+ +AuthHandler +
+ + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.ber-module.html b/docs/private/paramiko.ber-module.html new file mode 100644 index 0000000..03d907b --- /dev/null +++ b/docs/private/paramiko.ber-module.html @@ -0,0 +1,79 @@ + + + + + paramiko.ber + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module ber +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.ber

+ + + + + + + + +
Classes
+ BERRobey's tiny little attempt at a BER decoder.

+ + + + + + + + +
Exceptions
+ BERException 

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.ber.BER-class.html b/docs/private/paramiko.ber.BER-class.html new file mode 100644 index 0000000..79b10ba --- /dev/null +++ b/docs/private/paramiko.ber.BER-class.html @@ -0,0 +1,145 @@ + + + + + paramiko.ber.BER + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module ber :: + Class BER +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type BER

+ +
+object --+
+         |
+        BER
+

+ +
+ +Robey's tiny little attempt at a BER decoder. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + content) +
 __repr__(self) +
 __str__(self) +
 decode(self) +
 decode_next(self) +
 decode_sequence(data) +
+ (Static method) +
 encode(self, + x) +
 encode_sequence(data) +
+ (Static method) +
 encode_tlv(self, + ident, + val) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.ber.BERException-class.html b/docs/private/paramiko.ber.BERException-class.html new file mode 100644 index 0000000..9ae6fff --- /dev/null +++ b/docs/private/paramiko.ber.BERException-class.html @@ -0,0 +1,86 @@ + + + + + paramiko.ber.BERException + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module ber :: + Class BERException +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class BERException

+ +
+Exception --+
+            |
+           BERException
+

+ +
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.channel-module.html b/docs/private/paramiko.channel-module.html new file mode 100644 index 0000000..bf3adc0 --- /dev/null +++ b/docs/private/paramiko.channel-module.html @@ -0,0 +1,71 @@ + + + + + paramiko.channel + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module channel +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.channel

+ +Abstraction for an SSH2 channel. +
+ + + + + + + +
Classes
+ ChannelStderrFile 

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.channel.ChannelStderrFile-class.html b/docs/private/paramiko.channel.ChannelStderrFile-class.html new file mode 100644 index 0000000..646d24a --- /dev/null +++ b/docs/private/paramiko.channel.ChannelStderrFile-class.html @@ -0,0 +1,282 @@ + + + + + paramiko.channel.ChannelStderrFile + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module channel :: + Class ChannelStderrFile +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type ChannelStderrFile

+ +
+  object --+        
+           |        
+BufferedFile --+    
+               |    
+     ChannelFile --+
+                   |
+                  ChannelStderrFile
+

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + channel, + mode, + bufsize) +
 _read(self, + size) +
+(subclass override) Read data from the stream.
 _write(self, + data) +
+(subclass override) Write data into the stream.
    Inherited from ChannelFile
str +__repr__(self) +
+Returns a string representation of this object, for debugging.
 seek(self, + offset, + whence) +
+Set the file's current position, like stdio's fseek.
    Inherited from BufferedFile
 __del__(self) +
iterator +__iter__(self) +
+Returns an iterator that can be used to iterate over the lines in this +file.
 close(self) +
+Close the file.
 flush(self) +
+Write out any data in the write buffer.
str +next(self) +
+Returns the next line from the input, or raises +StopIteration when EOF is hit.
str +read(self, + size) +
+Read at most size bytes from the file (less if we hit the +end of the file first).
str +readline(self, + size) +
+Read one entire line from the file.
list +readlines(self, + sizehint) +
+Read all remaining lines using readline and return them as a list.
int +tell(self) +
+Return the file's current position.
 write(self, + data) +
+Write data to the file.
 writelines(self, + sequence) +
+Write a sequence of strings to the file.
iterator +xreadlines(self) +
+Identical to iter(f).
 _get_size(self) +
+(subclass override) Return the size of the file.
 _record_newline(self, + newline) +
 _set_mode(self, + mode, + bufsize) +
+Subclasses call this method to initialize the BufferedFile.
 _write_all(self, + data) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + + + + + + +
Class Variable Summary
    Inherited from BufferedFile
intSEEK_CUR = 1                                                                     
intSEEK_END = 2                                                                     
intSEEK_SET = 0                                                                     
int_DEFAULT_BUFSIZE = 8192                                                                  

+ + + + + + +
Method Details
+ + +
+

_read(self, + size) +

+ (subclass override) Read data from the stream. Return + None or raise EOFError to indicate EOF. +
+
Overrides:
+
paramiko.ChannelFile._read (inherited documentation) +
+
+
+
+ + +
+

_write(self, + data) +

+ (subclass override) Write data into the stream. +
+
Overrides:
+
paramiko.ChannelFile._write (inherited documentation) +
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:46 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.common-module.html b/docs/private/paramiko.common-module.html new file mode 100644 index 0000000..5422192 --- /dev/null +++ b/docs/private/paramiko.common-module.html @@ -0,0 +1,1013 @@ + + + + + paramiko.common + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module common +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.common

+ +Common constants and global variables. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Variable Summary
intAUTH_FAILED = 2                                                                     
intAUTH_PARTIALLY_SUCCESSFUL = 1                                                                     
intAUTH_SUCCESSFUL = 0                                                                     
dictCONNECTION_FAILED_CODE = {1: 'Administratively prohibite... +
intCRITICAL = 50                                                                    
intDEBUG = 10                                                                    
intDISCONNECT_AUTH_CANCELLED_BY_USER = 13                                                                    
intDISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE = 14                                                                    
intDISCONNECT_SERVICE_NOT_AVAILABLE = 7                                                                     
intERROR = 40                                                                    
intINFO = 20                                                                    
intMSG_CHANNEL_CLOSE = 97                                                                    
intMSG_CHANNEL_DATA = 94                                                                    
intMSG_CHANNEL_EOF = 96                                                                    
intMSG_CHANNEL_EXTENDED_DATA = 95                                                                    
intMSG_CHANNEL_FAILURE = 100                                                                   
intMSG_CHANNEL_OPEN = 90                                                                    
intMSG_CHANNEL_OPEN_FAILURE = 92                                                                    
intMSG_CHANNEL_OPEN_SUCCESS = 91                                                                    
intMSG_CHANNEL_REQUEST = 98                                                                    
intMSG_CHANNEL_SUCCESS = 99                                                                    
intMSG_CHANNEL_WINDOW_ADJUST = 93                                                                    
intMSG_DEBUG = 4                                                                     
intMSG_DISCONNECT = 1                                                                     
intMSG_GLOBAL_REQUEST = 80                                                                    
intMSG_IGNORE = 2                                                                     
intMSG_KEXINIT = 20                                                                    
dictMSG_NAMES = {1: 'disconnect', 2: 'ignore', 3: 'unimpleme... +
intMSG_NEWKEYS = 21                                                                    
intMSG_REQUEST_FAILURE = 82                                                                    
intMSG_REQUEST_SUCCESS = 81                                                                    
intMSG_SERVICE_ACCEPT = 6                                                                     
intMSG_SERVICE_REQUEST = 5                                                                     
intMSG_UNIMPLEMENTED = 3                                                                     
intMSG_USERAUTH_BANNER = 53                                                                    
intMSG_USERAUTH_FAILURE = 51                                                                    
intMSG_USERAUTH_INFO_REQUEST = 60                                                                    
intMSG_USERAUTH_INFO_RESPONSE = 61                                                                    
intMSG_USERAUTH_PK_OK = 60                                                                    
intMSG_USERAUTH_REQUEST = 50                                                                    
intMSG_USERAUTH_SUCCESS = 52                                                                    
intWARNING = 30                                                                    

+ + + + + + +
Variable Details
+
+ +

AUTH_FAILED

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ +

AUTH_PARTIALLY_SUCCESSFUL

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1                                                                     
+
+
+
+
+
+ +

AUTH_SUCCESSFUL

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+0                                                                     
+
+
+
+
+
+ +

CONNECTION_FAILED_CODE

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{1: 'Administratively prohibited',
+ 2: 'Connect failed',
+ 3: 'Unknown channel type',
+ 4: 'Resource shortage'}                                               
+
+
+
+
+
+ +

CRITICAL

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+50                                                                    
+
+
+
+
+
+ +

DEBUG

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+10                                                                    
+
+
+
+
+
+ +

DISCONNECT_AUTH_CANCELLED_BY_USER

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+13                                                                    
+
+
+
+
+
+ +

DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+14                                                                    
+
+
+
+
+
+ +

DISCONNECT_SERVICE_NOT_AVAILABLE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+7                                                                     
+
+
+
+
+
+ +

ERROR

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+40                                                                    
+
+
+
+
+
+ +

INFO

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+20                                                                    
+
+
+
+
+
+ +

MSG_CHANNEL_CLOSE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+97                                                                    
+
+
+
+
+
+ +

MSG_CHANNEL_DATA

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+94                                                                    
+
+
+
+
+
+ +

MSG_CHANNEL_EOF

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+96                                                                    
+
+
+
+
+
+ +

MSG_CHANNEL_EXTENDED_DATA

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+95                                                                    
+
+
+
+
+
+ +

MSG_CHANNEL_FAILURE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+100                                                                   
+
+
+
+
+
+ +

MSG_CHANNEL_OPEN

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+90                                                                    
+
+
+
+
+
+ +

MSG_CHANNEL_OPEN_FAILURE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+92                                                                    
+
+
+
+
+
+ +

MSG_CHANNEL_OPEN_SUCCESS

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+91                                                                    
+
+
+
+
+
+ +

MSG_CHANNEL_REQUEST

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+98                                                                    
+
+
+
+
+
+ +

MSG_CHANNEL_SUCCESS

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+99                                                                    
+
+
+
+
+
+ +

MSG_CHANNEL_WINDOW_ADJUST

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+93                                                                    
+
+
+
+
+
+ +

MSG_DEBUG

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+4                                                                     
+
+
+
+
+
+ +

MSG_DISCONNECT

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1                                                                     
+
+
+
+
+
+ +

MSG_GLOBAL_REQUEST

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+80                                                                    
+
+
+
+
+
+ +

MSG_IGNORE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ +

MSG_KEXINIT

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+20                                                                    
+
+
+
+
+
+ +

MSG_NAMES

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{1: 'disconnect',
+ 2: 'ignore',
+ 3: 'unimplemented',
+ 4: 'debug',
+ 5: 'service-request',
+ 6: 'service-accept',
+ 20: 'kexinit',
+ 21: 'newkeys',
+...                                                                    
+
+
+
+
+
+ +

MSG_NEWKEYS

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+21                                                                    
+
+
+
+
+
+ +

MSG_REQUEST_FAILURE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+82                                                                    
+
+
+
+
+
+ +

MSG_REQUEST_SUCCESS

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+81                                                                    
+
+
+
+
+
+ +

MSG_SERVICE_ACCEPT

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+6                                                                     
+
+
+
+
+
+ +

MSG_SERVICE_REQUEST

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+5                                                                     
+
+
+
+
+
+ +

MSG_UNIMPLEMENTED

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+3                                                                     
+
+
+
+
+
+ +

MSG_USERAUTH_BANNER

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+53                                                                    
+
+
+
+
+
+ +

MSG_USERAUTH_FAILURE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+51                                                                    
+
+
+
+
+
+ +

MSG_USERAUTH_INFO_REQUEST

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+60                                                                    
+
+
+
+
+
+ +

MSG_USERAUTH_INFO_RESPONSE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+61                                                                    
+
+
+
+
+
+ +

MSG_USERAUTH_PK_OK

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+60                                                                    
+
+
+
+
+
+ +

MSG_USERAUTH_REQUEST

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+50                                                                    
+
+
+
+
+
+ +

MSG_USERAUTH_SUCCESS

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+52                                                                    
+
+
+
+
+
+ +

WARNING

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+30                                                                    
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.compress-module.html b/docs/private/paramiko.compress-module.html new file mode 100644 index 0000000..aa60bc4 --- /dev/null +++ b/docs/private/paramiko.compress-module.html @@ -0,0 +1,74 @@ + + + + + paramiko.compress + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module compress +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.compress

+ +Compression implementations for a Transport. +
+ + + + + + + + + +
Classes
+ ZlibCompressor 
+ ZlibDecompressor 

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:46 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.compress.ZlibCompressor-class.html b/docs/private/paramiko.compress.ZlibCompressor-class.html new file mode 100644 index 0000000..ac848f4 --- /dev/null +++ b/docs/private/paramiko.compress.ZlibCompressor-class.html @@ -0,0 +1,122 @@ + + + + + paramiko.compress.ZlibCompressor + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module compress :: + Class ZlibCompressor +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type ZlibCompressor

+ +
+object --+
+         |
+        ZlibCompressor
+

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self) +
 __call__(self, + data) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.compress.ZlibDecompressor-class.html b/docs/private/paramiko.compress.ZlibDecompressor-class.html new file mode 100644 index 0000000..63e0b1f --- /dev/null +++ b/docs/private/paramiko.compress.ZlibDecompressor-class.html @@ -0,0 +1,122 @@ + + + + + paramiko.compress.ZlibDecompressor + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module compress :: + Class ZlibDecompressor +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type ZlibDecompressor

+ +
+object --+
+         |
+        ZlibDecompressor
+

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self) +
 __call__(self, + data) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.dsskey-module.html b/docs/private/paramiko.dsskey-module.html new file mode 100644 index 0000000..370a1c8 --- /dev/null +++ b/docs/private/paramiko.dsskey-module.html @@ -0,0 +1,62 @@ + + + + + paramiko.dsskey + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module dsskey +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.dsskey

+ +DSSKey +
+ + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.file-module.html b/docs/private/paramiko.file-module.html new file mode 100644 index 0000000..676e3ce --- /dev/null +++ b/docs/private/paramiko.file-module.html @@ -0,0 +1,230 @@ + + + + + paramiko.file + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module file +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.file

+ +BufferedFile. +
+ + + + + + + + + + + + + + + + + + + +
Variable Summary
int_FLAG_APPEND = 4                                                                     
int_FLAG_BINARY = 16                                                                    
int_FLAG_BUFFERED = 32                                                                    
int_FLAG_LINE_BUFFERED = 64                                                                    
int_FLAG_READ = 1                                                                     
int_FLAG_UNIVERSAL_NEWLINE = 128                                                                   
int_FLAG_WRITE = 2                                                                     

+ + + + + + +
Variable Details
+
+ +

_FLAG_APPEND

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+4                                                                     
+
+
+
+
+
+ +

_FLAG_BINARY

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+16                                                                    
+
+
+
+
+
+ +

_FLAG_BUFFERED

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+32                                                                    
+
+
+
+
+
+ +

_FLAG_LINE_BUFFERED

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+64                                                                    
+
+
+
+
+
+ +

_FLAG_READ

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1                                                                     
+
+
+
+
+
+ +

_FLAG_UNIVERSAL_NEWLINE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+128                                                                   
+
+
+
+
+
+ +

_FLAG_WRITE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.kex_gex-module.html b/docs/private/paramiko.kex_gex-module.html new file mode 100644 index 0000000..8fad377 --- /dev/null +++ b/docs/private/paramiko.kex_gex-module.html @@ -0,0 +1,179 @@ + + + + + paramiko.kex_gex + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module kex_gex +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.kex_gex

+ +Variant on KexGroup1 where the prime "p" and +generator "g" are provided by the server. A bit more work is +required on the client side, and a lot more on the server +side. +
+ + + + + + + +
Classes
+ KexGex 

+ + + + + + + + + + + + + + +
Variable Summary
int_MSG_KEXDH_GEX_GROUP = 31                                                                    
int_MSG_KEXDH_GEX_INIT = 32                                                                    
int_MSG_KEXDH_GEX_REPLY = 33                                                                    
int_MSG_KEXDH_GEX_REQUEST = 34                                                                    

+ + + + + + +
Variable Details
+
+ +

_MSG_KEXDH_GEX_GROUP

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+31                                                                    
+
+
+
+
+
+ +

_MSG_KEXDH_GEX_INIT

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+32                                                                    
+
+
+
+
+
+ +

_MSG_KEXDH_GEX_REPLY

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+33                                                                    
+
+
+
+
+
+ +

_MSG_KEXDH_GEX_REQUEST

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+34                                                                    
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.kex_gex.KexGex-class.html b/docs/private/paramiko.kex_gex.KexGex-class.html new file mode 100644 index 0000000..2eec555 --- /dev/null +++ b/docs/private/paramiko.kex_gex.KexGex-class.html @@ -0,0 +1,250 @@ + + + + + paramiko.kex_gex.KexGex + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module kex_gex :: + Class KexGex +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type KexGex

+ +
+object --+
+         |
+        KexGex
+

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + transport) +
 _generate_x(self) +
 _parse_kexdh_gex_group(self, + m) +
 _parse_kexdh_gex_init(self, + m) +
 _parse_kexdh_gex_reply(self, + m) +
 _parse_kexdh_gex_request(self, + m) +
 parse_next(self, + ptype, + m) +
 start_kex(self) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + + + + +
Class Variable Summary
intmax_bits = 8192                                                                  
intmin_bits = 1024                                                                  
strname = 'diffie-hellman-group-exchange-sha1' +
intpreferred_bits = 2048                                                                  

+ + + + + + +
Class Variable Details
+
+ +

max_bits

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+8192                                                                  
+
+
+
+
+
+ +

min_bits

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1024                                                                  
+
+
+
+
+
+ +

name

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'diffie-hellman-group-exchange-sha1'                                   
+
+
+
+
+
+ +

preferred_bits

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2048                                                                  
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.kex_group1-module.html b/docs/private/paramiko.kex_group1-module.html new file mode 100644 index 0000000..84a44f2 --- /dev/null +++ b/docs/private/paramiko.kex_group1-module.html @@ -0,0 +1,181 @@ + + + + + paramiko.kex_group1 + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module kex_group1 +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.kex_group1

+ +Standard SSH key exchange ("kex" if you wanna sound cool). +Diffie-Hellman of 1024 bit key halves, using a known "p" prime +and "g" generator. +
+ + + + + + + +
Classes
+ KexGroup1 

+ + + + + + + + + + + + + + +
Variable Summary
int_MSG_KEXDH_INIT = 30                                                                    
int_MSG_KEXDH_REPLY = 31                                                                    
intG = 2                                                                     
longP = 1797693134862315907708391567937874531978602960487560... +

+ + + + + + +
Variable Details
+
+ +

_MSG_KEXDH_INIT

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+30                                                                    
+
+
+
+
+
+ +

_MSG_KEXDH_REPLY

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+31                                                                    
+
+
+
+
+
+ +

G

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ +

P

+
+
+
+
+
Type:
+
+ long + +
+
Value:
+
+
+1797693134862315907708391567937874531978602960487560117064444236841971\
+8021615851936894783379586492554150218056548598050364644054819923910005\
+0792877003355816639229553136239076508735759914822574862575007425302077\
+4477125895509579377784244424266173347276292993876687092056060502708108\
+42907692932019128194467627007L                                         
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.kex_group1.KexGroup1-class.html b/docs/private/paramiko.kex_group1.KexGroup1-class.html new file mode 100644 index 0000000..7287b9d --- /dev/null +++ b/docs/private/paramiko.kex_group1.KexGroup1-class.html @@ -0,0 +1,176 @@ + + + + + paramiko.kex_group1.KexGroup1 + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module kex_group1 :: + Class KexGroup1 +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type KexGroup1

+ +
+object --+
+         |
+        KexGroup1
+

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + transport) +
 _generate_x(self) +
 _parse_kexdh_init(self, + m) +
 _parse_kexdh_reply(self, + m) +
 parse_next(self, + ptype, + m) +
 start_kex(self) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + +
Class Variable Summary
strname = 'diffie-hellman-group1-sha1' +

+ + + + + + +
Class Variable Details
+
+ +

name

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'diffie-hellman-group1-sha1'                                           
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.logging22-module.html b/docs/private/paramiko.logging22-module.html new file mode 100644 index 0000000..daa72e6 --- /dev/null +++ b/docs/private/paramiko.logging22-module.html @@ -0,0 +1,235 @@ + + + + + paramiko.logging22 + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module logging22 +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.logging22

+ +Stub out logging on python < 2.3. +
+ + + + + + + + + + + +
Classes
+ Formatter 
+ logger 
+ StreamHandler 

+ + + + + + + + +
Function Summary
 getLogger(name) +

+ + + + + + + + + + + + + + + + + + +
Variable Summary
logger_logger = <paramiko.logging22.logger object at 0xb7b2254... +
intCRITICAL = 50                                                                    
intDEBUG = 10                                                                    
intERROR = 40                                                                    
intINFO = 20                                                                    
intWARNING = 30                                                                    

+ + + + + + +
Variable Details
+
+ +

_logger

+
+
+
+
+
Type:
+
+ logger + +
+
Value:
+
+
+<paramiko.logging22.logger object at 0xb7b2254c>                       
+
+
+
+
+
+ +

CRITICAL

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+50                                                                    
+
+
+
+
+
+ +

DEBUG

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+10                                                                    
+
+
+
+
+
+ +

ERROR

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+40                                                                    
+
+
+
+
+
+ +

INFO

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+20                                                                    
+
+
+
+
+
+ +

WARNING

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+30                                                                    
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.logging22.Formatter-class.html b/docs/private/paramiko.logging22.Formatter-class.html new file mode 100644 index 0000000..78fa916 --- /dev/null +++ b/docs/private/paramiko.logging22.Formatter-class.html @@ -0,0 +1,120 @@ + + + + + paramiko.logging22.Formatter + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module logging22 :: + Class Formatter +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type Formatter

+ +
+object --+
+         |
+        Formatter
+

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + x, + y) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.logging22.StreamHandler-class.html b/docs/private/paramiko.logging22.StreamHandler-class.html new file mode 100644 index 0000000..dc3e953 --- /dev/null +++ b/docs/private/paramiko.logging22.StreamHandler-class.html @@ -0,0 +1,123 @@ + + + + + paramiko.logging22.StreamHandler + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module logging22 :: + Class StreamHandler +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type StreamHandler

+ +
+object --+
+         |
+        StreamHandler
+

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + f) +
 setFormatter(self, + f) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.logging22.logger-class.html b/docs/private/paramiko.logging22.logger-class.html new file mode 100644 index 0000000..75bd6da --- /dev/null +++ b/docs/private/paramiko.logging22.logger-class.html @@ -0,0 +1,135 @@ + + + + + paramiko.logging22.logger + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module logging22 :: + Class logger +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type logger

+ +
+object --+
+         |
+        logger
+

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self) +
 addFilter(self, + filter) +
 addHandler(self, + h) +
 log(self, + level, + text) +
 setLevel(self, + level) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.message-module.html b/docs/private/paramiko.message-module.html new file mode 100644 index 0000000..3a82218 --- /dev/null +++ b/docs/private/paramiko.message-module.html @@ -0,0 +1,61 @@ + + + + + paramiko.message + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module message +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.message

+ +Implementation of an SSH2 "message". +
+ + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:46 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.packet-module.html b/docs/private/paramiko.packet-module.html new file mode 100644 index 0000000..a14ccd8 --- /dev/null +++ b/docs/private/paramiko.packet-module.html @@ -0,0 +1,71 @@ + + + + + paramiko.packet + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module packet +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.packet

+ +Packetizer. +
+ + + + + + + +
Exceptions
+ NeedRekeyException 

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.packet.NeedRekeyException-class.html b/docs/private/paramiko.packet.NeedRekeyException-class.html new file mode 100644 index 0000000..850f706 --- /dev/null +++ b/docs/private/paramiko.packet.NeedRekeyException-class.html @@ -0,0 +1,86 @@ + + + + + paramiko.packet.NeedRekeyException + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module packet :: + Class NeedRekeyException +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class NeedRekeyException

+ +
+Exception --+
+            |
+           NeedRekeyException
+

+ +
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.pipe-module.html b/docs/private/paramiko.pipe-module.html new file mode 100644 index 0000000..34edd01 --- /dev/null +++ b/docs/private/paramiko.pipe-module.html @@ -0,0 +1,87 @@ + + + + + paramiko.pipe + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module pipe +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.pipe

+ +Abstraction of a one-way pipe where the read end can be used in +select(). Normally this is trivial, but Windows makes it nearly +impossible. +
+ + + + + + + + + +
Classes
+ PosixPipe 
+ WindowsPipeOn Windows, only an OS-level "WinSock" may be used in +select(), but reads and writes must be to the actual socket object.

+ + + + + + + + +
Function Summary
 make_pipe() +

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.pipe.PosixPipe-class.html b/docs/private/paramiko.pipe.PosixPipe-class.html new file mode 100644 index 0000000..b8a01b1 --- /dev/null +++ b/docs/private/paramiko.pipe.PosixPipe-class.html @@ -0,0 +1,133 @@ + + + + + paramiko.pipe.PosixPipe + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module pipe :: + Class PosixPipe +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type PosixPipe

+ +
+object --+
+         |
+        PosixPipe
+

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self) +
 clear(self) +
 close(self) +
 fileno(self) +
 set(self) +
 set_forever(self) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:46 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.pipe.WindowsPipe-class.html b/docs/private/paramiko.pipe.WindowsPipe-class.html new file mode 100644 index 0000000..56bd3f4 --- /dev/null +++ b/docs/private/paramiko.pipe.WindowsPipe-class.html @@ -0,0 +1,137 @@ + + + + + paramiko.pipe.WindowsPipe + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module pipe :: + Class WindowsPipe +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type WindowsPipe

+ +
+object --+
+         |
+        WindowsPipe
+

+ +
+ +On Windows, only an OS-level "WinSock" may be used in +select(), but reads and writes must be to the actual socket object. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self) +
 clear(self) +
 close(self) +
 fileno(self) +
 set(self) +
 set_forever(self) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:46 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.pkey-module.html b/docs/private/paramiko.pkey-module.html new file mode 100644 index 0000000..3b6a4a1 --- /dev/null +++ b/docs/private/paramiko.pkey-module.html @@ -0,0 +1,61 @@ + + + + + paramiko.pkey + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module pkey +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.pkey

+ +Common API for all public keys. +
+ + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.primes-module.html b/docs/private/paramiko.primes-module.html new file mode 100644 index 0000000..3f2df29 --- /dev/null +++ b/docs/private/paramiko.primes-module.html @@ -0,0 +1,117 @@ + + + + + paramiko.primes + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module primes +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.primes

+ +Utility functions for dealing with primes. +
+ + + + + + + +
Classes
+ ModulusPackconvenience object for holding the contents of the /etc/ssh/moduli +file, on systems that have such a file.

+ + + + + + + + + + +
Function Summary
 _generate_prime(bits, + randpool) +
+primtive attempt at prime generation
 _roll_random(rpool, + n) +
+returns a random # from 0 to N-1

+ + + + + + +
Function Details
+ + +
+

_generate_prime(bits, + randpool) +

+ primtive attempt at prime generation +
+
+
+ + +
+

_roll_random(rpool, + n) +

+ returns a random # from 0 to N-1 +
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.primes.ModulusPack-class.html b/docs/private/paramiko.primes.ModulusPack-class.html new file mode 100644 index 0000000..438893b --- /dev/null +++ b/docs/private/paramiko.primes.ModulusPack-class.html @@ -0,0 +1,158 @@ + + + + + paramiko.primes.ModulusPack + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module primes :: + Class ModulusPack +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type ModulusPack

+ +
+object --+
+         |
+        ModulusPack
+

+ +
+ +convenience object for holding the contents of the /etc/ssh/moduli +file, on systems that have such a file. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + rpool) +
 _parse_modulus(self, + line) +
 get_modulus(self, + min, + prefer, + max) +
 read_file(self, + filename) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + +
Method Details
+ + +
+

read_file(self, + filename) +

+
+
Raises:
+
IOError - + passed from any file operations that fail. +
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.rsakey-module.html b/docs/private/paramiko.rsakey-module.html new file mode 100644 index 0000000..29f2397 --- /dev/null +++ b/docs/private/paramiko.rsakey-module.html @@ -0,0 +1,62 @@ + + + + + paramiko.rsakey + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module rsakey +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.rsakey

+ +RSAKey +
+ + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.server-module.html b/docs/private/paramiko.server-module.html new file mode 100644 index 0000000..95d6786 --- /dev/null +++ b/docs/private/paramiko.server-module.html @@ -0,0 +1,74 @@ + + + + + paramiko.server + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module server +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.server

+ +ServerInterface is an interface to override +for server support. +
+ + + + + + + +
Classes
+ InteractiveQueryA query (set of prompts) for a user during interactive +authentication.

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.server.InteractiveQuery-class.html b/docs/private/paramiko.server.InteractiveQuery-class.html new file mode 100644 index 0000000..adc7ea2 --- /dev/null +++ b/docs/private/paramiko.server.InteractiveQuery-class.html @@ -0,0 +1,195 @@ + + + + + paramiko.server.InteractiveQuery + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module server :: + Class InteractiveQuery +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type InteractiveQuery

+ +
+object --+
+         |
+        InteractiveQuery
+

+ +
+ +A query (set of prompts) for a user during interactive +authentication. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + name, + instructions, + *prompts) +
+Create a new interactive query to send to the client.
 add_prompt(self, + prompt, + echo) +
+Add a prompt to this query.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + +
Method Details
+ + +
+

__init__(self, + name='', + instructions='', + *prompts) +
(Constructor) +

+ Create a new interactive query to send to the client. The name and + instructions are optional, but are generally displayed to the end user. + A list of prompts may be included, or they may be added via the add_prompt method. +
+
Parameters:
+
name - + name of this query +
           + (type=str) +
instructions - + user instructions (usually short) about this query +
           + (type=str) +
+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

add_prompt(self, + prompt, + echo=True) +

+ Add a prompt to this query. The prompt should be a (reasonably + short) string. Multiple prompts can be added to the same query. +
+
Parameters:
+
prompt - + the user prompt +
           + (type=str) +
echo - + True (default) if the user's response should be + echoed; False if not (for a password or similar) +
           + (type=bool) +
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.sftp-module.html b/docs/private/paramiko.sftp-module.html new file mode 100644 index 0000000..2d280dd --- /dev/null +++ b/docs/private/paramiko.sftp-module.html @@ -0,0 +1,1082 @@ + + + + + paramiko.sftp + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module sftp +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.sftp

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Variable Summary
intCMD_ATTRS = 105                                                                   
intCMD_CLOSE = 4                                                                     
intCMD_DATA = 103                                                                   
intCMD_EXTENDED = 200                                                                   
intCMD_EXTENDED_REPLY = 201                                                                   
intCMD_FSETSTAT = 10                                                                    
intCMD_FSTAT = 8                                                                     
intCMD_HANDLE = 102                                                                   
intCMD_INIT = 1                                                                     
intCMD_LSTAT = 7                                                                     
intCMD_MKDIR = 14                                                                    
intCMD_NAME = 104                                                                   
dictCMD_NAMES = {1: 'init', 2: 'version', 3: 'open', 4: 'clo... +
intCMD_OPEN = 3                                                                     
intCMD_OPENDIR = 11                                                                    
intCMD_READ = 5                                                                     
intCMD_READDIR = 12                                                                    
intCMD_READLINK = 19                                                                    
intCMD_REALPATH = 16                                                                    
intCMD_REMOVE = 13                                                                    
intCMD_RENAME = 18                                                                    
intCMD_RMDIR = 15                                                                    
intCMD_SETSTAT = 9                                                                     
intCMD_STAT = 17                                                                    
intCMD_STATUS = 101                                                                   
intCMD_SYMLINK = 20                                                                    
intCMD_VERSION = 2                                                                     
intCMD_WRITE = 6                                                                     
intSFTP_BAD_MESSAGE = 5                                                                     
intSFTP_CONNECTION_LOST = 7                                                                     
listSFTP_DESC = ['Success', 'End of file', 'No such file', '... +
intSFTP_EOF = 1                                                                     
intSFTP_FAILURE = 4                                                                     
intSFTP_FLAG_APPEND = 4                                                                     
intSFTP_FLAG_CREATE = 8                                                                     
intSFTP_FLAG_EXCL = 32                                                                    
intSFTP_FLAG_READ = 1                                                                     
intSFTP_FLAG_TRUNC = 16                                                                    
intSFTP_FLAG_WRITE = 2                                                                     
intSFTP_NO_CONNECTION = 6                                                                     
intSFTP_NO_SUCH_FILE = 2                                                                     
intSFTP_OK = 0                                                                     
intSFTP_OP_UNSUPPORTED = 8                                                                     
intSFTP_PERMISSION_DENIED = 3                                                                     
int_VERSION = 3                                                                     

+ + + + + + +
Variable Details
+
+ +

CMD_ATTRS

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+105                                                                   
+
+
+
+
+
+ +

CMD_CLOSE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+4                                                                     
+
+
+
+
+
+ +

CMD_DATA

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+103                                                                   
+
+
+
+
+
+ +

CMD_EXTENDED

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+200                                                                   
+
+
+
+
+
+ +

CMD_EXTENDED_REPLY

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+201                                                                   
+
+
+
+
+
+ +

CMD_FSETSTAT

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+10                                                                    
+
+
+
+
+
+ +

CMD_FSTAT

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+8                                                                     
+
+
+
+
+
+ +

CMD_HANDLE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+102                                                                   
+
+
+
+
+
+ +

CMD_INIT

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1                                                                     
+
+
+
+
+
+ +

CMD_LSTAT

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+7                                                                     
+
+
+
+
+
+ +

CMD_MKDIR

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+14                                                                    
+
+
+
+
+
+ +

CMD_NAME

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+104                                                                   
+
+
+
+
+
+ +

CMD_NAMES

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{1: 'init',
+ 2: 'version',
+ 3: 'open',
+ 4: 'close',
+ 5: 'read',
+ 6: 'write',
+ 7: 'lstat',
+ 8: 'fstat',
+...                                                                    
+
+
+
+
+
+ +

CMD_OPEN

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+3                                                                     
+
+
+
+
+
+ +

CMD_OPENDIR

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+11                                                                    
+
+
+
+
+
+ +

CMD_READ

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+5                                                                     
+
+
+
+
+
+ +

CMD_READDIR

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+12                                                                    
+
+
+
+
+
+ +

CMD_READLINK

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+19                                                                    
+
+
+
+
+
+ +

CMD_REALPATH

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+16                                                                    
+
+
+
+
+
+ +

CMD_REMOVE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+13                                                                    
+
+
+
+
+
+ +

CMD_RENAME

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+18                                                                    
+
+
+
+
+
+ +

CMD_RMDIR

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+15                                                                    
+
+
+
+
+
+ +

CMD_SETSTAT

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+9                                                                     
+
+
+
+
+
+ +

CMD_STAT

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+17                                                                    
+
+
+
+
+
+ +

CMD_STATUS

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+101                                                                   
+
+
+
+
+
+ +

CMD_SYMLINK

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+20                                                                    
+
+
+
+
+
+ +

CMD_VERSION

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ +

CMD_WRITE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+6                                                                     
+
+
+
+
+
+ +

SFTP_BAD_MESSAGE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+5                                                                     
+
+
+
+
+
+ +

SFTP_CONNECTION_LOST

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+7                                                                     
+
+
+
+
+
+ +

SFTP_DESC

+
+
+
+
+
Type:
+
+ list + +
+
Value:
+
+
+['Success',
+ 'End of file',
+ 'No such file',
+ 'Permission denied',
+ 'Failure',
+ 'Bad message',
+ 'No connection',
+ 'Connection lost',
+...                                                                    
+
+
+
+
+
+ +

SFTP_EOF

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1                                                                     
+
+
+
+
+
+ +

SFTP_FAILURE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+4                                                                     
+
+
+
+
+
+ +

SFTP_FLAG_APPEND

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+4                                                                     
+
+
+
+
+
+ +

SFTP_FLAG_CREATE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+8                                                                     
+
+
+
+
+
+ +

SFTP_FLAG_EXCL

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+32                                                                    
+
+
+
+
+
+ +

SFTP_FLAG_READ

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1                                                                     
+
+
+
+
+
+ +

SFTP_FLAG_TRUNC

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+16                                                                    
+
+
+
+
+
+ +

SFTP_FLAG_WRITE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ +

SFTP_NO_CONNECTION

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+6                                                                     
+
+
+
+
+
+ +

SFTP_NO_SUCH_FILE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ +

SFTP_OK

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+0                                                                     
+
+
+
+
+
+ +

SFTP_OP_UNSUPPORTED

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+8                                                                     
+
+
+
+
+
+ +

SFTP_PERMISSION_DENIED

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+3                                                                     
+
+
+
+
+
+ +

_VERSION

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+3                                                                     
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.sftp_attr-module.html b/docs/private/paramiko.sftp_attr-module.html new file mode 100644 index 0000000..f5e9f9c --- /dev/null +++ b/docs/private/paramiko.sftp_attr-module.html @@ -0,0 +1,59 @@ + + + + + paramiko.sftp_attr + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module sftp_attr +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.sftp_attr

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.sftp_client-module.html b/docs/private/paramiko.sftp_client-module.html new file mode 100644 index 0000000..9eff026 --- /dev/null +++ b/docs/private/paramiko.sftp_client-module.html @@ -0,0 +1,89 @@ + + + + + paramiko.sftp_client + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module sftp_client +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.sftp_client

+ +Client-mode SFTP support. +
+ + + + + + + +
Function Summary
 _to_unicode(s) +
+if a str is not ascii, decode its utf8 into unicode

+ + + + + + +
Function Details
+ + +
+

_to_unicode(s) +

+ if a str is not ascii, decode its utf8 into unicode +
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.sftp_file-module.html b/docs/private/paramiko.sftp_file-module.html new file mode 100644 index 0000000..f954ea3 --- /dev/null +++ b/docs/private/paramiko.sftp_file-module.html @@ -0,0 +1,62 @@ + + + + + paramiko.sftp_file + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module sftp_file +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.sftp_file

+ +SFTPFile +
+ + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.sftp_handle-module.html b/docs/private/paramiko.sftp_handle-module.html new file mode 100644 index 0000000..aba785c --- /dev/null +++ b/docs/private/paramiko.sftp_handle-module.html @@ -0,0 +1,61 @@ + + + + + paramiko.sftp_handle + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module sftp_handle +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.sftp_handle

+ +Abstraction of an SFTP file handle (for server mode). +
+ + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.sftp_server-module.html b/docs/private/paramiko.sftp_server-module.html new file mode 100644 index 0000000..a4c43f5 --- /dev/null +++ b/docs/private/paramiko.sftp_server-module.html @@ -0,0 +1,102 @@ + + + + + paramiko.sftp_server + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module sftp_server +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.sftp_server

+ +Server-mode SFTP support. +
+ + + + + + + +
Variable Summary
dict_hash_class = {'sha1': <module 'Crypto.Hash.SHA' from '/... +

+ + + + + + +
Variable Details
+
+ +

_hash_class

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{'md5': <module 'Crypto.Hash.MD5' from '/usr/lib/python2.4/site-packag\
+es/Crypto/Hash/MD5.pyc'>,
+ 'sha1': <module 'Crypto.Hash.SHA' from '/usr/lib/python2.4/site-packa\
+ges/Crypto/Hash/SHA.pyc'>}                                             
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.sftp_si-module.html b/docs/private/paramiko.sftp_si-module.html new file mode 100644 index 0000000..c4e623f --- /dev/null +++ b/docs/private/paramiko.sftp_si-module.html @@ -0,0 +1,63 @@ + + + + + paramiko.sftp_si + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module sftp_si +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.sftp_si

+ +SFTPServerInterface is an interface to +override for SFTP server support. +
+ + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.ssh_exception-module.html b/docs/private/paramiko.ssh_exception-module.html new file mode 100644 index 0000000..dd9908c --- /dev/null +++ b/docs/private/paramiko.ssh_exception-module.html @@ -0,0 +1,72 @@ + + + + + paramiko.ssh_exception + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module ssh_exception +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.ssh_exception

+ +Exceptions defined by paramiko. +
+ + + + + + + +
Exceptions
+ PartialAuthenticationAn internal exception thrown in the case of partial +authentication.

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:46 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.ssh_exception.PartialAuthentication-class.html b/docs/private/paramiko.ssh_exception.PartialAuthentication-class.html new file mode 100644 index 0000000..0aa4a93 --- /dev/null +++ b/docs/private/paramiko.ssh_exception.PartialAuthentication-class.html @@ -0,0 +1,131 @@ + + + + + paramiko.ssh_exception.PartialAuthentication + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module ssh_exception :: + Class PartialAuthentication +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class PartialAuthentication

+ +
+Exception --+    
+            |    
+ SSHException --+
+                |
+               PartialAuthentication
+

+ +
+ +An internal exception thrown in the case of partial +authentication. +
+ + + + + + + + + + + + + + +
Method Summary
 __init__(self, + types) +
    Inherited from Exception
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + +
Class Variable Summary
listallowed_types = [] +

+ + + + + + +
Class Variable Details
+
+ +

allowed_types

+
+
+
+
+
Type:
+
+ list + +
+
Value:
+
+
+[]                                                                     
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.transport-module.html b/docs/private/paramiko.transport-module.html new file mode 100644 index 0000000..1d52647 --- /dev/null +++ b/docs/private/paramiko.transport-module.html @@ -0,0 +1,111 @@ + + + + + paramiko.transport + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module transport +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.transport

+ +Transport handles the core SSH2 +protocol. +
+ + + + + + + +
Function Summary
 _join_lingering_threads() +

+ + + + + + + + +
Variable Summary
list_active_threads = [] +

+ + + + + + +
Variable Details
+
+ +

_active_threads

+
+
+
+
+
Type:
+
+ list + +
+
Value:
+
+
+[]                                                                     
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.util-module.html b/docs/private/paramiko.util-module.html new file mode 100644 index 0000000..660bdf3 --- /dev/null +++ b/docs/private/paramiko.util-module.html @@ -0,0 +1,475 @@ + + + + + paramiko.util + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module util +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.util

+ +Useful functions used by the rest of paramiko. +
+ + + + + + + +
Classes
+ PFilter 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function Summary
 bit_length(n) +
 deflate_long(n, + add_sign_padding) +
+turns a long-int into a normalized byte string (adapted from +Crypto.Util.number)
 format_binary(data, + prefix) +
 format_binary_line(data) +
 format_binary_weird(data) +
string +generate_key_bytes(hashclass, + salt, + key, + nbytes) +
+Given a password, passphrase, or other human-source key, scramble it +through a secure hash into some keyworthy bytes.
 get_logger(name) +
 get_thread_id() +
 hexify(s) +
+turn a string into a hex sequence
 inflate_long(s, + always_positive) +
+turns a normalized byte string into a long-int (adapted from +Crypto.Util.number)
dict(hostname, dict(keytype, PKey)) +load_host_keys(filename) +
+Read a file of known SSH host keys, in the format used by openssh, and +return a compound dict of hostname -> keytype -> PKey.
 log_to_file(filename, + level) +
+send paramiko logs to a logfile, if they're not already going +somewhere
 lookup_ssh_host_config(hostname, + config) +
+Return a dict of config options for a given hostname.
 mod_inverse(x, + m) +
object +parse_ssh_config(file_obj) +
+Parse a config file of the format used by OpenSSH, and return an +object that can be used to make queries to lookup_ssh_host_config.
 safe_string(s) +
 tb_strings() +
 unhexify(s) +
+turn a hex sequence back into a string

+ + + + + + + + + + + + + + +
Variable Summary
int_g_thread_counter = 0                                                                     
dict_g_thread_ids = {} +
lock_g_thread_lock = <thread.lock object at 0xb7df2180> +
PFilter_pfilter = <paramiko.util.PFilter object at 0xb7b39dac> +

+ + + + + + +
Function Details
+ + +
+

deflate_long(n, + add_sign_padding=True) +

+ turns a long-int into a normalized byte string (adapted from + Crypto.Util.number) +
+
+
+ + +
+

generate_key_bytes(hashclass, + salt, + key, + nbytes) +

+ Given a password, passphrase, or other human-source key, scramble it + through a secure hash into some keyworthy bytes. This specific + algorithm is used for encrypting/decrypting private key files. +
+
Parameters:
+
hashclass - + class from Crypto.Hash that can be used as a + secure hashing function (like MD5 or + SHA). +
           + (type=Crypto.Hash) +
salt - + data to salt the hash with. +
           + (type=string) +
key - + human-entered password or passphrase. +
           + (type=string) +
nbytes - + number of bytes to generate. +
           + (type=int) +
+
+
Returns:
+
+ key data +
           + (type=string) +
+
+
+
+ + +
+

hexify(s) +

+ turn a string into a hex sequence +
+
+
+ + +
+

inflate_long(s, + always_positive=False) +

+ turns a normalized byte string into a long-int (adapted from + Crypto.Util.number) +
+
+
+ + +
+

load_host_keys(filename) +

+

Read a file of known SSH host keys, in the format used by openssh, + and return a compound dict of hostname -> keytype -> + PKey. The hostname may be an IP address + or DNS name. The keytype will be either + "ssh-rsa" or + "ssh-dss".

+ This type of file unfortunately doesn't exist on Windows, but on + posix, it will usually be stored in + os.path.expanduser("~/.ssh/known_hosts"). +
+
Parameters:
+
filename - + name of the file to read host keys from +
           + (type=str) +
+
+
Returns:
+
+ dict of host keys, indexed by hostname and then keytype +
           + (type=dict(hostname, dict(keytype, PKey))) +
+
+
+
+ + +
+

log_to_file(filename, + level=10) +

+ send paramiko logs to a logfile, if they're not already going + somewhere +
+
+
+ + +
+

lookup_ssh_host_config(hostname, + config) +

+

Return a dict of config options for a given hostname. The + config object must come from parse_ssh_config.

+

The host-matching rules of OpenSSH's ssh_config man + page are used, which means that all configuration options from matching + host specifications are merged, with more specific hostmasks taking + precedence. In other words, if "Port" is set + under "Host *" and also "Host + *.example.com", and the lookup is for + "ssh.example.com", then the port entry for + "Host *.example.com" will win out.

+ The keys in the returned dict are all normalized to lowercase (look + for "port", not "Port". + No other processing is done to the keys or values. +
+
Parameters:
+
hostname - + the hostname to lookup +
           + (type=str) +
config - + the config object to search +
           + (type=object) +
+
+
+
+ + +
+

parse_ssh_config(file_obj) +

+

Parse a config file of the format used by OpenSSH, and return an + object that can be used to make queries to lookup_ssh_host_config. The format is + described in OpenSSH's ssh_config man page. This method is + provided primarily as a convenience to posix users (since the OpenSSH + format is a de-facto standard on posix) but should work fine on Windows + too.

+ The return value is currently a list of dictionaries, each + containing host-specific configuration, but this is considered an + implementation detail and may be subject to change in later + versions. +
+
Parameters:
+
file_obj - + a file-like object to read the config file from +
           + (type=file) +
+
+
Returns:
+
+ opaque configuration object +
           + (type=object) +
+
+
+
+ + +
+

unhexify(s) +

+ turn a hex sequence back into a string +
+
+
+
+ + + + + + +
Variable Details
+
+ +

_g_thread_counter

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+0                                                                     
+
+
+
+
+
+ +

_g_thread_ids

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{}                                                                     
+
+
+
+
+
+ +

_g_thread_lock

+
+
+
+
+
Type:
+
+ lock + +
+
Value:
+
+
+<thread.lock object at 0xb7df2180>                                     
+
+
+
+
+
+ +

_pfilter

+
+
+
+
+
Type:
+
+ PFilter + +
+
Value:
+
+
+<paramiko.util.PFilter object at 0xb7b39dac>                           
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/private/paramiko.util.PFilter-class.html b/docs/private/paramiko.util.PFilter-class.html new file mode 100644 index 0000000..dee3883 --- /dev/null +++ b/docs/private/paramiko.util.PFilter-class.html @@ -0,0 +1,124 @@ + + + + + paramiko.util.PFilter + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module util :: + Class PFilter +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type PFilter

+ +
+object --+
+         |
+        PFilter
+

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 filter(self, + record) +
    Inherited from object
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for +signature
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/private/threading.Thread-class.html b/docs/private/threading.Thread-class.html new file mode 100644 index 0000000..292b074 --- /dev/null +++ b/docs/private/threading.Thread-class.html @@ -0,0 +1,237 @@ + + + + + threading.Thread + + + + + + + + + + + + + + + + + + +
+ + Module threading :: + Class Thread +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type Thread

+ +
+object --+    
+         |    
+  _Verbose --+
+             |
+            Thread
+

+ +
Known Subclasses:
+
+ SubsystemHandler, + Transport
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + group, + target, + name, + args, + kwargs, + verbose) +
(type, value, traceback)__exc_info() +
+Return information about the most recent exception caught by an except +clause in the current stack frame or in an older stack frame.
 __repr__(self) +
 getName(self) +
 isAlive(self) +
 isDaemon(self) +
 join(self, + timeout) +
 run(self) +
 setDaemon(self, + daemonic) +
 setName(self, + name) +
 start(self) +
 __bootstrap(self) +
 __delete(self) +
+Remove current thread from the dict of currently running threads.
 __stop(self) +
 _set_daemon(self) +
    Inherited from _Verbose
 _note(self, + format, + *args) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + +
Class Variable Summary
bool_Thread__initialized = False +

+ + + + + + +
Method Details
+ + +
+

__delete(self) +

+ Remove current thread from the dict of currently running + threads. +
+
+
+
+ + + + + + +
Class Variable Details
+
+ +

_Thread__initialized

+
+
+
+
+
Type:
+
+ bool + +
+
Value:
+
+
+False                                                                  
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/private/threading._Verbose-class.html b/docs/private/threading._Verbose-class.html new file mode 100644 index 0000000..dec73e3 --- /dev/null +++ b/docs/private/threading._Verbose-class.html @@ -0,0 +1,127 @@ + + + + + threading._Verbose + + + + + + + + + + + + + + + + + + +
+ + Module threading :: + Class _Verbose +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type _Verbose

+ +
+object --+
+         |
+        _Verbose
+

+ +
Known Subclasses:
+
+ Thread
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + verbose) +
 _note(self, + format, + *args) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/private/toc-everything.html b/docs/private/toc-everything.html new file mode 100644 index 0000000..a232317 --- /dev/null +++ b/docs/private/toc-everything.html @@ -0,0 +1,224 @@ + + + + + Everything + + + +
Everything
+
+ + +All Classes
+paramiko.Agent
+paramiko.AgentKey
+paramiko.AuthHandler
+paramiko.BaseSFTP
+paramiko.ber.BER
+paramiko.BufferedFile
+paramiko.Channel
+paramiko.channel.ChannelStderrFile
+paramiko.ChannelFile
+paramiko.compress.ZlibCompressor
+paramiko.compress.ZlibDecompressor
+paramiko.DSSKey
+paramiko.kex_gex.KexGex
+paramiko.kex_group1.KexGroup1
+paramiko.logging22.Formatter
+paramiko.logging22.logger
+paramiko.logging22.StreamHandler
+paramiko.Message
+paramiko.Packetizer
+paramiko.pipe.PosixPipe
+paramiko.pipe.WindowsPipe
+paramiko.PKey
+paramiko.primes.ModulusPack
+paramiko.RSAKey
+paramiko.SecurityOptions
+paramiko.server.InteractiveQuery
+paramiko.ServerInterface
+paramiko.SFTP
+paramiko.SFTPAttributes
+paramiko.SFTPClient
+paramiko.SFTPFile
+paramiko.SFTPHandle
+paramiko.SFTPServer
+paramiko.SFTPServerInterface
+paramiko.SubsystemHandler
+paramiko.Transport
+paramiko.util.PFilter
+
+ + +All Exceptions
+paramiko.BadAuthenticationType
+paramiko.ber.BERException
+paramiko.packet.NeedRekeyException
+paramiko.PasswordRequiredException
+paramiko.SFTPError
+paramiko.ssh_exception.PartialAuthentication
+paramiko.SSHException
+
+ + +All Functions
+_generate_prime
+_join_lingering_threads
+_roll_random
+_to_unicode
+bit_length
+deflate_long
+format_binary
+format_binary_line
+format_binary_weird
+generate_key_bytes
+get_logger
+get_thread_id
+getLogger
+hexify
+inflate_long
+load_host_keys
+log_to_file
+lookup_ssh_host_config
+make_pipe
+mod_inverse
+parse_ssh_config
+safe_string
+tb_strings
+unhexify
+
+ + +All Variables
+__author__
+__date__
+__license__
+__version__
+__version_info__
+_active_threads
+_FLAG_APPEND
+_FLAG_BINARY
+_FLAG_BUFFERED
+_FLAG_LINE_BUFFERED
+_FLAG_READ
+_FLAG_UNIVERSAL_NEWLINE
+_FLAG_WRITE
+_g_thread_counter
+_g_thread_ids
+_g_thread_lock
+_hash_class
+_logger
+_MSG_KEXDH_GEX_GROUP
+_MSG_KEXDH_GEX_INIT
+_MSG_KEXDH_GEX_REPLY
+_MSG_KEXDH_GEX_REQUEST
+_MSG_KEXDH_INIT
+_MSG_KEXDH_REPLY
+_pfilter
+_VERSION
+AUTH_FAILED
+AUTH_PARTIALLY_SUCCESSFUL
+AUTH_SUCCESSFUL
+CMD_ATTRS
+CMD_CLOSE
+CMD_DATA
+CMD_EXTENDED
+CMD_EXTENDED_REPLY
+CMD_FSETSTAT
+CMD_FSTAT
+CMD_HANDLE
+CMD_INIT
+CMD_LSTAT
+CMD_MKDIR
+CMD_NAME
+CMD_NAMES
+CMD_OPEN
+CMD_OPENDIR
+CMD_READ
+CMD_READDIR
+CMD_READLINK
+CMD_REALPATH
+CMD_REMOVE
+CMD_RENAME
+CMD_RMDIR
+CMD_SETSTAT
+CMD_STAT
+CMD_STATUS
+CMD_SYMLINK
+CMD_VERSION
+CMD_WRITE
+CONNECTION_FAILED_CODE
+CRITICAL
+CRITICAL
+DEBUG
+DEBUG
+DISCONNECT_AUTH_CANCELLED_BY_USER
+DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE
+DISCONNECT_SERVICE_NOT_AVAILABLE
+ERROR
+ERROR
+G
+INFO
+INFO
+MSG_CHANNEL_CLOSE
+MSG_CHANNEL_DATA
+MSG_CHANNEL_EOF
+MSG_CHANNEL_EXTENDED_DATA
+MSG_CHANNEL_FAILURE
+MSG_CHANNEL_OPEN
+MSG_CHANNEL_OPEN_FAILURE
+MSG_CHANNEL_OPEN_SUCCESS
+MSG_CHANNEL_REQUEST
+MSG_CHANNEL_SUCCESS
+MSG_CHANNEL_WINDOW_ADJUST
+MSG_DEBUG
+MSG_DISCONNECT
+MSG_GLOBAL_REQUEST
+MSG_IGNORE
+MSG_KEXINIT
+MSG_NAMES
+MSG_NEWKEYS
+MSG_REQUEST_FAILURE
+MSG_REQUEST_SUCCESS
+MSG_SERVICE_ACCEPT
+MSG_SERVICE_REQUEST
+MSG_UNIMPLEMENTED
+MSG_USERAUTH_BANNER
+MSG_USERAUTH_FAILURE
+MSG_USERAUTH_INFO_REQUEST
+MSG_USERAUTH_INFO_RESPONSE
+MSG_USERAUTH_PK_OK
+MSG_USERAUTH_REQUEST
+MSG_USERAUTH_SUCCESS
+P
+SFTP_BAD_MESSAGE
+SFTP_CONNECTION_LOST
+SFTP_DESC
+SFTP_EOF
+SFTP_FAILURE
+SFTP_FLAG_APPEND
+SFTP_FLAG_CREATE
+SFTP_FLAG_EXCL
+SFTP_FLAG_READ
+SFTP_FLAG_TRUNC
+SFTP_FLAG_WRITE
+SFTP_NO_CONNECTION
+SFTP_NO_SUCH_FILE
+SFTP_OK
+SFTP_OP_UNSUPPORTED
+SFTP_PERMISSION_DENIED
+SSH2_AGENT_IDENTITIES_ANSWER
+SSH2_AGENT_SIGN_RESPONSE
+SSH2_AGENTC_REQUEST_IDENTITIES
+SSH2_AGENTC_SIGN_REQUEST
+WARNING
+WARNING
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko-module.html b/docs/private/toc-paramiko-module.html new file mode 100644 index 0000000..e6f4d8b --- /dev/null +++ b/docs/private/toc-paramiko-module.html @@ -0,0 +1,94 @@ + + + + + paramiko + + + +
paramiko
+
+ + +Modules
+agent
+auth_handler
+ber
+channel
+common
+compress
+dsskey
+file
+kex_gex
+kex_group1
+logging22
+message
+packet
+pipe
+pkey
+primes
+rsakey
+server
+sftp
+sftp_attr
+sftp_client
+sftp_file
+sftp_handle
+sftp_server
+sftp_si
+ssh_exception
+transport
+util
+
+ + +Classes
+Agent
+AgentKey
+AuthHandler
+BaseSFTP
+BufferedFile
+Channel
+ChannelFile
+DSSKey
+Message
+Packetizer
+PKey
+RSAKey
+SecurityOptions
+ServerInterface
+SFTP
+SFTPAttributes
+SFTPClient
+SFTPFile
+SFTPHandle
+SFTPServer
+SFTPServerInterface
+SubsystemHandler
+Transport
+x
+
+ + +Exceptions
+BadAuthenticationType
+PasswordRequiredException
+SFTPError
+SSHException
+
+ + +Variables
+__author__
+__date__
+__license__
+__version__
+__version_info__
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.agent-module.html b/docs/private/toc-paramiko.agent-module.html new file mode 100644 index 0000000..67aa397 --- /dev/null +++ b/docs/private/toc-paramiko.agent-module.html @@ -0,0 +1,25 @@ + + + + + paramiko.agent + + + +
agent
+
+ + +Variables
+SSH2_AGENT_IDENTITIES_ANSWER
+SSH2_AGENT_SIGN_RESPONSE
+SSH2_AGENTC_REQUEST_IDENTITIES
+SSH2_AGENTC_SIGN_REQUEST
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.auth_handler-module.html b/docs/private/toc-paramiko.auth_handler-module.html new file mode 100644 index 0000000..a82871d --- /dev/null +++ b/docs/private/toc-paramiko.auth_handler-module.html @@ -0,0 +1,17 @@ + + + + + paramiko.auth_handler + + + +
auth_handler
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.ber-module.html b/docs/private/toc-paramiko.ber-module.html new file mode 100644 index 0000000..2dd81d0 --- /dev/null +++ b/docs/private/toc-paramiko.ber-module.html @@ -0,0 +1,27 @@ + + + + + paramiko.ber + + + +
ber
+
+ + +Classes
+BER
+
+ + +Exceptions
+BERException
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.channel-module.html b/docs/private/toc-paramiko.channel-module.html new file mode 100644 index 0000000..d0eb4d9 --- /dev/null +++ b/docs/private/toc-paramiko.channel-module.html @@ -0,0 +1,22 @@ + + + + + paramiko.channel + + + +
channel
+
+ + +Classes
+ChannelStderrFile
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.common-module.html b/docs/private/toc-paramiko.common-module.html new file mode 100644 index 0000000..3fe063c --- /dev/null +++ b/docs/private/toc-paramiko.common-module.html @@ -0,0 +1,63 @@ + + + + + paramiko.common + + + +
common
+
+ + +Variables
+AUTH_FAILED
+AUTH_PARTIALLY_SUCCESSFUL
+AUTH_SUCCESSFUL
+CONNECTION_FAILED_CODE
+CRITICAL
+DEBUG
+DISCONNECT_AUTH_CANCELLED_BY_USER
+DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE
+DISCONNECT_SERVICE_NOT_AVAILABLE
+ERROR
+INFO
+MSG_CHANNEL_CLOSE
+MSG_CHANNEL_DATA
+MSG_CHANNEL_EOF
+MSG_CHANNEL_EXTENDED_DATA
+MSG_CHANNEL_FAILURE
+MSG_CHANNEL_OPEN
+MSG_CHANNEL_OPEN_FAILURE
+MSG_CHANNEL_OPEN_SUCCESS
+MSG_CHANNEL_REQUEST
+MSG_CHANNEL_SUCCESS
+MSG_CHANNEL_WINDOW_ADJUST
+MSG_DEBUG
+MSG_DISCONNECT
+MSG_GLOBAL_REQUEST
+MSG_IGNORE
+MSG_KEXINIT
+MSG_NAMES
+MSG_NEWKEYS
+MSG_REQUEST_FAILURE
+MSG_REQUEST_SUCCESS
+MSG_SERVICE_ACCEPT
+MSG_SERVICE_REQUEST
+MSG_UNIMPLEMENTED
+MSG_USERAUTH_BANNER
+MSG_USERAUTH_FAILURE
+MSG_USERAUTH_INFO_REQUEST
+MSG_USERAUTH_INFO_RESPONSE
+MSG_USERAUTH_PK_OK
+MSG_USERAUTH_REQUEST
+MSG_USERAUTH_SUCCESS
+WARNING
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.compress-module.html b/docs/private/toc-paramiko.compress-module.html new file mode 100644 index 0000000..df10cb8 --- /dev/null +++ b/docs/private/toc-paramiko.compress-module.html @@ -0,0 +1,23 @@ + + + + + paramiko.compress + + + +
compress
+
+ + +Classes
+ZlibCompressor
+ZlibDecompressor
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.dsskey-module.html b/docs/private/toc-paramiko.dsskey-module.html new file mode 100644 index 0000000..dbdf69c --- /dev/null +++ b/docs/private/toc-paramiko.dsskey-module.html @@ -0,0 +1,17 @@ + + + + + paramiko.dsskey + + + +
dsskey
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.file-module.html b/docs/private/toc-paramiko.file-module.html new file mode 100644 index 0000000..9cda933 --- /dev/null +++ b/docs/private/toc-paramiko.file-module.html @@ -0,0 +1,28 @@ + + + + + paramiko.file + + + +
file
+
+ + +Variables
+_FLAG_APPEND
+_FLAG_BINARY
+_FLAG_BUFFERED
+_FLAG_LINE_BUFFERED
+_FLAG_READ
+_FLAG_UNIVERSAL_NEWLINE
+_FLAG_WRITE
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.kex_gex-module.html b/docs/private/toc-paramiko.kex_gex-module.html new file mode 100644 index 0000000..fd9acc8 --- /dev/null +++ b/docs/private/toc-paramiko.kex_gex-module.html @@ -0,0 +1,30 @@ + + + + + paramiko.kex_gex + + + +
kex_gex
+
+ + +Classes
+KexGex
+
+ + +Variables
+_MSG_KEXDH_GEX_GROUP
+_MSG_KEXDH_GEX_INIT
+_MSG_KEXDH_GEX_REPLY
+_MSG_KEXDH_GEX_REQUEST
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.kex_group1-module.html b/docs/private/toc-paramiko.kex_group1-module.html new file mode 100644 index 0000000..ca51eb0 --- /dev/null +++ b/docs/private/toc-paramiko.kex_group1-module.html @@ -0,0 +1,30 @@ + + + + + paramiko.kex_group1 + + + +
kex_group1
+
+ + +Classes
+KexGroup1
+
+ + +Variables
+_MSG_KEXDH_INIT
+_MSG_KEXDH_REPLY
+G
+P
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.logging22-module.html b/docs/private/toc-paramiko.logging22-module.html new file mode 100644 index 0000000..6b96de4 --- /dev/null +++ b/docs/private/toc-paramiko.logging22-module.html @@ -0,0 +1,39 @@ + + + + + paramiko.logging22 + + + +
logging22
+
+ + +Classes
+Formatter
+logger
+StreamHandler
+
+ + +Functions
+getLogger
+
+ + +Variables
+_logger
+CRITICAL
+DEBUG
+ERROR
+INFO
+WARNING
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.message-module.html b/docs/private/toc-paramiko.message-module.html new file mode 100644 index 0000000..13e6444 --- /dev/null +++ b/docs/private/toc-paramiko.message-module.html @@ -0,0 +1,17 @@ + + + + + paramiko.message + + + +
message
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.packet-module.html b/docs/private/toc-paramiko.packet-module.html new file mode 100644 index 0000000..670fb37 --- /dev/null +++ b/docs/private/toc-paramiko.packet-module.html @@ -0,0 +1,22 @@ + + + + + paramiko.packet + + + +
packet
+
+ + +Exceptions
+NeedRekeyException
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.pipe-module.html b/docs/private/toc-paramiko.pipe-module.html new file mode 100644 index 0000000..4a6b775 --- /dev/null +++ b/docs/private/toc-paramiko.pipe-module.html @@ -0,0 +1,28 @@ + + + + + paramiko.pipe + + + +
pipe
+
+ + +Classes
+PosixPipe
+WindowsPipe
+
+ + +Functions
+make_pipe
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.pkey-module.html b/docs/private/toc-paramiko.pkey-module.html new file mode 100644 index 0000000..56fa96f --- /dev/null +++ b/docs/private/toc-paramiko.pkey-module.html @@ -0,0 +1,17 @@ + + + + + paramiko.pkey + + + +
pkey
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.primes-module.html b/docs/private/toc-paramiko.primes-module.html new file mode 100644 index 0000000..356d9bd --- /dev/null +++ b/docs/private/toc-paramiko.primes-module.html @@ -0,0 +1,28 @@ + + + + + paramiko.primes + + + +
primes
+
+ + +Classes
+ModulusPack
+
+ + +Functions
+_generate_prime
+_roll_random
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.rsakey-module.html b/docs/private/toc-paramiko.rsakey-module.html new file mode 100644 index 0000000..117cc82 --- /dev/null +++ b/docs/private/toc-paramiko.rsakey-module.html @@ -0,0 +1,17 @@ + + + + + paramiko.rsakey + + + +
rsakey
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.server-module.html b/docs/private/toc-paramiko.server-module.html new file mode 100644 index 0000000..58cf1e4 --- /dev/null +++ b/docs/private/toc-paramiko.server-module.html @@ -0,0 +1,22 @@ + + + + + paramiko.server + + + +
server
+
+ + +Classes
+InteractiveQuery
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.sftp-module.html b/docs/private/toc-paramiko.sftp-module.html new file mode 100644 index 0000000..a2d59c4 --- /dev/null +++ b/docs/private/toc-paramiko.sftp-module.html @@ -0,0 +1,66 @@ + + + + + paramiko.sftp + + + +
sftp
+
+ + +Variables
+_VERSION
+CMD_ATTRS
+CMD_CLOSE
+CMD_DATA
+CMD_EXTENDED
+CMD_EXTENDED_REPLY
+CMD_FSETSTAT
+CMD_FSTAT
+CMD_HANDLE
+CMD_INIT
+CMD_LSTAT
+CMD_MKDIR
+CMD_NAME
+CMD_NAMES
+CMD_OPEN
+CMD_OPENDIR
+CMD_READ
+CMD_READDIR
+CMD_READLINK
+CMD_REALPATH
+CMD_REMOVE
+CMD_RENAME
+CMD_RMDIR
+CMD_SETSTAT
+CMD_STAT
+CMD_STATUS
+CMD_SYMLINK
+CMD_VERSION
+CMD_WRITE
+SFTP_BAD_MESSAGE
+SFTP_CONNECTION_LOST
+SFTP_DESC
+SFTP_EOF
+SFTP_FAILURE
+SFTP_FLAG_APPEND
+SFTP_FLAG_CREATE
+SFTP_FLAG_EXCL
+SFTP_FLAG_READ
+SFTP_FLAG_TRUNC
+SFTP_FLAG_WRITE
+SFTP_NO_CONNECTION
+SFTP_NO_SUCH_FILE
+SFTP_OK
+SFTP_OP_UNSUPPORTED
+SFTP_PERMISSION_DENIED
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.sftp_attr-module.html b/docs/private/toc-paramiko.sftp_attr-module.html new file mode 100644 index 0000000..e1180e3 --- /dev/null +++ b/docs/private/toc-paramiko.sftp_attr-module.html @@ -0,0 +1,17 @@ + + + + + paramiko.sftp_attr + + + +
sftp_attr
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.sftp_client-module.html b/docs/private/toc-paramiko.sftp_client-module.html new file mode 100644 index 0000000..e2f94fd --- /dev/null +++ b/docs/private/toc-paramiko.sftp_client-module.html @@ -0,0 +1,22 @@ + + + + + paramiko.sftp_client + + + +
sftp_client
+
+ + +Functions
+_to_unicode
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.sftp_file-module.html b/docs/private/toc-paramiko.sftp_file-module.html new file mode 100644 index 0000000..f270b0f --- /dev/null +++ b/docs/private/toc-paramiko.sftp_file-module.html @@ -0,0 +1,17 @@ + + + + + paramiko.sftp_file + + + +
sftp_file
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.sftp_handle-module.html b/docs/private/toc-paramiko.sftp_handle-module.html new file mode 100644 index 0000000..1df5358 --- /dev/null +++ b/docs/private/toc-paramiko.sftp_handle-module.html @@ -0,0 +1,17 @@ + + + + + paramiko.sftp_handle + + + +
sftp_handle
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.sftp_server-module.html b/docs/private/toc-paramiko.sftp_server-module.html new file mode 100644 index 0000000..3c12fcc --- /dev/null +++ b/docs/private/toc-paramiko.sftp_server-module.html @@ -0,0 +1,22 @@ + + + + + paramiko.sftp_server + + + +
sftp_server
+
+ + +Variables
+_hash_class
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.sftp_si-module.html b/docs/private/toc-paramiko.sftp_si-module.html new file mode 100644 index 0000000..75605b8 --- /dev/null +++ b/docs/private/toc-paramiko.sftp_si-module.html @@ -0,0 +1,17 @@ + + + + + paramiko.sftp_si + + + +
sftp_si
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.ssh_exception-module.html b/docs/private/toc-paramiko.ssh_exception-module.html new file mode 100644 index 0000000..1567097 --- /dev/null +++ b/docs/private/toc-paramiko.ssh_exception-module.html @@ -0,0 +1,22 @@ + + + + + paramiko.ssh_exception + + + +
ssh_exception
+
+ + +Exceptions
+PartialAuthentication
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.transport-module.html b/docs/private/toc-paramiko.transport-module.html new file mode 100644 index 0000000..d5d5651 --- /dev/null +++ b/docs/private/toc-paramiko.transport-module.html @@ -0,0 +1,27 @@ + + + + + paramiko.transport + + + +
transport
+
+ + +Functions
+_join_lingering_threads
+
+ + +Variables
+_active_threads
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc-paramiko.util-module.html b/docs/private/toc-paramiko.util-module.html new file mode 100644 index 0000000..a290c16 --- /dev/null +++ b/docs/private/toc-paramiko.util-module.html @@ -0,0 +1,52 @@ + + + + + paramiko.util + + + +
util
+
+ + +Classes
+PFilter
+
+ + +Functions
+bit_length
+deflate_long
+format_binary
+format_binary_line
+format_binary_weird
+generate_key_bytes
+get_logger
+get_thread_id
+hexify
+inflate_long
+load_host_keys
+log_to_file
+lookup_ssh_host_config
+mod_inverse
+parse_ssh_config
+safe_string
+tb_strings
+unhexify
+
+ + +Variables
+_g_thread_counter
+_g_thread_ids
+_g_thread_lock
+_pfilter
+
+ +
+[show private | hide private] + + diff --git a/docs/private/toc.html b/docs/private/toc.html new file mode 100644 index 0000000..fd91230 --- /dev/null +++ b/docs/private/toc.html @@ -0,0 +1,53 @@ + + + + + Table of Contents + + + +
Table of Contents
+
+Everything
+ + +
Packages
+paramiko
+ + +
Modules
+paramiko.agent
+paramiko.auth_handler
+paramiko.ber
+paramiko.channel
+paramiko.common
+paramiko.compress
+paramiko.dsskey
+paramiko.file
+paramiko.kex_gex
+paramiko.kex_group1
+paramiko.logging22
+paramiko.message
+paramiko.packet
+paramiko.pipe
+paramiko.pkey
+paramiko.primes
+paramiko.rsakey
+paramiko.server
+paramiko.sftp
+paramiko.sftp_attr
+paramiko.sftp_client
+paramiko.sftp_file
+paramiko.sftp_handle
+paramiko.sftp_server
+paramiko.sftp_si
+paramiko.ssh_exception
+paramiko.transport
+paramiko.util
+ +

+[show private | hide private] + + diff --git a/docs/private/trees.html b/docs/private/trees.html new file mode 100644 index 0000000..d762eb6 --- /dev/null +++ b/docs/private/trees.html @@ -0,0 +1,243 @@ + + + + + Module and Class Hierarchies + + + + + + + + + + + + + + + + + + +
+ + + +
[show private | hide private]
[frames | no frames]
+ + +

Module Hierarchy

+
    +
  • paramiko: Paramiko (a combination of the esperanto words for +"paranoid" and "friend") is a module for python 2.3 +or greater that implements the SSH2 protocol for secure (encrypted and +authenticated) connections to remote machines. + +
+ + +

Class Hierarchy

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/public/__builtin__.object-class.html b/docs/public/__builtin__.object-class.html new file mode 100644 index 0000000..f9ab2d2 --- /dev/null +++ b/docs/public/__builtin__.object-class.html @@ -0,0 +1,268 @@ + + + + + __builtin__.object + + + + + + + + + + + + + + + + + + +
+ + Module __builtin__ :: + Class object +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type object

+ +
Known Subclasses:
+
+ BufferedFile, + Channel, + InteractiveQuery, + Message, + PFilter, + SecurityOptions, + SFTPAttributes, + SFTPHandle, + type
+ +
+ +The most base type +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for +signature
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + +
Class Variable Summary
type__class__ = __builtin__.type

+ + + + + + +
Method Details
+ + +
+

__init__(...) +
(Constructor) +

+ x.__init__(...) initializes x; see x.__class__.__doc__ for + signature +
+
+
+ + +
+

__delattr__(...) +

+ x.__delattr__('name') <==> del x.name +
+
+
+ + +
+

__getattribute__(...) +

+ x.__getattribute__('name') <==> x.name +
+
+
+ + +
+

__hash__(x) +
(Hashing function) +

+ x.__hash__() <==> hash(x) +
+
Returns:
+
+
+hash(x)
+
+
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+ T.__new__(S, ...) -> a new object with type S, a subtype of T +
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
+
+ + +
+

__reduce__(...) +

+ helper for pickle +
+
+
+ + +
+

__reduce_ex__(...) +

+ helper for pickle +
+
+
+ + +
+

__repr__(x) +
(Representation operator) +

+ x.__repr__() <==> repr(x) +
+
Returns:
+
+
+repr(x)
+
+
+
+
+
+ + +
+

__setattr__(...) +

+ x.__setattr__('name', value) <==> x.name = value +
+
+
+ + +
+

__str__(x) +
(Informal representation operator) +

+ x.__str__() <==> str(x) +
+
Returns:
+
+
+str(x)
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:46 2005http://epydoc.sf.net
+ + diff --git a/docs/public/__builtin__.type-class.html b/docs/public/__builtin__.type-class.html new file mode 100644 index 0000000..21075f7 --- /dev/null +++ b/docs/public/__builtin__.type-class.html @@ -0,0 +1,504 @@ + + + + + __builtin__.type + + + + + + + + + + + + + + + + + + +
+ + Module __builtin__ :: + Class type +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type type

+ +
+object --+
+         |
+        type
+

+ +
+ +type(object) -> the object's type type(name, bases, dict) -> a +new type +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __call__(x, + ...) +
+x.__call__(...) <==> x(...)
 __cmp__(x, + y) +
+x.__cmp__(y) <==> cmp(x,y)
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
list of immediate subclasses__subclasses__() +
+__subclasses__() -> list of immediate subclasses
listmro() +
+return a type's method resolution order
    Inherited from object
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for +signature
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + + + + + + + + + + + + + + +
Class Variable Summary
type__base__ = __builtin__.object
tuple__bases__ = (<type 'object'>,) +
int__basicsize__ = 420                                                                   
int__dictoffset__ = 132                                                                   
int__flags__ = 21995                                                                 
int__itemsize__ = 20                                                                    
tuple__mro__ = (<type 'type'>, <type 'object'>) +
str__name__ = 'type' +
int__weakrefoffset__ = 184                                                                   

+ + + + + + +
Method Details
+ + +
+

__call__(x, + ...) +
(Call operator) +

+ x.__call__(...) <==> x(...) +
+
Returns:
+
+
+x(...)
+
+
+
+
+
+ + +
+

__cmp__(x, + y) +
(Comparison operator) +

+ x.__cmp__(y) <==> cmp(x,y) +
+
Returns:
+
+
+cmp(x,y)
+
+
+
+
+
+ + +
+

__delattr__(...) +

+ x.__delattr__('name') <==> del x.name +
+
Overrides:
+
__builtin__.object.__delattr__
+
+
+
+ + +
+

__getattribute__(...) +

+ x.__getattribute__('name') <==> x.name +
+
Overrides:
+
__builtin__.object.__getattribute__
+
+
+
+ + +
+

__hash__(x) +
(Hashing function) +

+ x.__hash__() <==> hash(x) +
+
Returns:
+
+
+hash(x)
+
+
+
+
Overrides:
+
__builtin__.object.__hash__
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+ T.__new__(S, ...) -> a new object with type S, a subtype of T +
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
Overrides:
+
__builtin__.object.__new__
+
+
+
+ + +
+

__repr__(x) +
(Representation operator) +

+ x.__repr__() <==> repr(x) +
+
Returns:
+
+
+repr(x)
+
+
+
+
Overrides:
+
__builtin__.object.__repr__
+
+
+
+ + +
+

__setattr__(...) +

+ x.__setattr__('name', value) <==> x.name = value +
+
Overrides:
+
__builtin__.object.__setattr__
+
+
+
+ + +
+

__subclasses__() +

+ __subclasses__() -> list of immediate subclasses +
+
Returns:
+
+list of immediate subclasses
+
+
+
+ + +
+

mro() +

+ return a type's method resolution order +
+
Returns:
+
+list
+
+
+
+
+ + + + + + +
Class Variable Details
+
+ +

__bases__

+
+
+
+
+
Type:
+
+ tuple + +
+
Value:
+
+
+(<type 'object'>,)                                                     
+
+
+
+
+
+ +

__basicsize__

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+420                                                                   
+
+
+
+
+
+ +

__dictoffset__

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+132                                                                   
+
+
+
+
+
+ +

__flags__

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+21995                                                                 
+
+
+
+
+
+ +

__itemsize__

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+20                                                                    
+
+
+
+
+
+ +

__mro__

+
+
+
+
+
Type:
+
+ tuple + +
+
Value:
+
+
+(<type 'type'>, <type 'object'>)                                       
+
+
+
+
+
+ +

__name__

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'type'                                                                 
+
+
+
+
+
+ +

__weakrefoffset__

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+184                                                                   
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/epydoc.css b/docs/public/epydoc.css new file mode 100644 index 0000000..46080bd --- /dev/null +++ b/docs/public/epydoc.css @@ -0,0 +1,100 @@ + +/* Body color */ +body { background: #ffffff; color: #000000; } + +/* Tables */ +table.summary, table.details, table.index + { background: #e8f0f8; color: #000000; } +tr.summary, tr.details, tr.index + { background: #70b0f0; color: #000000; + text-align: left; font-size: 120%; } +tr.group { background: #c0e0f8; color: #000000; + text-align: left; font-size: 120%; + font-style: italic; } + +/* Documentation page titles */ +h2.module { margin-top: 0.2em; } +h2.class { margin-top: 0.2em; } + +/* Headings */ +h1.heading { font-size: +140%; font-style: italic; + font-weight: bold; } +h2.heading { font-size: +125%; font-style: italic; + font-weight: bold; } +h3.heading { font-size: +110%; font-style: italic; + font-weight: normal; } + +/* Base tree */ +pre.base-tree { font-size: 80%; margin: 0; } + +/* Details Sections */ +table.func-details { background: #e8f0f8; color: #000000; + border: 2px groove #c0d0d0; + padding: 0 1em 0 1em; margin: 0.4em 0 0 0; } +h3.func-detail { background: transparent; color: #000000; + margin: 0 0 1em 0; } + +table.var-details { background: #e8f0f8; color: #000000; + border: 2px groove #c0d0d0; + padding: 0 1em 0 1em; margin: 0.4em 0 0 0; } +h3.var-details { background: transparent; color: #000000; + margin: 0 0 1em 0; } + +/* Function signatures */ +.sig { background: transparent; color: #000000; + font-weight: bold; } +.sig-name { background: transparent; color: #006080; } +.sig-arg, .sig-kwarg, .sig-vararg + { background: transparent; color: #008060; } +.sig-default { background: transparent; color: #602000; } +.summary-sig { background: transparent; color: #000000; } +.summary-sig-name { background: transparent; color: #204080; } +.summary-sig-arg, .summary-sig-kwarg, .summary-sig-vararg + { background: transparent; color: #008060; } + +/* Doctest blocks */ +.py-src { background: transparent; color: #000000; } +.py-prompt { background: transparent; color: #005050; + font-weight: bold;} +.py-string { background: transparent; color: #006030; } +.py-comment { background: transparent; color: #003060; } +.py-keyword { background: transparent; color: #600000; } +.py-output { background: transparent; color: #404040; } +pre.doctestblock { background: #f4faff; color: #000000; + padding: .5em; margin: 1em; + border: 1px solid #708890; } +table pre.doctestblock + { background: #dce4ec; color: #000000; + padding: .5em; margin: 1em; + border: 1px solid #708890; } + +/* Variable values */ +pre.variable { background: #dce4ec; color: #000000; + padding: .5em; margin: 0; + border: 1px solid #708890; } +.variable-linewrap { background: transparent; color: #604000; } +.variable-ellipsis { background: transparent; color: #604000; } +.variable-quote { background: transparent; color: #604000; } +.re { background: transparent; color: #000000; } +.re-char { background: transparent; color: #006030; } +.re-op { background: transparent; color: #600000; } +.re-group { background: transparent; color: #003060; } +.re-ref { background: transparent; color: #404040; } + +/* Navigation bar */ +table.navbar { background: #a0c0ff; color: #0000ff; + border: 2px groove #c0d0d0; } +th.navbar { background: #a0c0ff; color: #0000ff; } +th.navselect { background: #70b0ff; color: #000000; } +.nomargin { margin: 0; } + +/* Links */ +a:link { background: transparent; color: #0000ff; } +a:visited { background: transparent; color: #204080; } +a.navbar:link { background: transparent; color: #0000ff; + text-decoration: none; } +a.navbar:visited { background: transparent; color: #204080; + text-decoration: none; } + +/* Lists */ +ul { margin-top: 0; } diff --git a/docs/public/exceptions.Exception-class.html b/docs/public/exceptions.Exception-class.html new file mode 100644 index 0000000..8e04fe7 --- /dev/null +++ b/docs/public/exceptions.Exception-class.html @@ -0,0 +1,85 @@ + + + + + exceptions.Exception + + + + + + + + + + + + + + + + + + +
+ + Module exceptions :: + Class Exception +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class Exception

+ +
Known Subclasses:
+
+ SFTPError, + SSHException
+ +
+ +Common base class for all exceptions. +
+ + + + + + + + + + + + +
Method Summary
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/frames.html b/docs/public/frames.html new file mode 100644 index 0000000..77678a0 --- /dev/null +++ b/docs/public/frames.html @@ -0,0 +1,13 @@ + + + + API Documentation + + + + + + + + + diff --git a/docs/public/help.html b/docs/public/help.html new file mode 100644 index 0000000..99e33a2 --- /dev/null +++ b/docs/public/help.html @@ -0,0 +1,224 @@ + + + + + Help + + + + + + + + + + + + + + + + + + +
+ + + +
[show private | hide private]
[frames | no frames]
+ +

API Documentation

+ +

This document contains the API (Application Programming Interface) +documentation for this project. Documentation for the Python +objects defined by the project is divided into separate pages for each +package, module, and class. The API documentation also includes two +pages containing information about the project as a whole: a trees +page, and an index page.

+ +

Object Documentation

+ +

Each Package Documentation page contains: +

    +
  • A description of the package.
  • +
  • A list of the modules and sub-packages contained by the + package.
  • +
  • A summary of the classes defined by the package.
  • +
  • A summary of the functions defined by the package.
  • +
  • A summary of the variables defined by the package.
  • +
  • A detailed description of each function defined by the + package.
  • +
  • A detailed description of each variable defined by the + package.
  • +

+ +

Each Module Documentation page contains: +

    +
  • A description of the module.
  • +
  • A summary of the classes defined by the module.
  • +
  • A summary of the functions defined by the module.
  • +
  • A summary of the variables defined by the module.
  • +
  • A detailed description of each function defined by the + module.
  • +
  • A detailed description of each variable defined by the + module.
  • +

+ +

Each Class Documentation page contains: +

    +
  • A class inheritance diagram.
  • +
  • A list of known subclasses.
  • +
  • A description of the class.
  • +
  • A summary of the methods defined by the class.
  • +
  • A summary of the instance variables defined by the class.
  • +
  • A summary of the class (static) variables defined by the + class.
  • +
  • A detailed description of each method defined by the + class.
  • +
  • A detailed description of each instance variable defined by the + class.
  • +
  • A detailed description of each class (static) variable defined + by the class.
  • +

+ +

Project Documentation

+ +

The Trees page contains the module and class hierarchies: +

    +
  • The module hierarchy lists every package and module, with + modules grouped into packages. At the top level, and within each + package, modules and sub-packages are listed alphabetically.
  • +
  • The class hierarchy lists every class, grouped by base + class. If a class has more than one base class, then it will be + listed under each base class. At the top level, and under each base + class, classes are listed alphabetically.
  • +

+ +

The Index page contains indices of terms and + identifiers: +

    +
  • The term index lists every term indexed by any object's + documentation. For each term, the index provides links to each + place where the term is indexed.
  • +
  • The identifier index lists the (short) name of every package, + module, class, method, function, variable, and parameter. For each + identifier, the index provides a short description, and a link to + its documentation.
  • +

+ +

The Table of Contents

+ +

The table of contents occupies the two frames on the left side of +the window. The upper-left frame displays the project +contents, and the lower-left frame displays the module +contents:

+ +
+ + + + + + + + +
+ Project
Contents
...
+ API
Documentation
Frame


+
+ Module
Contents
 
...
 
+

+
+ +

The project contents frame contains a list of all packages +and modules that are defined by the project. Clicking on an entry +will display its contents in the module contents frame. Clicking on a +special entry, labeled "Everything," will display the contents of +the entire project.

+ +

The module contents frame contains a list of every +submodule, class, type, exception, function, and variable defined by a +module or package. Clicking on an entry will display its +documentation in the API documentation frame. Clicking on the name of +the module, at the top of the frame, will display the documentation +for the module itself.

+ +

The "frames" and "no frames" buttons below the top +navigation bar can be used to control whether the table of contents is +displayed or not.

+ +

The Navigation Bar

+ +

A navigation bar is located at the top and bottom of every page. +It indicates what type of page you are currently viewing, and allows +you to go to related pages. The following table describes the labels +on the navigation bar. Note that not some labels (such as +[Parent]) are not displayed on all pages.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LabelHighlighted when...Links to...
[Parent](never highlighted) the parent of the current package
[Package]viewing a packagethe package containing the current object +
[Module]viewing a modulethe module containing the current object +
[Class]viewing a class the class containing the current object
[Trees]viewing the trees page the trees page
[Index]viewing the index page the index page
[Help]viewing the help page the help page
+ +

The "show private" and "hide private" buttons below +the top navigation bar can be used to control whether documentation +for private objects is displayed. Private objects are usually defined +as objects whose (short) names begin with a single underscore, but do +not end with an underscore. For example, "_x", +"__pprint", and "epydoc.epytext._tokenize" +are private objects; but "re.sub", +"__init__", and "type_" are not. However, +if a module defines the "__all__" variable, then its +contents are used to decide which objects are private.

+ +

A timestamp below the bottom navigation bar indicates when each +page was last updated.

+ + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/public/index.html b/docs/public/index.html new file mode 100644 index 0000000..77678a0 --- /dev/null +++ b/docs/public/index.html @@ -0,0 +1,13 @@ + + + + API Documentation + + + + + + + + + diff --git a/docs/public/indices.html b/docs/public/indices.html new file mode 100644 index 0000000..ce1f266 --- /dev/null +++ b/docs/public/indices.html @@ -0,0 +1,803 @@ + + + + + Index + + + + + + + + + + + + + + + + + + +
+ + + +
[show private | hide private]
[frames | no frames]
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Identifier Index
objectClass in module __builtin__
__bases__Variable in class __builtin__.type
__basicsize__Variable in class __builtin__.type
__call__Method in class __builtin__.type
typeClass in module __builtin__
__cmp__Method in class __builtin__.type
__del__Method in class paramiko.BufferedFile
__del__Method in class paramiko.Channel
__del__Method in class paramiko.SFTPClient
__del__Method in class paramiko.SFTPFile
__del__Method in class paramiko.Transport
__delattr__Method in class __builtin__.object
__delattr__Method in class __builtin__.type
__dictoffset__Variable in class __builtin__.type
__flags__Variable in class __builtin__.type
__getattribute__Method in class __builtin__.object
__getattribute__Method in class __builtin__.type
__getitem__Method in class exceptions.Exception
__hash__Method in class __builtin__.object
__hash__Method in class __builtin__.type
__hash__Method in class paramiko.DSSKey
__hash__Method in class paramiko.RSAKey
__init__Method in class __builtin__.object
__init__Method in class exceptions.Exception
__init__Method in class paramiko.Agent
__init__Method in class paramiko.AgentKey
__init__Method in class paramiko.BadAuthenticationType
__init__Method in class paramiko.BufferedFile
__init__Method in class paramiko.Channel
__init__Method in class paramiko.DSSKey
__init__Method in class paramiko.Message
__init__Method in class paramiko.RSAKey
__init__Method in class paramiko.SFTPAttributes
__init__Method in class paramiko.SFTPClient
__init__Method in class paramiko.SFTPFile
__init__Method in class paramiko.SFTPHandle
__init__Method in class paramiko.SFTPServer
__init__Method in class paramiko.SecurityOptions
__init__Method in class paramiko.SubsystemHandler
__init__Method in class paramiko.Transport
__init__Method in class paramiko.server.InteractiveQuery
__init__Method in class threading.Thread
__itemsize__Variable in class __builtin__.type
__iter__Method in class paramiko.BufferedFile
__mro__Variable in class __builtin__.type
__name__Variable in class __builtin__.type
__new__Method in class __builtin__.object
__new__Method in class __builtin__.type
__reduce__Method in class __builtin__.object
__reduce_ex__Method in class __builtin__.object
__repr__Method in class __builtin__.object
__repr__Method in class __builtin__.type
__repr__Method in class paramiko.Channel
__repr__Method in class paramiko.Message
__repr__Method in class paramiko.SFTPAttributes
__repr__Method in class paramiko.SecurityOptions
__repr__Method in class paramiko.Transport
__repr__Method in class threading.Thread
__setattr__Method in class __builtin__.object
__setattr__Method in class __builtin__.type
__slots__Variable in class paramiko.SecurityOptions
__str__Method in class __builtin__.object
__str__Method in class exceptions.Exception
__str__Method in class paramiko.AgentKey
__str__Method in class paramiko.BadAuthenticationType
__str__Method in class paramiko.DSSKey
__str__Method in class paramiko.Message
__str__Method in class paramiko.RSAKey
__str__Method in class paramiko.SFTPAttributes
__subclasses__Method in class __builtin__.type
__weakrefoffset__Variable in class __builtin__.type
acceptMethod in class paramiko.Transport
addMethod in class paramiko.Message
add_booleanMethod in class paramiko.Message
add_byteMethod in class paramiko.Message
add_bytesMethod in class paramiko.Message
add_intMethod in class paramiko.Message
add_int64Method in class paramiko.Message
add_listMethod in class paramiko.Message
add_mpintMethod in class paramiko.Message
add_promptMethod in class paramiko.server.InteractiveQuery
add_server_keyMethod in class paramiko.Transport
add_stringMethod in class paramiko.Message
AgentClass in package paramiko
agentModule in package paramiko
AgentKeyClass in package paramiko
allowed_typesVariable in class paramiko.BadAuthenticationType
auth_interactiveMethod in class paramiko.Transport
auth_noneMethod in class paramiko.Transport
auth_passwordMethod in class paramiko.Transport
auth_publickeyMethod in class paramiko.Transport
BadAuthenticationTypeClass in package paramiko
bit_lengthFunction in module paramiko.util
BufferedFileClass in package paramiko
can_signMethod in class paramiko.DSSKey
can_signMethod in class paramiko.RSAKey
ChannelClass in package paramiko
chattrMethod in class paramiko.SFTPHandle
chdirMethod in class paramiko.SFTPClient
checkMethod in class paramiko.SFTPFile
chmodMethod in class paramiko.SFTPClient
chownMethod in class paramiko.SFTPClient
ciphersMethod in class paramiko.SFTPClient in class paramiko.SecurityOptions
closeMethod in class paramiko.Agent
closeMethod in class paramiko.BufferedFile
closeMethod in class paramiko.Channel
closeMethod in class paramiko.SFTPClient
closeMethod in class paramiko.SFTPFile
closeMethod in class paramiko.SFTPHandle
closeMethod in class paramiko.Transport
CMD_ATTRSVariable in module paramiko.sftp
CMD_CLOSEVariable in module paramiko.sftp
CMD_DATAVariable in module paramiko.sftp
CMD_EXTENDEDVariable in module paramiko.sftp
CMD_EXTENDED_REPLYVariable in module paramiko.sftp
CMD_FSETSTATVariable in module paramiko.sftp
CMD_FSTATVariable in module paramiko.sftp
CMD_HANDLEVariable in module paramiko.sftp
CMD_INITVariable in module paramiko.sftp
CMD_LSTATVariable in module paramiko.sftp
CMD_MKDIRVariable in module paramiko.sftp
CMD_NAMEVariable in module paramiko.sftp
CMD_NAMESVariable in module paramiko.sftp
CMD_OPENVariable in module paramiko.sftp
CMD_OPENDIRVariable in module paramiko.sftp
CMD_READVariable in module paramiko.sftp
CMD_READDIRVariable in module paramiko.sftp
CMD_READLINKVariable in module paramiko.sftp
CMD_REALPATHVariable in module paramiko.sftp
CMD_REMOVEVariable in module paramiko.sftp
CMD_RENAMEVariable in module paramiko.sftp
CMD_RMDIRVariable in module paramiko.sftp
CMD_SETSTATVariable in module paramiko.sftp
CMD_STATVariable in module paramiko.sftp
CMD_STATUSVariable in module paramiko.sftp
CMD_SYMLINKVariable in module paramiko.sftp
CMD_VERSIONVariable in module paramiko.sftp
CMD_WRITEVariable in module paramiko.sftp
compressionModule in package paramiko in class paramiko.SecurityOptions
connectMethod in class paramiko.Transport
convert_errnoMethod in class paramiko.SFTPServer
deflate_longFunction in module paramiko.util
digestsFunction in module paramiko.util in class paramiko.SecurityOptions
DSSKeyClass in package paramiko
dsskeyModule in package paramiko
exc_infoFunction in module sys
ExceptionClass in module exceptions
exec_commandMethod in class paramiko.Channel
fileMethod in class paramiko.SFTPClient
fileModule in package paramiko
filenoMethod in class paramiko.Channel
filterMethod in class paramiko.util.PFilter
finish_subsystemMethod in class paramiko.SFTPServer
finish_subsystemMethod in class paramiko.SubsystemHandler
FLAG_AMTIMEVariable in class paramiko.SFTPAttributes
FLAG_EXTENDEDVariable in class paramiko.SFTPAttributes
FLAG_PERMISSIONSVariable in class paramiko.SFTPAttributes
FLAG_SIZEVariable in class paramiko.SFTPAttributes
FLAG_UIDGIDVariable in class paramiko.SFTPAttributes
flushMethod in class paramiko.BufferedFile
format_binaryFunction in module paramiko.util
format_binary_lineFunction in module paramiko.util
format_binary_weirdFunction in module paramiko.util
from_statMethod in class paramiko.SFTPAttributes
from_transportMethod in class paramiko.SFTPClient
generateMethod in class paramiko.DSSKey
generateMethod in class paramiko.RSAKey
generate_key_bytesFunction in module paramiko.util
getMethod in class paramiko.SFTPClient
get_bitsMethod in class paramiko.DSSKey
get_bitsMethod in class paramiko.RSAKey
get_booleanMethod in class paramiko.Message
get_byteMethod in class paramiko.Message
get_bytesMethod in class paramiko.Message
get_exceptionMethod in class paramiko.Transport
get_hexdumpMethod in class paramiko.Transport
get_idMethod in class paramiko.Channel
get_intMethod in class paramiko.Message
get_int64Method in class paramiko.Message
get_keysMethod in class paramiko.Agent
get_listMethod in class paramiko.Message
get_log_channelMethod in class paramiko.Transport
get_loggerFunction in module paramiko.util
get_mpintMethod in class paramiko.Message
get_nameMethod in class paramiko.AgentKey
get_nameMethod in class paramiko.Channel
get_nameMethod in class paramiko.DSSKey
get_nameMethod in class paramiko.RSAKey
get_ptyMethod in class paramiko.Channel
get_remainderMethod in class paramiko.Message
get_remote_server_keyMethod in class paramiko.Transport
get_security_optionsMethod in class paramiko.Transport
get_serverMethod in class paramiko.SubsystemHandler
get_server_keyMethod in class paramiko.Transport
get_so_farMethod in class paramiko.Message
get_stringMethod in class paramiko.Message
get_thread_idFunction in module paramiko.util
get_transportMethod in class paramiko.Channel
get_usernameMethod in class paramiko.Transport
getcwdMethod in class paramiko.SFTPClient
getNameMethod in class threading.Thread
gettimeoutMethod in class paramiko.Channel
gettimeoutMethod in class paramiko.SFTPFile
global_requestMethod in class paramiko.Transport
hexifyFunction in module paramiko.util
inflate_longFunction in module paramiko.util
InteractiveQueryClass in module paramiko.server
invoke_shellMethod in class paramiko.Channel
invoke_subsystemMethod in class paramiko.Channel
is_activeMethod in class paramiko.Transport
is_authenticatedMethod in class paramiko.Transport
isAliveMethod in class threading.Thread
isDaemonMethod in class threading.Thread
joinMethod in class threading.Thread
kexMethod in class threading.Thread in class paramiko.SecurityOptions
key_typesClass in module paramiko.kex_group1 in class paramiko.SecurityOptions
listdirMethod in class paramiko.SFTPClient
listdir_attrMethod in class paramiko.SFTPClient
load_host_keysFunction in module paramiko.util
load_server_moduliMethod in class paramiko.Transport
log_to_fileFunction in module paramiko.util
lookup_ssh_host_configFunction in module paramiko.util
lstatMethod in class paramiko.SFTPClient
makefileMethod in class paramiko.Channel
makefile_stderrMethod in class paramiko.Channel
MAX_REQUEST_SIZEVariable in class paramiko.SFTPFile
MessageClass in package paramiko
messageModule in package paramiko
MIN_PACKET_SIZEVariable in class paramiko.Channel
mkdirMethod in class paramiko.SFTPClient
mod_inverseFunction in module paramiko.util
mroMethod in class __builtin__.type
nextMethod in class paramiko.BufferedFile
normalizeMethod in class paramiko.SFTPClient
objectClass in module __builtin__
open_channelMethod in class paramiko.Transport
open_sessionMethod in class paramiko.Transport
open_sftp_clientMethod in class paramiko.Transport
paramikoPackage
parse_ssh_configFunction in module paramiko.util
PasswordRequiredExceptionClass in package paramiko
PFilterClass in module paramiko.util
pkeyModule in package paramiko
prefetchMethod in class paramiko.SFTPFile
putMethod in class paramiko.SFTPClient
readMethod in class paramiko.BufferedFile
readMethod in class paramiko.SFTPHandle
readlineMethod in class paramiko.BufferedFile
readlinesMethod in class paramiko.BufferedFile
readlinkMethod in class paramiko.SFTPClient
recvMethod in class paramiko.Channel
recv_exit_statusMethod in class paramiko.Channel
recv_readyMethod in class paramiko.Channel
recv_stderrMethod in class paramiko.Channel
recv_stderr_readyMethod in class paramiko.Channel
removeMethod in class paramiko.SFTPClient
renameMethod in class paramiko.SFTPClient
renegotiate_keysMethod in class paramiko.Transport
resize_ptyMethod in class paramiko.Channel
rewindMethod in class paramiko.Message
rmdirMethod in class paramiko.SFTPClient
RSAKeyClass in package paramiko
rsakeyModule in package paramiko
runMethod in class paramiko.Transport
runMethod in class threading.Thread
safe_stringFunction in module paramiko.util
SecurityOptionsClass in package paramiko
seekMethod in class paramiko.BufferedFile
seekMethod in class paramiko.SFTPFile
SEEK_CURVariable in class paramiko.BufferedFile
SEEK_CURVariable in class paramiko.BufferedFile
SEEK_CURVariable in class paramiko.BufferedFile
SEEK_CURVariable in class paramiko.BufferedFile
SEEK_ENDVariable in class paramiko.BufferedFile
SEEK_ENDVariable in class paramiko.BufferedFile
SEEK_ENDVariable in class paramiko.BufferedFile
SEEK_ENDVariable in class paramiko.BufferedFile
SEEK_SETVariable in class paramiko.BufferedFile
SEEK_SETVariable in class paramiko.BufferedFile
SEEK_SETVariable in class paramiko.BufferedFile
SEEK_SETVariable in class paramiko.BufferedFile
sendMethod in class paramiko.Channel
send_exit_statusMethod in class paramiko.Channel
send_ignoreMethod in class paramiko.Transport
send_stderrMethod in class paramiko.Channel
sendallMethod in class paramiko.Channel
sendall_stderrMethod in class paramiko.Channel
serverModule in package paramiko
set_combine_stderrMethod in class paramiko.Channel
set_file_attrMethod in class paramiko.SFTPServer
set_hexdumpMethod in class paramiko.Transport
set_keepaliveMethod in class paramiko.Transport
set_log_channelMethod in class paramiko.Transport
set_nameMethod in class paramiko.Channel
set_pipelinedMethod in class paramiko.SFTPFile
set_subsystem_handlerMethod in class paramiko.Transport
setblockingMethod in class paramiko.Channel
setblockingMethod in class paramiko.SFTPFile
setDaemonMethod in class threading.Thread
setNameMethod in class threading.Thread
settimeoutMethod in class paramiko.Channel
settimeoutMethod in class paramiko.SFTPFile
SFTPClass in package paramiko
sftpModule in package paramiko
sftp_attrModule in package paramiko
SFTP_BAD_MESSAGEVariable in module paramiko.sftp
sftp_clientModule in package paramiko
SFTP_CONNECTION_LOSTVariable in module paramiko.sftp
SFTP_DESCVariable in module paramiko.sftp
SFTP_EOFVariable in module paramiko.sftp
SFTP_FAILUREVariable in module paramiko.sftp
sftp_fileModule in package paramiko
SFTP_FLAG_APPENDVariable in module paramiko.sftp
SFTP_FLAG_CREATEVariable in module paramiko.sftp
SFTP_FLAG_EXCLVariable in module paramiko.sftp
SFTP_FLAG_READVariable in module paramiko.sftp
SFTP_FLAG_TRUNCVariable in module paramiko.sftp
SFTP_FLAG_WRITEVariable in module paramiko.sftp
sftp_handleModule in package paramiko
SFTP_NO_CONNECTIONVariable in module paramiko.sftp
SFTP_NO_SUCH_FILEVariable in module paramiko.sftp
SFTP_OKVariable in module paramiko.sftp
SFTP_OP_UNSUPPORTEDVariable in module paramiko.sftp
SFTP_PERMISSION_DENIEDVariable in module paramiko.sftp
sftp_serverModule in package paramiko
sftp_siModule in package paramiko
SFTPAttributesClass in package paramiko
SFTPClientClass in package paramiko
SFTPErrorClass in package paramiko
SFTPFileClass in package paramiko
SFTPHandleClass in package paramiko
SFTPServerClass in package paramiko
shutdownMethod in class paramiko.Channel
shutdown_readMethod in class paramiko.Channel
shutdown_writeMethod in class paramiko.Channel
sign_ssh_dataMethod in class paramiko.AgentKey
sign_ssh_dataMethod in class paramiko.DSSKey
sign_ssh_dataMethod in class paramiko.RSAKey
SSH2_AGENT_IDENTITIES_ANSWERVariable in module paramiko.agent
SSH2_AGENT_SIGN_RESPONSEVariable in module paramiko.agent
SSH2_AGENTC_REQUEST_IDENTITIESVariable in module paramiko.agent
SSH2_AGENTC_SIGN_REQUESTVariable in module paramiko.agent
SSHExceptionClass in package paramiko
startMethod in class threading.Thread
start_clientMethod in class paramiko.Transport
start_serverMethod in class paramiko.Transport
start_subsystemMethod in class paramiko.SFTPServer
start_subsystemMethod in class paramiko.SubsystemHandler
statMethod in class paramiko.SFTPClient
statMethod in class paramiko.SFTPFile
statMethod in class paramiko.SFTPHandle
stop_threadMethod in class paramiko.Transport
SubsystemHandlerClass in package paramiko
symlinkMethod in class paramiko.SFTPClient
tb_stringsFunction in module paramiko.util
tellMethod in class paramiko.BufferedFile
ThreadClass in module threading
TransportClass in package paramiko
transportModule in package paramiko
typeClass in module __builtin__
unhexifyFunction in module paramiko.util
use_compressionMethod in class paramiko.Transport
utilModule in package paramiko
utimeMethod in class paramiko.SFTPClient
verify_ssh_sigMethod in class paramiko.DSSKey
verify_ssh_sigMethod in class paramiko.RSAKey
writeMethod in class paramiko.BufferedFile
writeMethod in class paramiko.SFTPHandle
write_private_key_fileMethod in class paramiko.DSSKey
write_private_key_fileMethod in class paramiko.RSAKey
writelinesMethod in class paramiko.BufferedFile
xreadlinesMethod in class paramiko.BufferedFile
+
+ + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko-module.html b/docs/public/paramiko-module.html new file mode 100644 index 0000000..15da9ab --- /dev/null +++ b/docs/public/paramiko-module.html @@ -0,0 +1,229 @@ + + + + + paramiko + + + + + + + + + + + + + + + + + + +
+ + Package paramiko +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Package paramiko

+ +

Paramiko (a combination of the esperanto words for +"paranoid" and "friend") is a module for python 2.3 +or greater that implements the SSH2 protocol for secure (encrypted and +authenticated) connections to remote machines. Unlike SSL (aka TLS), the +SSH2 protocol does not require heirarchical certificates signed by a +powerful central authority. You may know SSH2 as the protocol that +replaced telnet and rsh for secure access to +remote shells, but the protocol also includes the ability to open +arbitrary channels to remote services across an encrypted tunnel. (This +is how sftp works, for example.)

+

To use this package, pass a socket (or socket-like object) to a Transport, and use start_server or start_client to negoatite with the remote +host as either a server or client. As a client, you are responsible for +authenticating using a password or private key, and checking the server's +host key. (Key signature and verification is done by paramiko, but you +will need to provide private keys and check that the content of a public +key matches what you expected to see.) As a server, you are +responsible for deciding which users, passwords, and keys to allow, and +what kind of channels to allow.

+

Once you have finished, either side may request flow-controlled Channels +to the other side, which are python objects that act like sockets, but +send and receive data over the encrypted session.

+

Paramiko is written entirely in python (no C or platform-dependent +code) and is released under the GNU Lesser General Public License +(LGPL).

+Website: http://www.lag.net/paramiko/ +
+

Version: 1.5.2 (rhydon) +

+ +

Author: Robey Pointer +

+ +

Contact: robey@lag.net +

+ +

License: GNU Lesser General Public License (LGPL) +

+ + + + + + + +
Submodules

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Classes
+ AgentClient interface for using private keys from an SSH agent running on +the local machine.
+ AgentKeyPrivate key held in a local SSH agent.
+ BufferedFileReusable base class to implement python-style file buffering around a +simpler stream.
+ ChannelA secure tunnel across an SSH Transport.
+ DSSKeyRepresentation of a DSS key which can be used to sign an verify SSH2 +data.
+ MessageAn SSH2 Message is a stream of bytes that encodes some +combination of strings, integers, bools, and infinite-precision integers +(known in python as longs).
+ RSAKeyRepresentation of an RSA key which can be used to sign and verify SSH2 +data.
+ SecurityOptionsSimple object containing the security preferences of an ssh +transport.
+ SFTPan alias for SFTPClient for backwards compatability
+ SFTPAttributesRepresentation of the attributes of a file (or proxied file) for SFTP +in client or server mode.
+ SFTPClientSFTP client object.
+ SFTPFileProxy object for a file on the remote server, in client mode SFTP.
+ SFTPHandleAbstract object representing a handle to an open file (or folder) in +an SFTP server implementation.
+ SFTPServerServer-side SFTP subsystem support.
+ SubsystemHandlerHandler for a subsytem in server mode.
+ TransportAn SSH Transport attaches to a stream (usually a socket), negotiates +an encrypted session, authenticates, and then creates stream tunnels, +called Channels, across the session.

+ + + + + + + + + + + + + + +
Exceptions
+ BadAuthenticationTypeException raised when an authentication type (like password) is used, +but the server isn't allowing that type.
+ PasswordRequiredExceptionException raised when a password is needed to unlock a private key +file.
+ SFTPError 
+ SSHExceptionException raised by failures in SSH2 protocol negotiation or logic +errors.

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.Agent-class.html b/docs/public/paramiko.Agent-class.html new file mode 100644 index 0000000..144efdf --- /dev/null +++ b/docs/public/paramiko.Agent-class.html @@ -0,0 +1,147 @@ + + + + + paramiko.Agent + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class Agent +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class Agent

+ +
+ +

Client interface for using private keys from an SSH agent running on +the local machine. If an SSH agent is running, this class can be used to +connect to it and retreive PKey objects which can be used when +attempting to authenticate to remote SSH servers.

+Because the SSH agent protocol uses environment variables and +unix-domain sockets, this probably doesn't work on Windows. It does work +on most posix platforms though (Linux and MacOS X, for example). +
+ + + + + + + + + + + + +
Method Summary
 __init__(self) +
+Open a session with the local machine's SSH agent, if one is +running.
 close(self) +
+Close the SSH agent connection.
tuple of AgentKey +get_keys(self) +
+Return the list of keys available through the SSH agent, if any.

+ + + + + + +
Method Details
+ + +
+

__init__(self) +
(Constructor) +

+ Open a session with the local machine's SSH agent, if one is + running. If no agent is running, initialization will succeed, but get_keys will return an empty tuple. +
+
Raises:
+
SSHException - + if an SSH agent is found, but speaks an incompatible + protocol +
+
+
+ + +
+

close(self) +

+ Close the SSH agent connection. +
+
+
+ + +
+

get_keys(self) +

+ Return the list of keys available through the SSH agent, if any. If + no SSH agent was running (or it couldn't be contacted), an empty list + will be returned. +
+
Returns:
+
+ a list of keys available on the SSH agent +
           + (type=tuple of AgentKey) +
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.AgentKey-class.html b/docs/public/paramiko.AgentKey-class.html new file mode 100644 index 0000000..203e0f4 --- /dev/null +++ b/docs/public/paramiko.AgentKey-class.html @@ -0,0 +1,236 @@ + + + + + paramiko.AgentKey + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class AgentKey +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type AgentKey

+ +
+object --+    
+         |    
+      PKey --+
+             |
+            AgentKey
+

+ +
+ +Private key held in a local SSH agent. This type of key can be used +for authenticating to a remote server (signing). Most other key +operations work as expected. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + agent, + blob) +
str +__str__(self) +
+Return a string of an SSH Message made up of the public part(s) of +this key.
str +get_name(self) +
+Return the name of this private key implementation.
Message +sign_ssh_data(self, + randpool, + data) +
+Sign a blob of data with this private key, and return a Message +representing an SSH signature message.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + +
Instance Method Details
+ + +
+

__str__(self) +
(Informal representation operator) +

+ Return a string of an SSH Message made up of the public part(s) of + this key. This string is suitable for passing to __init__ to re-create the key object + later. +
+
Returns:
+
+ string representation of an SSH key message. +
           + (type=str) +
+
+
Overrides:
+
paramiko.PKey.__str__ (inherited documentation) +
+
+
+
+ + +
+

get_name(self) +

+ Return the name of this private key implementation. +
+
Returns:
+
+ name of this private key type, in SSH terminology (for + example, "ssh-rsa"). +
           + (type=str) +
+
+
Overrides:
+
paramiko.PKey.get_name (inherited documentation) +
+
+
+
+ + +
+

sign_ssh_data(self, + randpool, + data) +

+ Sign a blob of data with this private key, and return a Message representing an SSH signature + message. +
+
Parameters:
+
randpool - + a secure random number generator. +
           + (type=Crypto.Util.randpool.RandomPool) +
data - + the data to sign. +
           + (type=str) +
+
+
Returns:
+
+ an SSH signature message. +
           + (type=Message) +
+
+
Overrides:
+
paramiko.PKey.sign_ssh_data (inherited documentation) +
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.BadAuthenticationType-class.html b/docs/public/paramiko.BadAuthenticationType-class.html new file mode 100644 index 0000000..27659ed --- /dev/null +++ b/docs/public/paramiko.BadAuthenticationType-class.html @@ -0,0 +1,141 @@ + + + + + paramiko.BadAuthenticationType + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class BadAuthenticationType +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class BadAuthenticationType

+ +
+Exception --+    
+            |    
+ SSHException --+
+                |
+               BadAuthenticationType
+

+ +
+ +Exception raised when an authentication type (like password) is used, +but the server isn't allowing that type. (It may only allow public-key, +for example.) +
+ +

Since: 1.1 +

+ + + + + + + + + + + + + + +
Method Summary
 __init__(self, + explanation, + types) +
 __str__(self) +
    Inherited from Exception
 __getitem__(...) +

+ + + + + + + + +
Instance Variable Summary
listallowed_types: list of allowed authentication types provided by the server (possible +values are: "none", +"password", and +"publickey").

+ + + + + + +
Instance Variable Details
+
+ +

allowed_types

+list of allowed authentication types provided by the server (possible +values are: "none", +"password", and +"publickey"). +
+
+
+
+
Type:
+
+ list + +
+
Value:
+
+
+[]                                                                     
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.BufferedFile-class.html b/docs/public/paramiko.BufferedFile-class.html new file mode 100644 index 0000000..535c74f --- /dev/null +++ b/docs/public/paramiko.BufferedFile-class.html @@ -0,0 +1,554 @@ + + + + + paramiko.BufferedFile + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class BufferedFile +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type BufferedFile

+ +
+object --+
+         |
+        BufferedFile
+

+ +
Known Subclasses:
+
+ SFTPFile
+ +
+ +Reusable base class to implement python-style file buffering around a +simpler stream. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self) +
 __del__(self) +
iterator +__iter__(self) +
+Returns an iterator that can be used to iterate over the lines in this +file.
 close(self) +
+Close the file.
 flush(self) +
+Write out any data in the write buffer.
str +next(self) +
+Returns the next line from the input, or raises +StopIteration when EOF is hit.
str +read(self, + size) +
+Read at most size bytes from the file (less if we hit the +end of the file first).
str +readline(self, + size) +
+Read one entire line from the file.
list +readlines(self, + sizehint) +
+Read all remaining lines using readline and return them as a list.
 seek(self, + offset, + whence) +
+Set the file's current position, like stdio's fseek.
int +tell(self) +
+Return the file's current position.
 write(self, + data) +
+Write data to the file.
 writelines(self, + sequence) +
+Write a sequence of strings to the file.
iterator +xreadlines(self) +
+Identical to iter(f).
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + + +
Class Variable Summary
intSEEK_CUR = 1                                                                     
intSEEK_END = 2                                                                     
intSEEK_SET = 0                                                                     

+ + + + + + +
Method Details
+ + +
+

__iter__(self) +

+ Returns an iterator that can be used to iterate over the lines in + this file. This iterator happens to return the file itself, since a + file is its own iterator. +
+
Returns:
+
+ an interator. +
           + (type=iterator) +
+
+
Raises:
+
ValueError - + if the file is closed. +
+
+
+ + +
+

close(self) +

+ Close the file. Future read and write operations will fail. +
+
+
+ + +
+

flush(self) +

+ Write out any data in the write buffer. This may do nothing if write + buffering is not turned on. +
+
+
+ + +
+

next(self) +

+ Returns the next line from the input, or raises + StopIteration when EOF is hit. Unlike python file objects, + it's okay to mix calls to next and readline. +
+
Returns:
+
+ a line read from the file. +
           + (type=str) +
+
+
Raises:
+
StopIteration - + when the end of the file is reached. +
+
+
+ + +
+

read(self, + size=None) +

+ Read at most size bytes from the file (less if we hit + the end of the file first). If the size argument is + negative or omitted, read all the remaining data in the file. +
+
Parameters:
+
size - + maximum number of bytes to read. +
           + (type=int) +
+
+
Returns:
+
+ data read from the file, or an empty string if EOF was + encountered immediately. +
           + (type=str) +
+
+
+
+ + +
+

readline(self, + size=None) +

+ Read one entire line from the file. A trailing newline character is + kept in the string (but may be absent when a file ends with an + incomplete line). If the size argument is present and non-negative, it + is a maximum byte count (including the trailing newline) and an + incomplete line may be returned. An empty string is returned only when + EOF is encountered immediately. +
+
Parameters:
+
size - + maximum length of returned string. +
           + (type=int) +
+
+
Returns:
+
+ next line of the file, or an empty string if the end of the + file has been reached. +
           + (type=str) +
+
+

Note: Unlike stdio's fgets(), the returned string contains null +characters ('\0') if they occurred in the input. +

+ +
+
+ + +
+

readlines(self, + sizehint=None) +

+ Read all remaining lines using readline and return them as a list. If + the optional sizehint argument is present, instead of + reading up to EOF, whole lines totalling approximately sizehint bytes + (possibly after rounding up to an internal buffer size) are read. +
+
Parameters:
+
sizehint - + desired maximum number of bytes to read. +
           + (type=int) +
+
+
Returns:
+
+ list of lines read from the file. +
           + (type=list) +
+
+
+
+ + +
+

seek(self, + offset, + whence=0) +

+ Set the file's current position, like stdio's fseek. + Not all file objects support seeking. +
+
Parameters:
+
offset - + position to move to within the file, relative to + whence. +
           + (type=int) +
whence - + type of movement: 0 = absolute; 1 = relative to the current + position; 2 = relative to the end of the file. +
           + (type=int) +
+
+
Raises:
+
IOError - + if the file doesn't support random access. +
+

Note: If a file is opened in append mode ('a' or +'a+'), any seek operations will be undone at the next write +(as the file position will move back to the end of the file). +

+ +
+
+ + +
+

tell(self) +

+ Return the file's current position. This may not be accurate or + useful if the underlying file doesn't support random access, or was + opened in append mode. +
+
Returns:
+
+ file position (in bytes). +
           + (type=int) +
+
+
+
+ + +
+

write(self, + data) +

+ Write data to the file. If write buffering is on + (bufsize was specified and non-zero), some or all of the + data may not actually be written yet. (Use flush or close to force buffered data to be + written out.) +
+
Parameters:
+
data - + data to write. +
           + (type=str) +
+
+
+
+ + +
+

writelines(self, + sequence) +

+ Write a sequence of strings to the file. The sequence can be any + iterable object producing strings, typically a list of strings. (The + name is intended to match readlines; writelines does + not add line separators.) +
+
Parameters:
+
sequence - + an iterable sequence of strings. +
           + (type=sequence) +
+
+
+
+ + +
+

xreadlines(self) +

+ Identical to iter(f). This is a deprecated file + interface that predates python iterator support. +
+
Returns:
+
+ an iterator. +
           + (type=iterator) +
+
+
+
+
+ + + + + + +
Class Variable Details
+
+ +

SEEK_CUR

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1                                                                     
+
+
+
+
+
+ +

SEEK_END

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ +

SEEK_SET

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+0                                                                     
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.Channel-class.html b/docs/public/paramiko.Channel-class.html new file mode 100644 index 0000000..89bff06 --- /dev/null +++ b/docs/public/paramiko.Channel-class.html @@ -0,0 +1,1241 @@ + + + + + paramiko.Channel + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class Channel +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type Channel

+ +
+object --+
+         |
+        Channel
+

+ +
+ +

A secure tunnel across an SSH Transport. A Channel is meant to behave +like a socket, and has an API that should be indistinguishable from the +python socket API.

+Because SSH2 has a windowing kind of flow control, if you stop reading +data from a Channel and its buffer fills up, the server will be unable to +send you any more data until you read some of it. (This won't affect +other channels on the same transport -- all channels on a single +transport are flow-controlled independently.) Similarly, if the server +isn't reading data you send, calls to send may block, unless you set a timeout. +This is exactly like a normal network socket, so it shouldn't be too +surprising. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + chanid) +
+Create a new channel.
 __del__(self) +
str +__repr__(self) +
+Return a string representation of this object, for debugging.
 close(self) +
+Close the channel.
bool +exec_command(self, + command) +
+Execute a command on the server.
int +fileno(self) +
+Returns an OS-level file descriptor which can be used for polling, but +but not for reading or writing).
int +get_id(self) +
+Return the ID # for this channel.
str +get_name(self) +
+Get the name of this channel that was previously set by set_name.
bool +get_pty(self, + term, + width, + height) +
+Request a pseudo-terminal from the server.
Transport +get_transport(self) +
+Return the Transport associated with this channel.
float +gettimeout(self) +
+Returns the timeout in seconds (as a float) associated with socket +operations, or None if no timeout is set.
bool +invoke_shell(self) +
+Request an interactive shell session on this channel.
bool +invoke_subsystem(self, + subsystem) +
+Request a subsystem on the server (for example, +sftp).
ChannelFile +makefile(self, + *params) +
+Return a file-like object associated with this channel.
ChannelFile +makefile_stderr(self, + *params) +
+Return a file-like object associated with this channel's stderr +stream.
str +recv(self, + nbytes) +
+Receive data from the channel.
int +recv_exit_status(self) +
+Return the exit status from the process on the server.
boolean +recv_ready(self) +
+Returns true if data is buffered and ready to be read from this +channel.
str +recv_stderr(self, + nbytes) +
+Receive data from the channel's stderr stream.
boolean +recv_stderr_ready(self) +
+Returns true if data is buffered and ready to be read from this +channel's stderr stream.
bool +resize_pty(self, + width, + height) +
+Resize the pseudo-terminal.
int +send(self, + s) +
+Send data to the channel.
 send_exit_status(self, + status) +
+Send the exit status of an executed command to the client.
int +send_stderr(self, + s) +
+Send data to the channel on the "stderr" stream.
 sendall(self, + s) +
+Send data to the channel, without allowing partial results.
 sendall_stderr(self, + s) +
+Send data to the channel's "stderr" stream, without allowing +partial results.
bool +set_combine_stderr(self, + combine) +
+Set whether stderr should be combined into stdout on this channel.
 set_name(self, + name) +
+Set a name for this channel.
 setblocking(self, + blocking) +
+Set blocking or non-blocking mode of the channel: if +blocking is 0, the channel is set to non-blocking mode; +otherwise it's set to blocking mode.
 settimeout(self, + timeout) +
+Set a timeout on blocking read/write operations.
 shutdown(self, + how) +
+Shut down one or both halves of the connection.
 shutdown_read(self) +
+Shutdown the receiving side of this socket, closing the stream in the +incoming direction.
 shutdown_write(self) +
+Shutdown the sending side of this socket, closing the stream in the +outgoing direction.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + +
Class Variable Summary
intMIN_PACKET_SIZE = 1024                                                                  

+ + + + + + +
Method Details
+ + +
+

__init__(self, + chanid) +
(Constructor) +

+ Create a new channel. The channel is not associated with any + particular session or Transport until the Transport attaches + it. Normally you would only call this method from the constructor of a + subclass of Channel. +
+
Parameters:
+
chanid - + the ID of this channel, as passed by an existing Transport. +
           + (type=int) +
+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

__repr__(self) +
(Representation operator) +

+ Return a string representation of this object, for debugging. +
+
Returns:
+
+ str +
+
+
Overrides:
+
__builtin__.object.__repr__
+
+
+
+ + +
+

close(self) +

+ Close the channel. All future read/write operations on the channel + will fail. The remote end will receive no more data (after queued data + is flushed). Channels are automatically closed when their Transport is closed or when they are + garbage collected. +
+
+
+ + +
+

exec_command(self, + command) +

+

Execute a command on the server. If the server allows it, the + channel will then be directly connected to the stdin, stdout, and + stderr of the command being executed.

+ When the command finishes executing, the channel will be closed and + can't be reused. You must open a new channel if you wish to execute + another command. +
+
Parameters:
+
command - + a shell command to execute. +
           + (type=str) +
+
+
Returns:
+
+ True if the operation succeeded; + False if not. +
           + (type=bool) +
+
+
+
+ + +
+

fileno(self) +

+

Returns an OS-level file descriptor which can be used for polling, + but but not for reading or writing). This is primaily to allow + python's select module to work.

+ The first time fileno is called on a channel, a pipe is + created to simulate real OS-level file descriptor (FD) behavior. + Because of this, two OS-level FDs are created, which will use up FDs + faster than normal. You won't notice this effect unless you open + hundreds or thousands of channels simultaneously, but it's still + notable. +
+
Returns:
+
+ an OS-level file descriptor +
           + (type=int) +
+
+

Warning: This method causes channel reads to be slightly less efficient. +

+ +
+
+ + +
+

get_id(self) +

+ Return the ID # for this channel. The channel ID is unique across a + Transport and usually a small number. + It's also the number passed to ServerInterface.check_channel_request + when determining whether to accept a channel request in server + mode. +
+
Returns:
+
+ the ID of this channel. +
           + (type=int) +
+
+

Since: ivysaur +

+ +
+
+ + +
+

get_name(self) +

+ Get the name of this channel that was previously set by set_name. +
+
Returns:
+
+ the name of this channel. +
           + (type=str) +
+
+
+
+ + +
+

get_pty(self, + term='vt100', + width=80, + height=24) +

+ Request a pseudo-terminal from the server. This is usually used + right after creating a client channel, to ask the server to provide + some basic terminal semantics for a shell invoked with invoke_shell. It isn't necessary (or + desirable) to call this method if you're going to exectue a single + command with exec_command. +
+
Parameters:
+
term - + the terminal type to emulate (for example, + 'vt100'). +
           + (type=str) +
width - + width (in characters) of the terminal screen +
           + (type=int) +
height - + height (in characters) of the terminal screen +
           + (type=int) +
+
+
Returns:
+
+ True if the operation succeeded; + False if not. +
           + (type=bool) +
+
+
+
+ + +
+

get_transport(self) +

+ Return the Transport associated with this + channel. +
+
Returns:
+
+ the Transport that was used to create + this channel. +
           + (type=Transport) +
+
+
+
+ + +
+

gettimeout(self) +

+ Returns the timeout in seconds (as a float) associated with socket + operations, or None if no timeout is set. This reflects + the last call to setblocking or settimeout. +
+
Returns:
+
+ timeout in seconds, or None. +
           + (type=float) +
+
+
+
+ + +
+

invoke_shell(self) +

+

Request an interactive shell session on this channel. If the server + allows it, the channel will then be directly connected to the stdin, + stdout, and stderr of the shell.

+

Normally you would call get_pty before this, in which case the + shell will operate through the pty, and the channel will be connected + to the stdin and stdout of the pty.

+ When the shell exits, the channel will be closed and can't be + reused. You must open a new channel if you wish to open another + shell. +
+
Returns:
+
+ True if the operation succeeded; + False if not. +
           + (type=bool) +
+
+
+
+ + +
+

invoke_subsystem(self, + subsystem) +

+

Request a subsystem on the server (for example, sftp). + If the server allows it, the channel will then be directly connected to + the requested subsystem.

+ When the subsystem finishes, the channel will be closed and can't be + reused. +
+
Parameters:
+
subsystem - + name of the subsystem being requested. +
           + (type=str) +
+
+
Returns:
+
+ True if the operation succeeded; + False if not. +
           + (type=bool) +
+
+
+
+ + +
+

makefile(self, + *params) +

+ Return a file-like object associated with this channel. The optional + mode and bufsize arguments are interpreted + the same way as by the built-in file() function in + python. +
+
Returns:
+
+ object which can be used for python file I/O. +
           + (type=ChannelFile) +
+
+
+
+ + +
+

makefile_stderr(self, + *params) +

+

Return a file-like object associated with this channel's stderr + stream. Only channels using exec_command or invoke_shell without a pty will ever have + data on the stderr stream.

+ The optional mode and bufsize arguments + are interpreted the same way as by the built-in file() + function in python. For a client, it only makes sense to open this file + for reading. For a server, it only makes sense to open this file for + writing. +
+
Returns:
+
+ object which can be used for python file I/O. +
           + (type=ChannelFile) +
+
+

Since: 1.1 +

+ +
+
+ + +
+

recv(self, + nbytes) +

+ Receive data from the channel. The return value is a string + representing the data received. The maximum amount of data to be + received at once is specified by nbytes. If a string of + length zero is returned, the channel stream has closed. +
+
Parameters:
+
nbytes - + maximum number of bytes to read. +
           + (type=int) +
+
+
Returns:
+
+ data. +
           + (type=str) +
+
+
Raises:
+
socket.timeout - + if no data is ready before the timeout set by settimeout. +
+
+
+ + +
+

recv_exit_status(self) +

+ Return the exit status from the process on the server. This is + mostly useful for retrieving the reults of an exec_command. If the command hasn't + finished yet, this method will wait until it does, or until the channel + is closed. If no exit status is provided by the server, -1 is + returned. +
+
Returns:
+
+ the exit code of the process on the server. +
           + (type=int) +
+
+

Since: 1.2 +

+ +
+
+ + +
+

recv_ready(self) +

+ Returns true if data is buffered and ready to be read from this + channel. A False result does not mean that the channel has + closed; it means you may need to wait before more data arrives. +
+
Returns:
+
+ True if a recv call on this channel would + immediately return at least one byte; False + otherwise. +
           + (type=boolean) +
+
+
+
+ + +
+

recv_stderr(self, + nbytes) +

+ Receive data from the channel's stderr stream. Only channels using + exec_command or invoke_shell without a pty will ever have + data on the stderr stream. The return value is a string representing + the data received. The maximum amount of data to be received at once is + specified by nbytes. If a string of length zero is + returned, the channel stream has closed. +
+
Parameters:
+
nbytes - + maximum number of bytes to read. +
           + (type=int) +
+
+
Returns:
+
+ data. +
           + (type=str) +
+
+
Raises:
+
socket.timeout - + if no data is ready before the timeout set by settimeout. +
+

Since: 1.1 +

+ +
+
+ + +
+

recv_stderr_ready(self) +

+ Returns true if data is buffered and ready to be read from this + channel's stderr stream. Only channels using exec_command or invoke_shell without a pty will ever have + data on the stderr stream. +
+
Returns:
+
+ True if a recv_stderr call on this channel + would immediately return at least one byte; False + otherwise. +
           + (type=boolean) +
+
+

Since: 1.1 +

+ +
+
+ + +
+

resize_pty(self, + width=80, + height=24) +

+ Resize the pseudo-terminal. This can be used to change the width and + height of the terminal emulation created in a previous get_pty call. +
+
Parameters:
+
width - + new width (in characters) of the terminal screen +
           + (type=int) +
height - + new height (in characters) of the terminal screen +
           + (type=int) +
+
+
Returns:
+
+ True if the operation succeeded; + False if not. +
           + (type=bool) +
+
+
+
+ + +
+

send(self, + s) +

+ Send data to the channel. Returns the number of bytes sent, or 0 if + the channel stream is closed. Applications are responsible for checking + that all data has been sent: if only some of the data was transmitted, + the application needs to attempt delivery of the remaining data. +
+
Parameters:
+
s - + data to send. +
           + (type=str) +
+
+
Returns:
+
+ number of bytes actually sent. +
           + (type=int) +
+
+
Raises:
+
socket.timeout - + if no data could be sent before the timeout set by settimeout. +
+
+
+ + +
+

send_exit_status(self, + status) +

+ Send the exit status of an executed command to the client. (This + really only makes sense in server mode.) Many clients expect to get + some sort of status code back from an executed command after it + completes. +
+
Parameters:
+
status - + the exit code of the process +
           + (type=int) +
+
+

Since: 1.2 +

+ +
+
+ + +
+

send_stderr(self, + s) +

+ Send data to the channel on the "stderr" stream. This is + normally only used by servers to send output from shell commands -- + clients won't use this. Returns the number of bytes sent, or 0 if the + channel stream is closed. Applications are responsible for checking + that all data has been sent: if only some of the data was transmitted, + the application needs to attempt delivery of the remaining data. +
+
Parameters:
+
s - + data to send. +
           + (type=str) +
+
+
Returns:
+
+ number of bytes actually sent. +
           + (type=int) +
+
+
Raises:
+
socket.timeout - + if no data could be sent before the timeout set by settimeout. +
+

Since: 1.1 +

+ +
+
+ + +
+

sendall(self, + s) +

+ Send data to the channel, without allowing partial results. Unlike + send, this method continues to send data + from the given string until either all data has been sent or an error + occurs. Nothing is returned. +
+
Parameters:
+
s - + data to send. +
           + (type=str) +
+
+
Raises:
+
socket.timeout - + if sending stalled for longer than the timeout set by settimeout. +
socket.error - + if an error occured before the entire string was sent. +
+

Note: If the channel is closed while only part of the data hase been sent, +there is no way to determine how much data (if any) was sent. This is +irritating, but identically follows python's API. +

+ +
+
+ + +
+

sendall_stderr(self, + s) +

+ Send data to the channel's "stderr" stream, without + allowing partial results. Unlike send_stderr, this method continues to + send data from the given string until all data has been sent or an + error occurs. Nothing is returned. +
+
Parameters:
+
s - + data to send to the client as "stderr" output. +
           + (type=str) +
+
+
Raises:
+
socket.timeout - + if sending stalled for longer than the timeout set by settimeout. +
socket.error - + if an error occured before the entire string was sent. +
+

Since: 1.1 +

+ +
+
+ + +
+

set_combine_stderr(self, + combine) +

+

Set whether stderr should be combined into stdout on this channel. + The default is False, but in some cases it may be + convenient to have both streams combined.

+

If this is False, and exec_command is called (or + invoke_shell with no pty), output to stderr will not show + up through the recv and recv_ready calls. You will have to use recv_stderr and recv_stderr_ready to get stderr + output.

+ If this is True, data will never show up via recv_stderr or recv_stderr_ready. +
+
Parameters:
+
combine - + True if stderr output should be combined into + stdout on this channel. +
           + (type=bool) +
+
+
Returns:
+
+ previous setting. +
           + (type=bool) +
+
+

Since: 1.1 +

+ +
+
+ + +
+

set_name(self, + name) +

+ Set a name for this channel. Currently it's only used to set the + name of the log level used for debugging. The name can be fetched with + the get_name method. +
+
Parameters:
+
name - + new channel name. +
           + (type=str) +
+
+
+
+ + +
+

setblocking(self, + blocking) +

+

Set blocking or non-blocking mode of the channel: if + blocking is 0, the channel is set to non-blocking mode; + otherwise it's set to blocking mode. Initially all channels are in + blocking mode.

+

In non-blocking mode, if a recv call doesn't find any data, or if a + send call can't immediately dispose of + the data, an error exception is raised. In blocking mode, the calls + block until they can proceed.

+ chan.setblocking(0) is equivalent to + chan.settimeout(0); chan.setblocking(1) is + equivalent to chan.settimeout(None). +
+
Parameters:
+
blocking - + 0 to set non-blocking mode; non-0 to set blocking mode. +
           + (type=int) +
+
+
+
+ + +
+

settimeout(self, + timeout) +

+

Set a timeout on blocking read/write operations. The + timeout argument can be a nonnegative float expressing + seconds, or None. If a float is given, subsequent channel + read/write operations will raise a timeout exception if the timeout + period value has elapsed before the operation has completed. Setting a + timeout of None disables timeouts on socket + operations.

+ chan.settimeout(0.0) is equivalent to + chan.setblocking(0); chan.settimeout(None) is + equivalent to chan.setblocking(1). +
+
Parameters:
+
timeout - + seconds to wait for a pending read/write operation before + raising socket.timeout, or None for no + timeout. +
           + (type=float) +
+
+
+
+ + +
+

shutdown(self, + how) +

+ Shut down one or both halves of the connection. If how + is 0, further receives are disallowed. If how is 1, + further sends are disallowed. If how is 2, further sends + and receives are disallowed. This closes the stream in one or both + directions. +
+
Parameters:
+
how - + 0 (stop receiving), 1 (stop sending), or 2 (stop receiving and + sending). +
           + (type=int) +
+
+
+
+ + +
+

shutdown_read(self) +

+ Shutdown the receiving side of this socket, closing the stream in + the incoming direction. After this call, future reads on this channel + will fail instantly. This is a convenience method, equivalent to + shutdown(0), for people who don't make it a habit to + memorize unix constants from the 1970s. +
+

Since: 1.2 +

+ +
+
+ + +
+

shutdown_write(self) +

+ Shutdown the sending side of this socket, closing the stream in the + outgoing direction. After this call, future writes on this channel will + fail instantly. This is a convenience method, equivalent to + shutdown(1), for people who don't make it a habit to + memorize unix constants from the 1970s. +
+

Since: 1.2 +

+ +
+
+
+ + + + + + +
Class Variable Details
+
+ +

MIN_PACKET_SIZE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1024                                                                  
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.DSSKey-class.html b/docs/public/paramiko.DSSKey-class.html new file mode 100644 index 0000000..f36e784 --- /dev/null +++ b/docs/public/paramiko.DSSKey-class.html @@ -0,0 +1,423 @@ + + + + + paramiko.DSSKey + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class DSSKey +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type DSSKey

+ +
+object --+    
+         |    
+      PKey --+
+             |
+            DSSKey
+

+ +
+ +Representation of a DSS key which can be used to sign an verify SSH2 +data. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + msg, + data) +
+Create a new instance of this public key type.
 __hash__(self) +
str +__str__(self) +
+Return a string of an SSH Message made up of the public part(s) of +this key.
bool +can_sign(self) +
+Return True if this key has the private part necessary +for signing data.
DSSKey +generate(bits, + progress_func) +
+Generate a new private DSS key. (Static method) +
int +get_bits(self) +
+Return the number of significant bits in this key.
str +get_name(self) +
+Return the name of this private key implementation.
 sign_ssh_data(self, + rpool, + data) +
boolean +verify_ssh_sig(self, + data, + msg) +
+Given a blob of data, and an SSH message representing a signature of +that data, verify that it was signed with this key.
 write_private_key_file(self, + filename, + password) +
+Write private key contents into a file.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + +
Instance Method Details
+ + +
+

__init__(self, + msg=None, + data=None, + filename=None, + password=None, + vals=None) +
(Constructor) +

+ Create a new instance of this public key type. If msg + is given, the key's public part(s) will be filled in from the message. + If data is given, the key's public part(s) will be filled + in from the string. +
+
Parameters:
+
msg - + an optional SSH Message containing a public key of + this type. +
           + (type=Message) +
data - + an optional string containing a public key of this type +
           + (type=str) +
+
+
Raises:
+
SSHException - + if a key cannot be created from the data or + msg given, or no key was passed in. +
+
Overrides:
+
paramiko.PKey.__init__ (inherited documentation) +
+
+
+
+ + +
+

__str__(self) +
(Informal representation operator) +

+ Return a string of an SSH Message made up of the public part(s) of + this key. This string is suitable for passing to __init__ to re-create the key object + later. +
+
Returns:
+
+ string representation of an SSH key message. +
           + (type=str) +
+
+
Overrides:
+
paramiko.PKey.__str__ (inherited documentation) +
+
+
+
+ + +
+

can_sign(self) +

+ Return True if this key has the private part necessary + for signing data. +
+
Returns:
+
+ True if this is a private key. +
           + (type=bool) +
+
+
Overrides:
+
paramiko.PKey.can_sign (inherited documentation) +
+
+
+
+ + +
+

get_bits(self) +

+ Return the number of significant bits in this key. This is useful + for judging the relative security of a key. +
+
Returns:
+
+ bits in the key. +
           + (type=int) +
+
+
Overrides:
+
paramiko.PKey.get_bits (inherited documentation) +
+
+
+
+ + +
+

get_name(self) +

+ Return the name of this private key implementation. +
+
Returns:
+
+ name of this private key type, in SSH terminology (for + example, "ssh-rsa"). +
           + (type=str) +
+
+
Overrides:
+
paramiko.PKey.get_name (inherited documentation) +
+
+
+
+ + +
+

verify_ssh_sig(self, + data, + msg) +

+ Given a blob of data, and an SSH message representing a signature of + that data, verify that it was signed with this key. +
+
Parameters:
+
data - + the data that was signed. +
           + (type=str) +
msg - + an SSH signature message +
           + (type=Message) +
+
+
Returns:
+
+ True if the signature verifies correctly; + False otherwise. +
           + (type=boolean) +
+
+
Overrides:
+
paramiko.PKey.verify_ssh_sig (inherited documentation) +
+
+
+
+ + +
+

write_private_key_file(self, + filename, + password=None) +

+ Write private key contents into a file. If the password is not + None, the key is encrypted before writing. +
+
Parameters:
+
filename - + name of the file to write. +
           + (type=str) +
password - + an optional password to use to encrypt the key file. +
           + (type=str) +
+
+
Raises:
+
IOError - + if there was an error writing the file. +
SSHException - + if the key is invalid. +
+
Overrides:
+
paramiko.PKey.write_private_key_file (inherited documentation) +
+
+

Since: fearow +

+ +
+
+
+ + + + + + +
Static Method Details
+ + +
+

generate(bits=1024, + progress_func=None) +

+ Generate a new private DSS key. This factory function can be used to + generate a new host key or authentication key. +
+
Parameters:
+
bits - + number of bits the generated key should be. +
           + (type=int) +
progress_func - + an optional function to call at key points in key generation + (used by pyCrypto.PublicKey). +
           + (type=function) +
+
+
Returns:
+
+ new private key +
           + (type=DSSKey) +
+
+

Since: fearow +

+ +
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.Message-class.html b/docs/public/paramiko.Message-class.html new file mode 100644 index 0000000..7f097f8 --- /dev/null +++ b/docs/public/paramiko.Message-class.html @@ -0,0 +1,650 @@ + + + + + paramiko.Message + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class Message +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type Message

+ +
+object --+
+         |
+        Message
+

+ +
+ +

An SSH2 Message is a stream of bytes that encodes some +combination of strings, integers, bools, and infinite-precision integers +(known in python as longs). This class builds or breaks down such +a byte stream.

+Normally you don't need to deal with anything this low-level, but it's +exposed for people implementing custom extensions, or features that +paramiko doesn't support yet. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + content) +
+Create a new SSH2 Message.
string +__repr__(self) +
+Returns a string representation of this object, for debugging.
string +__str__(self) +
+Return the byte stream content of this Message, as a string.
 add(self, + *seq) +
+Add a sequence of items to the stream.
 add_boolean(self, + b) +
+Add a boolean value to the stream.
 add_byte(self, + b) +
+Write a single byte to the stream, without any formatting.
 add_bytes(self, + b) +
+Write bytes to the stream, without any formatting.
 add_int(self, + n) +
+Add an integer to the stream.
 add_int64(self, + n) +
+Add a 64-bit int to the stream.
 add_list(self, + l) +
+Add a list of strings to the stream.
 add_mpint(self, + z) +
+Add a long int to the stream, encoded as an infinite-precision +integer.
 add_string(self, + s) +
+Add a string to the stream.
bool +get_boolean(self) +
+Fetch a boolean from the stream.
string +get_byte(self) +
+Return the next byte of the Message, without decomposing it.
string +get_bytes(self, + n) +
+Return the next n bytes of the Message, without +decomposing into an int, string, etc.
int +get_int(self) +
+Fetch an int from the stream.
long +get_int64(self) +
+Fetch a 64-bit int from the stream.
list of strings +get_list(self) +
+Fetch a list of strings from the stream.
long +get_mpint(self) +
+Fetch a long int (mpint) from the stream.
string +get_remainder(self) +
+Return the bytes of this Message that haven't already been parsed and +returned.
string +get_so_far(self) +
+Returns the bytes of this Message that have been parsed and +returned.
string +get_string(self) +
+Fetch a string from the stream.
 rewind(self) +
+Rewind the message to the beginning as if no items had been parsed out +of it yet.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + +
Method Details
+ + +
+

__init__(self, + content=None) +
(Constructor) +

+ Create a new SSH2 Message. +
+
Parameters:
+
content - + the byte stream to use as the Message content (passed in only + when decomposing a Message). +
           + (type=string) +
+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

__repr__(self) +
(Representation operator) +

+ Returns a string representation of this object, for debugging. +
+
Returns:
+
+ string +
+
+
Overrides:
+
__builtin__.object.__repr__
+
+
+
+ + +
+

__str__(self) +
(Informal representation operator) +

+ Return the byte stream content of this Message, as a string. +
+
Returns:
+
+ the contents of this Message. +
           + (type=string) +
+
+
Overrides:
+
__builtin__.object.__str__
+
+
+
+ + +
+

add(self, + *seq) +

+ Add a sequence of items to the stream. The values are encoded based + on their type: str, int, bool, list, or long. +
+
Parameters:
+
seq - + the sequence of items +
           + (type=sequence) +
+
+

Bug: longs are encoded non-deterministically. Don't use this method. +

+ +
+
+ + +
+

add_boolean(self, + b) +

+ Add a boolean value to the stream. +
+
Parameters:
+
b - + boolean value to add +
           + (type=bool) +
+
+
+
+ + +
+

add_byte(self, + b) +

+ Write a single byte to the stream, without any formatting. +
+
Parameters:
+
b - + byte to add +
           + (type=str) +
+
+
+
+ + +
+

add_bytes(self, + b) +

+ Write bytes to the stream, without any formatting. +
+
Parameters:
+
b - + bytes to add +
           + (type=str) +
+
+
+
+ + +
+

add_int(self, + n) +

+ Add an integer to the stream. +
+
Parameters:
+
n - + integer to add +
           + (type=int) +
+
+
+
+ + +
+

add_int64(self, + n) +

+ Add a 64-bit int to the stream. +
+
Parameters:
+
n - + long int to add +
           + (type=long) +
+
+
+
+ + +
+

add_list(self, + l) +

+ Add a list of strings to the stream. They are encoded identically to + a single string of values separated by commas. (Yes, really, that's how + SSH2 does it.) +
+
Parameters:
+
l - + list of strings to add +
           + (type=list(str)) +
+
+
+
+ + +
+

add_mpint(self, + z) +

+ Add a long int to the stream, encoded as an infinite-precision + integer. This method only works on positive numbers. +
+
Parameters:
+
z - + long int to add +
           + (type=long) +
+
+
+
+ + +
+

add_string(self, + s) +

+ Add a string to the stream. +
+
Parameters:
+
s - + string to add +
           + (type=str) +
+
+
+
+ + +
+

get_boolean(self) +

+ Fetch a boolean from the stream. +
+
Returns:
+
+ True or False (from the + Message). +
           + (type=bool) +
+
+
+
+ + +
+

get_byte(self) +

+ Return the next byte of the Message, without decomposing it. This is + equivalent to get_bytes(1). +
+
Returns:
+
+ the next byte of the Message, or '' if there + aren't any bytes remaining. +
           + (type=string) +
+
+
+
+ + +
+

get_bytes(self, + n) +

+ Return the next n bytes of the Message, without + decomposing into an int, string, etc. Just the raw bytes are + returned. +
+
Returns:
+
+ a string of the next n bytes of the Message, or a + string of n zero bytes, if there aren't + n bytes remaining. +
           + (type=string) +
+
+
+
+ + +
+

get_int(self) +

+ Fetch an int from the stream. +
+
Returns:
+
+ a 32-bit unsigned integer. +
           + (type=int) +
+
+
+
+ + +
+

get_int64(self) +

+ Fetch a 64-bit int from the stream. +
+
Returns:
+
+ a 64-bit unsigned integer. +
           + (type=long) +
+
+
+
+ + +
+

get_list(self) +

+ Fetch a list of strings from the stream. These are trivially encoded + as comma-separated values in a string. +
+
Returns:
+
+ a list of strings. +
           + (type=list of strings) +
+
+
+
+ + +
+

get_mpint(self) +

+ Fetch a long int (mpint) from the stream. +
+
Returns:
+
+ an arbitrary-length integer. +
           + (type=long) +
+
+
+
+ + +
+

get_remainder(self) +

+ Return the bytes of this Message that haven't already been parsed + and returned. +
+
Returns:
+
+ a string of the bytes not parsed yet. +
           + (type=string) +
+
+
+
+ + +
+

get_so_far(self) +

+ Returns the bytes of this Message that have been parsed and + returned. The string passed into a Message's constructor can be + regenerated by concatenating get_so_far and get_remainder. +
+
Returns:
+
+ a string of the bytes parsed so far. +
           + (type=string) +
+
+
+
+ + +
+

get_string(self) +

+ Fetch a string from the stream. This could be a byte string and may + contain unprintable characters. (It's not unheard of for a string to + contain another byte-stream Message.) +
+
Returns:
+
+ a string. +
           + (type=string) +
+
+
+
+ + +
+

rewind(self) +

+ Rewind the message to the beginning as if no items had been parsed + out of it yet. +
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:46 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.PasswordRequiredException-class.html b/docs/public/paramiko.PasswordRequiredException-class.html new file mode 100644 index 0000000..3d05e9c --- /dev/null +++ b/docs/public/paramiko.PasswordRequiredException-class.html @@ -0,0 +1,91 @@ + + + + + paramiko.PasswordRequiredException + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class PasswordRequiredException +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class PasswordRequiredException

+ +
+Exception --+    
+            |    
+ SSHException --+
+                |
+               PasswordRequiredException
+

+ +
+ +Exception raised when a password is needed to unlock a private key +file. +
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.RSAKey-class.html b/docs/public/paramiko.RSAKey-class.html new file mode 100644 index 0000000..168a684 --- /dev/null +++ b/docs/public/paramiko.RSAKey-class.html @@ -0,0 +1,423 @@ + + + + + paramiko.RSAKey + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class RSAKey +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type RSAKey

+ +
+object --+    
+         |    
+      PKey --+
+             |
+            RSAKey
+

+ +
+ +Representation of an RSA key which can be used to sign and verify SSH2 +data. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + msg, + data) +
+Create a new instance of this public key type.
 __hash__(self) +
str +__str__(self) +
+Return a string of an SSH Message made up of the public part(s) of +this key.
bool +can_sign(self) +
+Return True if this key has the private part necessary +for signing data.
RSAKey +generate(bits, + progress_func) +
+Generate a new private RSA key. (Static method) +
int +get_bits(self) +
+Return the number of significant bits in this key.
str +get_name(self) +
+Return the name of this private key implementation.
 sign_ssh_data(self, + rpool, + data) +
boolean +verify_ssh_sig(self, + data, + msg) +
+Given a blob of data, and an SSH message representing a signature of +that data, verify that it was signed with this key.
 write_private_key_file(self, + filename, + password) +
+Write private key contents into a file.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + +
Instance Method Details
+ + +
+

__init__(self, + msg=None, + data=None, + filename=None, + password=None, + vals=None) +
(Constructor) +

+ Create a new instance of this public key type. If msg + is given, the key's public part(s) will be filled in from the message. + If data is given, the key's public part(s) will be filled + in from the string. +
+
Parameters:
+
msg - + an optional SSH Message containing a public key of + this type. +
           + (type=Message) +
data - + an optional string containing a public key of this type +
           + (type=str) +
+
+
Raises:
+
SSHException - + if a key cannot be created from the data or + msg given, or no key was passed in. +
+
Overrides:
+
paramiko.PKey.__init__ (inherited documentation) +
+
+
+
+ + +
+

__str__(self) +
(Informal representation operator) +

+ Return a string of an SSH Message made up of the public part(s) of + this key. This string is suitable for passing to __init__ to re-create the key object + later. +
+
Returns:
+
+ string representation of an SSH key message. +
           + (type=str) +
+
+
Overrides:
+
paramiko.PKey.__str__ (inherited documentation) +
+
+
+
+ + +
+

can_sign(self) +

+ Return True if this key has the private part necessary + for signing data. +
+
Returns:
+
+ True if this is a private key. +
           + (type=bool) +
+
+
Overrides:
+
paramiko.PKey.can_sign (inherited documentation) +
+
+
+
+ + +
+

get_bits(self) +

+ Return the number of significant bits in this key. This is useful + for judging the relative security of a key. +
+
Returns:
+
+ bits in the key. +
           + (type=int) +
+
+
Overrides:
+
paramiko.PKey.get_bits (inherited documentation) +
+
+
+
+ + +
+

get_name(self) +

+ Return the name of this private key implementation. +
+
Returns:
+
+ name of this private key type, in SSH terminology (for + example, "ssh-rsa"). +
           + (type=str) +
+
+
Overrides:
+
paramiko.PKey.get_name (inherited documentation) +
+
+
+
+ + +
+

verify_ssh_sig(self, + data, + msg) +

+ Given a blob of data, and an SSH message representing a signature of + that data, verify that it was signed with this key. +
+
Parameters:
+
data - + the data that was signed. +
           + (type=str) +
msg - + an SSH signature message +
           + (type=Message) +
+
+
Returns:
+
+ True if the signature verifies correctly; + False otherwise. +
           + (type=boolean) +
+
+
Overrides:
+
paramiko.PKey.verify_ssh_sig (inherited documentation) +
+
+
+
+ + +
+

write_private_key_file(self, + filename, + password=None) +

+ Write private key contents into a file. If the password is not + None, the key is encrypted before writing. +
+
Parameters:
+
filename - + name of the file to write. +
           + (type=str) +
password - + an optional password to use to encrypt the key file. +
           + (type=str) +
+
+
Raises:
+
IOError - + if there was an error writing the file. +
SSHException - + if the key is invalid. +
+
Overrides:
+
paramiko.PKey.write_private_key_file (inherited documentation) +
+
+

Since: fearow +

+ +
+
+
+ + + + + + +
Static Method Details
+ + +
+

generate(bits, + progress_func=None) +

+ Generate a new private RSA key. This factory function can be used to + generate a new host key or authentication key. +
+
Parameters:
+
bits - + number of bits the generated key should be. +
           + (type=int) +
progress_func - + an optional function to call at key points in key generation + (used by pyCrypto.PublicKey). +
           + (type=function) +
+
+
Returns:
+
+ new private key +
           + (type=RSAKey) +
+
+

Since: fearow +

+ +
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.SFTP-class.html b/docs/public/paramiko.SFTP-class.html new file mode 100644 index 0000000..72ebc70 --- /dev/null +++ b/docs/public/paramiko.SFTP-class.html @@ -0,0 +1,287 @@ + + + + + paramiko.SFTP + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class SFTP +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SFTP

+ +
+object --+        
+         |        
+  BaseSFTP --+    
+             |    
+    SFTPClient --+
+                 |
+                SFTP
+

+ +
+ +an alias for SFTPClient for backwards compatability +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
    Inherited from SFTPClient
 __init__(self, + sock) +
+Create an SFTP client from an existing Channel.
 __del__(self) +
 chdir(self, + path) +
+Change the "current directory" of this SFTP session.
 chmod(self, + path, + mode) +
+Change the mode (permissions) of a file.
 chown(self, + path, + uid, + gid) +
+Change the owner (uid) and group (gid) of a +file.
 close(self) +
+Close the SFTP session and its underlying channel.
SFTPFile +file(self, + filename, + mode, + bufsize) +
+Open a file on the remote server.
SFTPClient +from_transport(selfclass, + t) +
+Create an SFTP client channel from an open Transport. (Class method) +
 get(self, + remotepath, + localpath) +
+Copy a remote file (remotepath) from the SFTP server to +the local host as localpath.
str +getcwd(self) +
+Return the "current working directory" for this SFTP +session, as emulated by paramiko.
list of str +listdir(self, + path) +
+Return a list containing the names of the entries in the given +path.
list of SFTPAttributes +listdir_attr(self, + path) +
+Return a list containing SFTPAttributes objects corresponding to +files in the given path.
SFTPAttributes +lstat(self, + path) +
+Retrieve information about a file on the remote system, without +following symbolic links (shortcuts).
 mkdir(self, + path, + mode) +
+Create a folder (directory) named path with numeric mode +mode.
str +normalize(self, + path) +
+Return the normalized path (on the server) of a given path.
SFTPFile +open(self, + filename, + mode, + bufsize) +
+Open a file on the remote server.
 put(self, + localpath, + remotepath) +
+Copy a local file (localpath) to the SFTP server as +remotepath.
str +readlink(self, + path) +
+Return the target of a symbolic link (shortcut).
 remove(self, + path) +
+Remove the file at the given path.
 rename(self, + oldpath, + newpath) +
+Rename a file or folder from oldpath to +newpath.
 rmdir(self, + path) +
+Remove the folder named path.
SFTPAttributes +stat(self, + path) +
+Retrieve information about a file on the remote system.
 symlink(self, + source, + dest) +
+Create a symbolic link (shortcut) of the source path at +destination.
 unlink(self, + path) +
+Remove the file at the given path.
 utime(self, + path, + times) +
+Set the access and modified times of the file specified by +path.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.SFTPAttributes-class.html b/docs/public/paramiko.SFTPAttributes-class.html new file mode 100644 index 0000000..c3cc57c --- /dev/null +++ b/docs/public/paramiko.SFTPAttributes-class.html @@ -0,0 +1,360 @@ + + + + + paramiko.SFTPAttributes + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class SFTPAttributes +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SFTPAttributes

+ +
+object --+
+         |
+        SFTPAttributes
+

+ +
+ +Representation of the attributes of a file (or proxied file) for SFTP +in client or server mode. It attemps to mirror the object returned by +os.stat as closely as possible, so it may have the following +fields, with the same meanings as those returned by an +os.stat object: +
    +
  • + st_size +
  • +
  • + st_uid +
  • +
  • + st_gid +
  • +
  • + st_mode +
  • +
  • + st_atime +
  • +
  • + st_mtime +
  • +
+Because SFTP allows flags to have other arbitrary named attributes, +these are stored in a dict named attr. Occasionally, the +filename is also stored, in filename. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self) +
+Create a new (empty) SFTPAttributes object.
 __repr__(self) +
 __str__(self) +
+create a unix-style long description of the file (like ls -l)
SFTPAttributes +from_stat(cls, + obj, + filename) +
+Create an SFTPAttributes object from an existing stat +object (an object returned by os.stat). (Class method) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + + + + + + + + + + + +
Class Variable Summary
intFLAG_AMTIME = 8                                                                     
longFLAG_EXTENDED = 2147483648L +
intFLAG_PERMISSIONS = 4                                                                     
intFLAG_SIZE = 1                                                                     
intFLAG_UIDGID = 2                                                                     

+ + + + + + +
Instance Method Details
+ + +
+

__init__(self) +
(Constructor) +

+ Create a new (empty) SFTPAttributes object. All fields will be + empty. +
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

__str__(self) +
(Informal representation operator) +

+ create a unix-style long description of the file (like ls -l) +
+
Overrides:
+
__builtin__.object.__str__
+
+
+
+
+ + + + + + +
Class Method Details
+ + +
+

from_stat(cls, + obj, + filename=None) +

+ Create an SFTPAttributes object from an existing stat + object (an object returned by os.stat). +
+
Parameters:
+
obj - + an object returned by os.stat (or + equivalent). +
           + (type=object) +
filename - + the filename associated with this file. +
           + (type=str) +
+
+
Returns:
+
+ new SFTPAttributes object with the same + attribute fields. +
           + (type=SFTPAttributes) +
+
+
+
+
+ + + + + + +
Class Variable Details
+
+ +

FLAG_AMTIME

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+8                                                                     
+
+
+
+
+
+ +

FLAG_EXTENDED

+
+
+
+
+
Type:
+
+ long + +
+
Value:
+
+
+2147483648L                                                            
+
+
+
+
+
+ +

FLAG_PERMISSIONS

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+4                                                                     
+
+
+
+
+
+ +

FLAG_SIZE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1                                                                     
+
+
+
+
+
+ +

FLAG_UIDGID

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.SFTPClient-class.html b/docs/public/paramiko.SFTPClient-class.html new file mode 100644 index 0000000..d691c5e --- /dev/null +++ b/docs/public/paramiko.SFTPClient-class.html @@ -0,0 +1,1009 @@ + + + + + paramiko.SFTPClient + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class SFTPClient +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SFTPClient

+ +
+object --+    
+         |    
+  BaseSFTP --+
+             |
+            SFTPClient
+

+ +
Known Subclasses:
+
+ SFTP
+ +
+ +SFTP client object. SFTPClient is used to open an sftp +session across an open ssh Transport and do remote file +operations. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + sock) +
+Create an SFTP client from an existing Channel.
 __del__(self) +
 chdir(self, + path) +
+Change the "current directory" of this SFTP session.
 chmod(self, + path, + mode) +
+Change the mode (permissions) of a file.
 chown(self, + path, + uid, + gid) +
+Change the owner (uid) and group (gid) of a +file.
 close(self) +
+Close the SFTP session and its underlying channel.
SFTPFile +file(self, + filename, + mode, + bufsize) +
+Open a file on the remote server.
SFTPClient +from_transport(selfclass, + t) +
+Create an SFTP client channel from an open Transport. (Class method) +
 get(self, + remotepath, + localpath) +
+Copy a remote file (remotepath) from the SFTP server to +the local host as localpath.
str +getcwd(self) +
+Return the "current working directory" for this SFTP +session, as emulated by paramiko.
list of str +listdir(self, + path) +
+Return a list containing the names of the entries in the given +path.
list of SFTPAttributes +listdir_attr(self, + path) +
+Return a list containing SFTPAttributes objects corresponding to +files in the given path.
SFTPAttributes +lstat(self, + path) +
+Retrieve information about a file on the remote system, without +following symbolic links (shortcuts).
 mkdir(self, + path, + mode) +
+Create a folder (directory) named path with numeric mode +mode.
str +normalize(self, + path) +
+Return the normalized path (on the server) of a given path.
SFTPFile +open(self, + filename, + mode, + bufsize) +
+Open a file on the remote server.
 put(self, + localpath, + remotepath) +
+Copy a local file (localpath) to the SFTP server as +remotepath.
str +readlink(self, + path) +
+Return the target of a symbolic link (shortcut).
 remove(self, + path) +
+Remove the file at the given path.
 rename(self, + oldpath, + newpath) +
+Rename a file or folder from oldpath to +newpath.
 rmdir(self, + path) +
+Remove the folder named path.
SFTPAttributes +stat(self, + path) +
+Retrieve information about a file on the remote system.
 symlink(self, + source, + dest) +
+Create a symbolic link (shortcut) of the source path at +destination.
 unlink(self, + path) +
+Remove the file at the given path.
 utime(self, + path, + times) +
+Set the access and modified times of the file specified by +path.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + +
Instance Method Details
+ + +
+

__init__(self, + sock) +
(Constructor) +

+

Create an SFTP client from an existing Channel. The channel should already have + requested the "sftp" subsystem.

+ An alternate way to create an SFTP client context is by using from_transport. +
+
Parameters:
+
sock - + an open Channel using the + "sftp" subsystem. +
           + (type=Channel) +
+
+
Overrides:
+
paramiko.BaseSFTP.__init__
+
+
+
+ + +
+

chdir(self, + path) +

+ Change the "current directory" of this SFTP session. Since + SFTP doesn't really have the concept of a current working directory, + this is emulated by paramiko. Once you use this method to set a working + directory, all operations on this SFTPClient object will be relative to + that path. +
+
Parameters:
+
path - + new current working directory +
           + (type=str) +
+
+
Raises:
+
IOError - + if the requested path doesn't exist on the server +
+

Since: 1.4 +

+ +
+
+ + +
+

chmod(self, + path, + mode) +

+ Change the mode (permissions) of a file. The permissions are + unix-style and identical to those used by python's + os.chmod function. +
+
Parameters:
+
path - + path of the file to change the permissions of. +
           + (type=string) +
mode - + new permissions. +
           + (type=int) +
+
+
+
+ + +
+

chown(self, + path, + uid, + gid) +

+ Change the owner (uid) and group (gid) of + a file. As with python's os.chown function, you must pass + both arguments, so if you only want to change one, use stat first to retrieve the current owner + and group. +
+
Parameters:
+
path - + path of the file to change the owner and group of. +
           + (type=string) +
uid - + new owner's uid +
           + (type=int) +
gid - + new group id +
           + (type=int) +
+
+
+
+ + +
+

close(self) +

+ Close the SFTP session and its underlying channel. +
+

Since: 1.4 +

+ +
+
+ + +
+

file(self, + filename, + mode='r', + bufsize=-1) +

+

Open a file on the remote server. The arguments are the same as for + python's built-in file (aka open). A + file-like object is returned, which closely mimics the behavior of a + normal python file object.

+

The mode indicates how the file is to be opened: 'r' + for reading, 'w' for writing (truncating an existing + file), 'a' for appending, 'r+' for + reading/writing, 'w+' for reading/writing (truncating an + existing file), 'a+' for reading/appending. The python + 'b' flag is ignored, since SSH treats all files as binary. + The 'U' flag is supported in a compatible way.

+

Since 1.5.2, an 'x' flag indicates that the operation + should only succeed if the file was created and did not previously + exist. This has no direct mapping to python's file flags, but is + commonly known as the O_EXCL flag in posix.

+ The file will be buffered in standard python style by default, but + can be altered with the bufsize parameter. 0 + turns off buffering, 1 uses line buffering, and any number + greater than 1 (>1) uses that specific buffer size. +
+
Parameters:
+
filename - + name of the file to open. +
           + (type=string) +
mode - + mode (python-style) to open in. +
           + (type=string) +
bufsize - + desired buffering (-1 = default buffer size) +
           + (type=int) +
+
+
Returns:
+
+ a file object representing the open file. +
           + (type=SFTPFile) +
+
+
Raises:
+
IOError - + if the file could not be opened. +
+
+
+ + +
+

get(self, + remotepath, + localpath) +

+ Copy a remote file (remotepath) from the SFTP server to + the local host as localpath. Any exception raised by + operations will be passed through. This method is primarily provided as + a convenience. +
+
Parameters:
+
remotepath - + the remote file to copy +
           + (type=str) +
localpath - + the destination path on the local host +
           + (type=str) +
+
+

Since: 1.4 +

+ +
+
+ + +
+

getcwd(self) +

+ Return the "current working directory" for this SFTP + session, as emulated by paramiko. If no directory has been set with chdir, this method will return + None. +
+
Returns:
+
+ the current working directory on the server, or + None +
           + (type=str) +
+
+

Since: 1.4 +

+ +
+
+ + +
+

listdir(self, + path='.') +

+ Return a list containing the names of the entries in the given + path. The list is in arbitrary order. It does not include + the special entries '.' and '..' even if they + are present in the folder. This method is meant to mirror + os.listdir as closely as possible. For a list of full SFTPAttributes objects, see listdir_attr. +
+
Parameters:
+
path - + path to list (defaults to '.') +
           + (type=str) +
+
+
Returns:
+
+ list of filenames +
           + (type=list of str) +
+
+
+
+ + +
+

listdir_attr(self, + path='.') +

+ Return a list containing SFTPAttributes objects corresponding to + files in the given path. The list is in arbitrary order. + It does not include the special entries '.' and + '..' even if they are present in the folder. +
+
Parameters:
+
path - + path to list (defaults to '.') +
           + (type=str) +
+
+
Returns:
+
+ list of attributes +
           + (type=list of SFTPAttributes) +
+
+

Since: 1.2 +

+ +
+
+ + +
+

lstat(self, + path) +

+ Retrieve information about a file on the remote system, without + following symbolic links (shortcuts). This otherwise behaves exactly + the same as stat. +
+
Parameters:
+
path - + the filename to stat. +
           + (type=string) +
+
+
Returns:
+
+ an object containing attributes about the given file. +
           + (type=SFTPAttributes) +
+
+
+
+ + +
+

mkdir(self, + path, + mode=511) +

+ Create a folder (directory) named path with numeric + mode mode. The default mode is 0777 (octal). On some + systems, mode is ignored. Where it is used, the current umask value is + first masked out. +
+
Parameters:
+
path - + name of the folder to create. +
           + (type=string) +
mode - + permissions (posix-style) for the newly-created folder. +
           + (type=int) +
+
+
+
+ + +
+

normalize(self, + path) +

+ Return the normalized path (on the server) of a given path. This can + be used to quickly resolve symbolic links or determine what the server + is considering to be the "current folder" (by passing + '.' as path). +
+
Parameters:
+
path - + path to be normalized. +
           + (type=str) +
+
+
Returns:
+
+ normalized form of the given path. +
           + (type=str) +
+
+
Raises:
+
IOError - + if the path can't be resolved on the server +
+
+
+ + +
+

open(self, + filename, + mode='r', + bufsize=-1) +

+

Open a file on the remote server. The arguments are the same as for + python's built-in file (aka open). A + file-like object is returned, which closely mimics the behavior of a + normal python file object.

+

The mode indicates how the file is to be opened: 'r' + for reading, 'w' for writing (truncating an existing + file), 'a' for appending, 'r+' for + reading/writing, 'w+' for reading/writing (truncating an + existing file), 'a+' for reading/appending. The python + 'b' flag is ignored, since SSH treats all files as binary. + The 'U' flag is supported in a compatible way.

+

Since 1.5.2, an 'x' flag indicates that the operation + should only succeed if the file was created and did not previously + exist. This has no direct mapping to python's file flags, but is + commonly known as the O_EXCL flag in posix.

+ The file will be buffered in standard python style by default, but + can be altered with the bufsize parameter. 0 + turns off buffering, 1 uses line buffering, and any number + greater than 1 (>1) uses that specific buffer size. +
+
Parameters:
+
filename - + name of the file to open. +
           + (type=string) +
mode - + mode (python-style) to open in. +
           + (type=string) +
bufsize - + desired buffering (-1 = default buffer size) +
           + (type=int) +
+
+
Returns:
+
+ a file object representing the open file. +
           + (type=SFTPFile) +
+
+
Raises:
+
IOError - + if the file could not be opened. +
+
+
+ + +
+

put(self, + localpath, + remotepath) +

+

Copy a local file (localpath) to the SFTP server as + remotepath. Any exception raised by operations will be + passed through. This method is primarily provided as a convenience.

+ The SFTP operations use pipelining for speed. +
+
Parameters:
+
localpath - + the local file to copy +
           + (type=str) +
remotepath - + the destination path on the SFTP server +
           + (type=str) +
+
+

Since: 1.4 +

+ +
+
+ + +
+

readlink(self, + path) +

+ Return the target of a symbolic link (shortcut). You can use symlink to create these. The result may + be either an absolute or relative pathname. +
+
Parameters:
+
path - + path of the symbolic link file. +
           + (type=str) +
+
+
Returns:
+
+ target path. +
           + (type=str) +
+
+
+
+ + +
+

remove(self, + path) +

+ Remove the file at the given path. +
+
Parameters:
+
path - + path (absolute or relative) of the file to remove. +
           + (type=string) +
+
+
Raises:
+
IOError - + if the path refers to a folder (directory). Use rmdir to remove a folder. +
+
+
+ + +
+

rename(self, + oldpath, + newpath) +

+ Rename a file or folder from oldpath to + newpath. +
+
Parameters:
+
oldpath - + existing name of the file or folder. +
           + (type=string) +
newpath - + new name for the file or folder. +
           + (type=string) +
+
+
Raises:
+
IOError - + if newpath is a folder, or something else goes + wrong. +
+
+
+ + +
+

rmdir(self, + path) +

+ Remove the folder named path. +
+
Parameters:
+
path - + name of the folder to remove. +
           + (type=string) +
+
+
+
+ + +
+

stat(self, + path) +

+

Retrieve information about a file on the remote system. The return + value is an object whose attributes correspond to the attributes of + python's stat structure as returned by + os.stat, except that it contains fewer fields. An SFTP + server may return as much or as little info as it wants, so the results + may vary from server to server.

+

Unlike a python stat object, the result may not be + accessed as a tuple. This is mostly due to the author's slack + factor.

+ The fields supported are: st_mode, + st_size, st_uid, st_gid, + st_atime, and st_mtime. +
+
Parameters:
+
path - + the filename to stat. +
           + (type=string) +
+
+
Returns:
+
+ an object containing attributes about the given file. +
           + (type=SFTPAttributes) +
+
+
+
+ + +
+

symlink(self, + source, + dest) +

+ Create a symbolic link (shortcut) of the source path at + destination. +
+
Parameters:
+
source - + path of the original file. +
           + (type=string) +
dest - + path of the newly created symlink. +
           + (type=string) +
+
+
+
+ + +
+

unlink(self, + path) +

+ Remove the file at the given path. +
+
Parameters:
+
path - + path (absolute or relative) of the file to remove. +
           + (type=string) +
+
+
Raises:
+
IOError - + if the path refers to a folder (directory). Use rmdir to remove a folder. +
+
+
+ + +
+

utime(self, + path, + times) +

+ Set the access and modified times of the file specified by + path. If times is None, then the + file's access and modified times are set to the current time. + Otherwise, times must be a 2-tuple of numbers, of the form + (atime, mtime), which is used to set the access and + modified times, respectively. This bizarre API is mimicked from python + for the sake of consistency -- I apologize. +
+
Parameters:
+
path - + path of the file to modify. +
           + (type=string) +
times - + None or a tuple of (access time, modified time) + in standard internet epoch time (seconds since 01 January 1970 + GMT). +
           + (type=tuple of int) +
+
+
+
+
+ + + + + + +
Class Method Details
+ + +
+

from_transport(selfclass, + t) +

+ Create an SFTP client channel from an open Transport. +
+
Parameters:
+
t - + an open Transport which is already + authenticated. +
           + (type=Transport) +
+
+
Returns:
+
+ a new SFTPClient object, referring to an + sftp session (channel) across the transport. +
           + (type=SFTPClient) +
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.SFTPError-class.html b/docs/public/paramiko.SFTPError-class.html new file mode 100644 index 0000000..ed3a76d --- /dev/null +++ b/docs/public/paramiko.SFTPError-class.html @@ -0,0 +1,85 @@ + + + + + paramiko.SFTPError + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class SFTPError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class SFTPError

+ +
+Exception --+
+            |
+           SFTPError
+

+ +
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.SFTPFile-class.html b/docs/public/paramiko.SFTPFile-class.html new file mode 100644 index 0000000..6425f07 --- /dev/null +++ b/docs/public/paramiko.SFTPFile-class.html @@ -0,0 +1,560 @@ + + + + + paramiko.SFTPFile + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class SFTPFile +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SFTPFile

+ +
+  object --+    
+           |    
+BufferedFile --+
+               |
+              SFTPFile
+

+ +
+ +Proxy object for a file on the remote server, in client mode SFTP. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + sftp, + handle, + mode, + bufsize) +
 __del__(self) +
str +check(self, + hash_algorithm, + offset, + length, + block_size) +
+Ask the server for a hash of a section of this file.
 close(self) +
+Close the file.
float +gettimeout(self) +
+Returns the timeout in seconds (as a float) associated with the socket +or ssh Channel used for this file.
 prefetch(self) +
+Pre-fetch the remaining contents of this file in anticipation of +future read calls.
 seek(self, + offset, + whence) +
+Set the file's current position, like stdio's fseek.
 set_pipelined(self, + pipelined) +
+Turn on/off the pipelining of write operations to this file.
 setblocking(self, + blocking) +
+Set blocking or non-blocking mode on the underiying socket or ssh Channel.
 settimeout(self, + timeout) +
+Set a timeout on read/write operations on the underlying socket or ssh +Channel.
SFTPAttributes +stat(self) +
+Retrieve information about this file from the remote system.
    Inherited from BufferedFile
iterator +__iter__(self) +
+Returns an iterator that can be used to iterate over the lines in this +file.
 flush(self) +
+Write out any data in the write buffer.
str +next(self) +
+Returns the next line from the input, or raises +StopIteration when EOF is hit.
str +read(self, + size) +
+Read at most size bytes from the file (less if we hit the +end of the file first).
str +readline(self, + size) +
+Read one entire line from the file.
list +readlines(self, + sizehint) +
+Read all remaining lines using readline and return them as a list.
int +tell(self) +
+Return the file's current position.
 write(self, + data) +
+Write data to the file.
 writelines(self, + sequence) +
+Write a sequence of strings to the file.
iterator +xreadlines(self) +
+Identical to iter(f).
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + + + + + + +
Class Variable Summary
intMAX_REQUEST_SIZE = 32768                                                                 
    Inherited from BufferedFile
intSEEK_CUR = 1                                                                     
intSEEK_END = 2                                                                     
intSEEK_SET = 0                                                                     

+ + + + + + +
Method Details
+ + +
+

check(self, + hash_algorithm, + offset=0, + length=0, + block_size=0) +

+

Ask the server for a hash of a section of this file. This can be + used to verify a successful upload or download, or for various + rsync-like operations.

+

The file is hashed from offset, for length + bytes. If length is 0, the remainder of the file is + hashed. Thus, if both offset and length are + zero, the entire file is hashed.

+

Normally, block_size will be 0 (the default), and this + method will return a byte string representing the requested hash (for + example, a string of length 16 for MD5, or 20 for SHA-1). If a non-zero + block_size is given, each chunk of the file (from + offset to offset + length) of + block_size bytes is computed as a separate hash. The hash + results are all concatenated and returned as a single string.

+ For example, check('sha1', 0, 1024, 512) will return a + string of length 40. The first 20 bytes will be the SHA-1 of the first + 512 bytes of the file, and the last 20 bytes will be the SHA-1 of the + next 512 bytes. +
+
Parameters:
+
hash_algorithm - + the name of the hash algorithm to use (normally + "sha1" or + "md5") +
           + (type=str) +
offset - + offset into the file to begin hashing (0 means to start from + the beginning) +
           + (type=int or long) +
length - + number of bytes to hash (0 means continue to the end of the + file) +
           + (type=int or long) +
block_size - + number of bytes to hash per result (must not be less than 256; + 0 means to compute only one hash of the entire segment) +
           + (type=int) +
+
+
Returns:
+
+ string of bytes representing the hash of each block, + concatenated together +
           + (type=str) +
+
+
Raises:
+
IOError - + if the server doesn't support the "check-file" + extension, or possibly doesn't support the hash algorithm + requested +
+

Note: Many (most?) servers don't support this extension yet. +

+ +

Since: 1.4 +

+ +
+
+ + +
+

close(self, + _async=False) +

+ Close the file. Future read and write operations will fail. +
+
Overrides:
+
paramiko.BufferedFile.close (inherited documentation) +
+
+
+
+ + +
+

gettimeout(self) +

+ Returns the timeout in seconds (as a float) associated with the + socket or ssh Channel used for this file. +
+
Returns:
+
+ float +
+
+

See Also: Channel.gettimeout +

+ +
+
+ + +
+

prefetch(self) +

+ Pre-fetch the remaining contents of this file in anticipation of + future read calls. If reading the entire file, + pre-fetching can dramatically improve the download speed by avoiding + roundtrip latency. The file's contents are incrementally buffered in a + background thread. +
+

Since: 1.5.1 +

+ +
+
+ + +
+

seek(self, + offset, + whence=0) +

+ Set the file's current position, like stdio's fseek. + Not all file objects support seeking. +
+
Parameters:
+
offset - + position to move to within the file, relative to + whence. +
           + (type=int) +
whence - + type of movement: 0 = absolute; 1 = relative to the current + position; 2 = relative to the end of the file. +
           + (type=int) +
+
+
Raises:
+
IOError - + if the file doesn't support random access. +
+
Overrides:
+
paramiko.BufferedFile.seek (inherited documentation) +
+
+

Note: If a file is opened in append mode ('a' or +'a+'), any seek operations will be undone at the next write +(as the file position will move back to the end of the file). +

+ +
+
+ + +
+

set_pipelined(self, + pipelined=True) +

+

Turn on/off the pipelining of write operations to this file. When + pipelining is on, paramiko won't wait for the server response after + each write operation. Instead, they're collected as they come in. At + the first non-write operation (including close), all remaining server responses + are collected. This means that if there was an error with one of your + later writes, an exception might be thrown from within close instead of write.

+ By default, files are not pipelined. +
+
Parameters:
+
pipelined - + True if pipelining should be turned on for this + file; False otherwise +
           + (type=bool) +
+
+

Since: 1.5 +

+ +
+
+ + +
+

setblocking(self, + blocking) +

+ Set blocking or non-blocking mode on the underiying socket or ssh Channel. +
+
Parameters:
+
blocking - + 0 to set non-blocking mode; non-0 to set blocking mode. +
           + (type=int) +
+
+

See Also: Channel.setblocking +

+ +
+
+ + +
+

settimeout(self, + timeout) +

+ Set a timeout on read/write operations on the underlying socket or + ssh Channel. +
+
Parameters:
+
timeout - + seconds to wait for a pending read/write operation before + raising socket.timeout, or None for no + timeout +
           + (type=float) +
+
+

See Also: Channel.settimeout +

+ +
+
+ + +
+

stat(self) +

+ Retrieve information about this file from the remote system. This is + exactly like SFTP.stat, except that it operates on an + already-open file. +
+
Returns:
+
+ an object containing attributes about this file. +
           + (type=SFTPAttributes) +
+
+
+
+
+ + + + + + +
Class Variable Details
+
+ +

MAX_REQUEST_SIZE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+32768                                                                 
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.SFTPHandle-class.html b/docs/public/paramiko.SFTPHandle-class.html new file mode 100644 index 0000000..662ee6a --- /dev/null +++ b/docs/public/paramiko.SFTPHandle-class.html @@ -0,0 +1,325 @@ + + + + + paramiko.SFTPHandle + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class SFTPHandle +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SFTPHandle

+ +
+object --+
+         |
+        SFTPHandle
+

+ +
+ +

Abstract object representing a handle to an open file (or folder) in +an SFTP server implementation. Each handle has a string representation +used by the client to refer to the underlying file.

+Server implementations can (and should) subclass SFTPHandle to +implement features of a file handle, like stat or chattr. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self) +
int +chattr(self, + attr) +
+Change the attributes of this file.
 close(self) +
+When a client closes a file, this method is called on the handle.
str +read(self, + offset, + length) +
+Read up to length bytes from this file, starting at +position offset.
SFTPAttributes or error + code +stat(self) +
+Return an SFTPAttributes object referring to this +open file, or an error code.
 write(self, + offset, + data) +
+Write data into this file at position +offset.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + +
Method Details
+ + +
+

chattr(self, + attr) +

+ Change the attributes of this file. The attr object + will contain only those fields provided by the client in its request, + so you should check for the presence of fields before using them. +
+
Parameters:
+
attr - + the attributes to change on this file. +
           + (type=SFTPAttributes) +
+
+
Returns:
+
+ an error code like SFTP_OK. +
           + (type=int) +
+
+
+
+ + +
+

close(self) +

+

When a client closes a file, this method is called on the handle. + Normally you would use this method to close the underlying OS level + file object(s).

+ The default implementation checks for attributes on + self named readfile and/or + writefile, and if either or both are present, their + close() methods are called. This means that if you are + using the default implementations of read and write, this method's default + implementation should be fine also. +
+
+
+ + +
+

read(self, + offset, + length) +

+

Read up to length bytes from this file, starting at + position offset. The offset may be a python long, since + SFTP allows it to be 64 bits.

+

If the end of the file has been reached, this method may return an + empty string to signify EOF, or it may also return SFTP_EOF.

+ The default implementation checks for an attribute on + self named readfile, and if present, performs + the read operation on the python file-like object found there. (This is + meant as a time saver for the common case where you are wrapping a + python file object.) +
+
Parameters:
+
offset - + position in the file to start reading from. +
           + (type=int or long) +
length - + number of bytes to attempt to read. +
           + (type=int) +
+
+
Returns:
+
+ data read from the file, or an SFTP error code. +
           + (type=str) +
+
+
+
+ + +
+

stat(self) +

+ Return an SFTPAttributes object referring to this + open file, or an error code. This is equivalent to SFTPServerInterface.stat, except it's + called on an open file instead of a path. +
+
Returns:
+
+ an attributes object for the given file, or an SFTP error code + (like SFTP_PERMISSION_DENIED). +
           + (type=SFTPAttributes or error + code) +
+
+
+
+ + +
+

write(self, + offset, + data) +

+

Write data into this file at position + offset. Extending the file past its original end is + expected. Unlike python's normal write() methods, this + method cannot do a partial write: it must write all of + data or else return an error.

+ The default implementation checks for an attribute on + self named writefile, and if present, + performs the write operation on the python file-like object found + there. The attribute is named differently from readfile to + make it easy to implement read-only (or write-only) files, but if both + attributes are present, they should refer to the same file. +
+
Parameters:
+
offset - + position in the file to start reading from. +
           + (type=int or long) +
data - + data to write into the file. +
           + (type=str) +
+
+
Returns:
+
+ an SFTP error code like SFTP_OK. +
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.SFTPServer-class.html b/docs/public/paramiko.SFTPServer-class.html new file mode 100644 index 0000000..4d4e827 --- /dev/null +++ b/docs/public/paramiko.SFTPServer-class.html @@ -0,0 +1,403 @@ + + + + + paramiko.SFTPServer + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class SFTPServer +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SFTPServer

+ +
+object --+            
+         |            
+  _Verbose --+        
+             |        
+        Thread --+    
+                 |    
+  SubsystemHandler --+
+                     |
+        object --+   |
+                 |   |
+          BaseSFTP --+
+                     |
+                    SFTPServer
+

+ +
+ +Server-side SFTP subsystem support. Since this is a SubsystemHandler, it can be (and is meant +to be) set as the handler for "sftp" requests. Use +Transport.set_subsystem_handler to activate +this class. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + channel, + name, + server, + sftp_si, + *largs, + **kwargs) +
+The constructor for SFTPServer is meant to be called from within the +Transport as a subsystem handler.
int +convert_errno(e) +
+Convert an errno value (as from an OSError or +IOError) into a standard SFTP result code. (Static method) +
 finish_subsystem(self) +
+Perform any cleanup at the end of a subsystem.
 set_file_attr(filename, + attr) +
+Change a file's attributes on the local filesystem. (Static method) +
 start_subsystem(self, + name, + transport, + channel) +
+Process an ssh subsystem in server mode.
    Inherited from SubsystemHandler
ServerInterface +get_server(self) +
+Return the ServerInterface object associated with this +channel and subsystem.
    Inherited from Thread
 __repr__(self) +
 getName(self) +
 isAlive(self) +
 isDaemon(self) +
 join(self, + timeout) +
 run(self) +
 setDaemon(self, + daemonic) +
 setName(self, + name) +
 start(self) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + +
Instance Method Details
+ + +
+

__init__(self, + channel, + name, + server, + sftp_si=<class 'paramiko.SFTPServerInterface'>, + *largs, + **kwargs) +
(Constructor) +

+ The constructor for SFTPServer is meant to be called from within the + Transport as a subsystem handler. + server and any additional parameters or keyword parameters + are passed from the original call to Transport.set_subsystem_handler. +
+
Parameters:
+
channel - + channel passed from the Transport. +
           + (type=Channel) +
name - + name of the requested subsystem. +
           + (type=str) +
server - + the server object associated with this channel and + subsystem +
           + (type=ServerInterface) +
sftp_si - + a subclass of SFTPServerInterface to use for + handling individual requests. +
           + (type=class) +
+
+
Overrides:
+
paramiko.BaseSFTP.__init__
+
+
+
+ + +
+

finish_subsystem(self) +

+ Perform any cleanup at the end of a subsystem. The default + implementation just closes the channel. +
+
Overrides:
+
paramiko.SubsystemHandler.finish_subsystem (inherited documentation) +
+
+

Since: 1.1 +

+ +
+
+ + +
+

start_subsystem(self, + name, + transport, + channel) +

+

Process an ssh subsystem in server mode. This method is called on a + new object (and in a new thread) for each subsystem request. It is + assumed that all subsystem logic will take place here, and when the + subsystem is finished, this method will return. After this method + returns, the channel is closed.

+ The combination of transport and channel + are unique; this handler corresponds to exactly one Channel on one Transport. +
+
Parameters:
+
name - + name of the requested subsystem. +
           + (type=str) +
transport - + the server-mode Transport. +
           + (type=Transport) +
channel - + the channel associated with this subsystem request. +
           + (type=Channel) +
+
+
Overrides:
+
paramiko.SubsystemHandler.start_subsystem (inherited documentation) +
+
+

Note: It is the responsibility of this method to exit if the underlying Transport is closed. This can be done by +checking Transport.is_active or noticing an EOF on +the Channel. If this method loops forever +without checking for this case, your python interpreter may refuse to +exit because this thread will still be running. +

+ +
+
+
+ + + + + + +
Static Method Details
+ + +
+

convert_errno(e) +

+ Convert an errno value (as from an OSError or + IOError) into a standard SFTP result code. This is a + convenience function for trapping exceptions in server code and + returning an appropriate result. +
+
Parameters:
+
e - + an errno code, as from OSError.errno. +
           + (type=int) +
+
+
Returns:
+
+ an SFTP error code like SFTP_NO_SUCH_FILE. +
           + (type=int) +
+
+
+
+ + +
+

set_file_attr(filename, + attr) +

+

Change a file's attributes on the local filesystem. The contents of + attr are used to change the permissions, owner, group + ownership, and/or modification & access time of the file, depending + on which attributes are present in attr.

+ This is meant to be a handy helper function for translating SFTP + file requests into local file operations. +
+
Parameters:
+
filename - + name of the file to alter (should usually be an absolute + path). +
           + (type=str) +
attr - + attributes to change. +
           + (type=SFTPAttributes) +
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.SSHException-class.html b/docs/public/paramiko.SSHException-class.html new file mode 100644 index 0000000..a628f2f --- /dev/null +++ b/docs/public/paramiko.SSHException-class.html @@ -0,0 +1,94 @@ + + + + + paramiko.SSHException + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class SSHException +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class SSHException

+ +
+Exception --+
+            |
+           SSHException
+

+ +
Known Subclasses:
+
+ BadAuthenticationType, + PasswordRequiredException
+ +
+ +Exception raised by failures in SSH2 protocol negotiation or logic +errors. +
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.SecurityOptions-class.html b/docs/public/paramiko.SecurityOptions-class.html new file mode 100644 index 0000000..a9ca4be --- /dev/null +++ b/docs/public/paramiko.SecurityOptions-class.html @@ -0,0 +1,274 @@ + + + + + paramiko.SecurityOptions + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class SecurityOptions +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SecurityOptions

+ +
+object --+
+         |
+        SecurityOptions
+

+ +
+ +

Simple object containing the security preferences of an ssh transport. +These are tuples of acceptable ciphers, digests, key types, and key +exchange algorithms, listed in order of preference.

+Changing the contents and/or order of these fields affects the +underlying Transport (but only if you change them +before starting the session). If you try to add an algorithm that +paramiko doesn't recognize, ValueError will be raised. If +you try to assign something besides a tuple to one of the fields, +TypeError will be raised. +
+ +

Since: ivysaur +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + transport) +
str +__repr__(self) +
+Returns a string representation of this object, for debugging.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + +
Property Summary
 ciphers: Symmetric encryption ciphers
 compression: Compression algorithms
 digests: Digest (one-way hash) algorithms
 kex: Key exchange algorithms
 key_types: Public-key algorithms

+ + + + + + + + +
Class Variable Summary
list__slots__ = ['ciphers', 'digests', 'key_types', 'kex', '... +

+ + + + + + +
Method Details
+ + +
+

__repr__(self) +
(Representation operator) +

+ Returns a string representation of this object, for debugging. +
+
Returns:
+
+ str +
+
+
Overrides:
+
__builtin__.object.__repr__
+
+
+
+
+ + + + + + +
Property Details
+
+ + +

ciphers

+Symmetric encryption ciphers +
+
+
+
+
+
+
+ + +

compression

+Compression algorithms +
+
+
+
+
+
+
+ + +

digests

+Digest (one-way hash) algorithms +
+
+
+
+
+
+
+ + +

kex

+Key exchange algorithms +
+
+
+
+
+
+
+ + +

key_types

+Public-key algorithms +
+
+
+
+
+
+

+ + + + + + +
Class Variable Details
+
+ +

__slots__

+
+
+
+
+
Type:
+
+ list + +
+
Value:
+
+
+['ciphers', 'digests', 'key_types', 'kex', 'compression', '_transport'\
+]                                                                      
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.SubsystemHandler-class.html b/docs/public/paramiko.SubsystemHandler-class.html new file mode 100644 index 0000000..05c7bdb --- /dev/null +++ b/docs/public/paramiko.SubsystemHandler-class.html @@ -0,0 +1,327 @@ + + + + + paramiko.SubsystemHandler + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class SubsystemHandler +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SubsystemHandler

+ +
+object --+        
+         |        
+  _Verbose --+    
+             |    
+        Thread --+
+                 |
+                SubsystemHandler
+

+ +
Known Subclasses:
+
+ SFTPServer
+ +
+ +

Handler for a subsytem in server mode. If you create a subclass of +this class and pass it to Transport.set_subsystem_handler, an object +of this class will be created for each request for this subsystem. Each +new object will be executed within its own new thread by calling start_subsystem. When that method +completes, the channel is closed.

+For example, if you made a subclass MP3Handler and +registered it as the handler for subsystem "mp3", +then whenever a client has successfully authenticated and requests +subsytem "mp3", an object of class +MP3Handler will be created, and start_subsystem will be called on it from a +new thread. +
+ +

Since: ivysaur +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + channel, + name, + server) +
+Create a new handler for a channel.
 finish_subsystem(self) +
+Perform any cleanup at the end of a subsystem.
ServerInterface +get_server(self) +
+Return the ServerInterface object associated with this +channel and subsystem.
 start_subsystem(self, + name, + transport, + channel) +
+Process an ssh subsystem in server mode.
    Inherited from Thread
 __repr__(self) +
 getName(self) +
 isAlive(self) +
 isDaemon(self) +
 join(self, + timeout) +
 run(self) +
 setDaemon(self, + daemonic) +
 setName(self, + name) +
 start(self) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + +
Method Details
+ + +
+

__init__(self, + channel, + name, + server) +
(Constructor) +

+ Create a new handler for a channel. This is used by ServerInterface to start up a new handler + when a channel requests this subsystem. You don't need to override this + method, but if you do, be sure to pass the channel and + name parameters through to the original + __init__ method here. +
+
Parameters:
+
channel - + the channel associated with this subsystem request. +
           + (type=Channel) +
name - + name of the requested subsystem. +
           + (type=str) +
server - + the server object for the session that started this + subsystem +
           + (type=ServerInterface) +
+
+
Overrides:
+
threading.Thread.__init__
+
+
+
+ + +
+

finish_subsystem(self) +

+ Perform any cleanup at the end of a subsystem. The default + implementation just closes the channel. +
+

Since: 1.1 +

+ +
+
+ + +
+

get_server(self) +

+ Return the ServerInterface object associated with + this channel and subsystem. +
+
Returns:
+
+ ServerInterface +
+
+
+
+ + +
+

start_subsystem(self, + name, + transport, + channel) +

+

Process an ssh subsystem in server mode. This method is called on a + new object (and in a new thread) for each subsystem request. It is + assumed that all subsystem logic will take place here, and when the + subsystem is finished, this method will return. After this method + returns, the channel is closed.

+ The combination of transport and channel + are unique; this handler corresponds to exactly one Channel on one Transport. +
+
Parameters:
+
name - + name of the requested subsystem. +
           + (type=str) +
transport - + the server-mode Transport. +
           + (type=Transport) +
channel - + the channel associated with this subsystem request. +
           + (type=Channel) +
+
+

Note: It is the responsibility of this method to exit if the underlying Transport is closed. This can be done by +checking Transport.is_active or noticing an EOF on +the Channel. If this method loops forever +without checking for this case, your python interpreter may refuse to +exit because this thread will still be running. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.Transport-class.html b/docs/public/paramiko.Transport-class.html new file mode 100644 index 0000000..562982b --- /dev/null +++ b/docs/public/paramiko.Transport-class.html @@ -0,0 +1,1524 @@ + + + + + paramiko.Transport + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Class Transport +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type Transport

+ +
+object --+        
+         |        
+  _Verbose --+    
+             |    
+        Thread --+
+                 |
+                Transport
+

+ +
+ +An SSH Transport attaches to a stream (usually a socket), negotiates +an encrypted session, authenticates, and then creates stream tunnels, +called Channels, across the session. Multiple +channels can be multiplexed across a single session (and often are, in +the case of port forwardings). +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + sock) +
+Create a new SSH session over an existing socket, or socket-like +object.
 __del__(self) +
str +__repr__(self) +
+Returns a string representation of this object, for debugging.
Channel +accept(self, + timeout) +
+Return the next channel opened by the client over this transport, in +server mode.
 add_server_key(self, + key) +
+Add a host key to the list of keys used for server mode.
list +auth_interactive(self, + username, + handler, + submethods) +
+Authenticate to the server interactively.
list +auth_none(self, + username) +
+Try to authenticate to the server using no authentication at all.
list +auth_password(self, + username, + password, + event, + fallback) +
+Authenticate to the server using a password.
list +auth_publickey(self, + username, + key, + event) +
+Authenticate to the server using a private key.
 close(self) +
+Close this session, and any open channels that are tied to it.
 connect(self, + hostkey, + username, + password, + pkey) +
+Negotiate an SSH2 session, and optionally verify the server's host key +and authenticate using a password or private key.
Exception +get_exception(self) +
+Return any exception that happened during the last server request.
bool +get_hexdump(self) +
+Return True if the transport is currently logging hex +dumps of protocol traffic.
str +get_log_channel(self) +
+Return the channel name used for this transport's logging.
PKey +get_remote_server_key(self) +
+Return the host key of the server (in client mode).
SecurityOptions +get_security_options(self) +
+Return a SecurityOptions object which can be used to +tweak the encryption algorithms this transport will permit, and the order +of preference for them.
PKey +get_server_key(self) +
+Return the active host key, in server mode.
string +get_username(self) +
+Return the username this connection is authenticated for.
Message +global_request(self, + kind, + data, + wait) +
+Make a global request to the remote host.
bool +is_active(self) +
+Return true if this session is active (open).
bool +is_authenticated(self) +
+Return true if this session is active and authenticated.
bool +load_server_moduli(filename) +
+(optional) Load a file of prime moduli for use in doing +group-exchange key negotiation in server mode. (Static method) +
Channel +open_channel(self, + kind, + dest_addr, + src_addr) +
+Request a new channel to the server.
Channel +open_session(self) +
+Request a new channel to the server, of type +"session".
SFTPClient +open_sftp_client(self) +
+Create an SFTP client channel from an open transport.
bool +renegotiate_keys(self) +
+Force this session to switch to new keys.
 run(self) +
 send_ignore(self, + bytes) +
+Send a junk packet across the encrypted link.
 set_hexdump(self, + hexdump) +
+Turn on/off logging a hex dump of protocol traffic at DEBUG level in +the logs.
 set_keepalive(self, + interval) +
+Turn on/off keepalive packets (default is off).
 set_log_channel(self, + name) +
+Set the channel for this transport's logging.
 set_subsystem_handler(self, + name, + handler, + *larg, + **kwarg) +
+Set the handler class for a subsystem in server mode.
 start_client(self, + event) +
+Negotiate a new SSH2 session as a client.
 start_server(self, + event, + server) +
+Negotiate a new SSH2 session as a server.
 stop_thread(self) +
 use_compression(self, + compress) +
+Turn on/off compression.
    Inherited from Thread
 getName(self) +
 isAlive(self) +
 isDaemon(self) +
 join(self, + timeout) +
 setDaemon(self, + daemonic) +
 setName(self, + name) +
 start(self) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + +
Instance Method Details
+ + +
+

__init__(self, + sock) +
(Constructor) +

+

Create a new SSH session over an existing socket, or socket-like + object. This only creates the Transport object; it doesn't begin the + SSH session yet. Use connect or start_client to begin a client session, + or start_server to begin a server + session.

+ If the object is not actually a socket, it must have the following + methods: +
    +
  • + send(str): Writes from 1 to len(str) + bytes, and returns an int representing the number of bytes written. + Returns 0 or raises EOFError if the stream has been + closed. +
  • +
  • + recv(int): Reads from 1 to int bytes + and returns them as a string. Returns 0 or raises + EOFError if the stream has been closed. +
  • +
  • + close(): Closes the socket. +
  • +
  • + settimeout(n): Sets a (float) timeout on I/O + operations. +
  • +
+ For ease of use, you may also pass in an address (as a tuple) or a + host string as the sock argument. (A host string is a + hostname with an optional port (separated by + ":") which will be converted into a tuple of + (hostname, port).) A socket will be connected to this + address and used for communication. Exceptions from the + socket call may be thrown in this case. +
+
Parameters:
+
sock - + a socket or socket-like object to create the session over. +
           + (type=socket) +
+
+
Overrides:
+
threading.Thread.__init__
+
+
+
+ + +
+

__repr__(self) +
(Representation operator) +

+ Returns a string representation of this object, for debugging. +
+
Returns:
+
+ str +
+
+
Overrides:
+
threading.Thread.__repr__
+
+
+
+ + +
+

accept(self, + timeout=None) +

+ Return the next channel opened by the client over this transport, in + server mode. If no channel is opened before the given timeout, + None is returned. +
+
Parameters:
+
timeout - + seconds to wait for a channel, or None to wait + forever +
           + (type=int) +
+
+
Returns:
+
+ a new Channel opened by the client +
           + (type=Channel) +
+
+
+
+ + +
+

add_server_key(self, + key) +

+ Add a host key to the list of keys used for server mode. When + behaving as a server, the host key is used to sign certain packets + during the SSH2 negotiation, so that the client can trust that we are + who we say we are. Because this is used for signing, the key must + contain private key info, not just the public half. Only one key of + each type (RSA or DSS) is kept. +
+
Parameters:
+
key - + the host key to add, usually an RSAKey or DSSKey. +
           + (type=PKey) +
+
+
+
+ + +
+

auth_interactive(self, + username, + handler, + submethods='') +

+

Authenticate to the server interactively. A handler is used to + answer arbitrary questions from the server. On many servers, this is + just a dumb wrapper around PAM.

+

This method will block until the authentication succeeds or fails, + peroidically calling the handler asynchronously to get answers to + authentication questions. The handler may be called more than once if + the server continues to ask questions.

+

The handler is expected to be a callable that will handle calls of + the form: handler(title, instructions, prompt_list). The + title is meant to be a dialog-window title, and the + instructions are user instructions (both are strings). + prompt_list will be a list of prompts, each prompt being a + tuple of (str, bool). The string is the prompt and the + boolean indicates whether the user text should be echoed.

+

A sample call would thus be: handler('title', 'instructions', + [('Password:', False)]).

+

The handler should return a list or tuple of answers to the server's + questions.

+ If the server requires multi-step authentication (which is very + rare), this method will return a list of auth types permissible for the + next step. Otherwise, in the normal case, an empty list is + returned. +
+
Parameters:
+
username - + the username to authenticate as +
           + (type=string) +
handler - + a handler for responding to server questions +
           + (type=callable) +
submethods - + a string list of desired submethods (optional) +
           + (type=str) +
+
+
Returns:
+
+ list of auth types permissible for the next stage of + authentication (normally empty). +
           + (type=list) +
+
+
Raises:
+
BadAuthenticationType - + if public-key authentication isn't allowed by the server for + this user +
SSHException - + if the authentication failed +
+

Since: 1.5 +

+ +
+
+ + +
+

auth_none(self, + username) +

+ Try to authenticate to the server using no authentication at all. + This will almost always fail. It may be useful for determining the list + of authentication types supported by the server, by catching the BadAuthenticationType exception + raised. +
+
Parameters:
+
username - + the username to authenticate as +
           + (type=string) +
+
+
Returns:
+
+ list of auth types permissible for the next stage of + authentication (normally empty) +
           + (type=list) +
+
+
Raises:
+
BadAuthenticationType - + if "none" authentication isn't allowed by the server + for this user +
SSHException - + if the authentication failed due to a network error +
+

Since: 1.5 +

+ +
+
+ + +
+

auth_password(self, + username, + password, + event=None, + fallback=True) +

+

Authenticate to the server using a password. The username and + password are sent over an encrypted link.

+

If an event is passed in, this method will return + immediately, and the event will be triggered once authentication + succeeds or fails. On success, is_authenticated will return + True. On failure, you may use get_exception to get more detailed error + information.

+

Since 1.1, if no event is passed, this method will block until the + authentication succeeds or fails. On failure, an exception is raised. + Otherwise, the method simply returns.

+

Since 1.5, if no event is passed and fallback is + True (the default), if the server doesn't support plain + password authentication but does support so-called + "keyboard-interactive" mode, an attempt will be made to + authenticate using this interactive mode. If it fails, the normal + exception will be thrown as if the attempt had never been made. This is + useful for some recent Gentoo and Debian distributions, which turn off + plain password authentication in a misguided belief that interactive + authentication is "more secure". (It's not.)

+ If the server requires multi-step authentication (which is very + rare), this method will return a list of auth types permissible for the + next step. Otherwise, in the normal case, an empty list is + returned. +
+
Parameters:
+
username - + the username to authenticate as +
           + (type=string) +
password - + the password to authenticate with +
           + (type=string) +
event - + an event to trigger when the authentication attempt is + complete (whether it was successful or not) +
           + (type=threading.Event) +
fallback - + True if an attempt at an automated + "interactive" password auth should be made if the + server doesn't support normal password auth +
           + (type=bool) +
+
+
Returns:
+
+ list of auth types permissible for the next stage of + authentication (normally empty) +
           + (type=list) +
+
+
Raises:
+
BadAuthenticationType - + if password authentication isn't allowed by the server for + this user (and no event was passed in) +
SSHException - + if the authentication failed (and no event was passed in) +
+
+
+ + +
+

auth_publickey(self, + username, + key, + event=None) +

+

Authenticate to the server using a private key. The key is used to + sign data from the server, so it must include the private part.

+

If an event is passed in, this method will return + immediately, and the event will be triggered once authentication + succeeds or fails. On success, is_authenticated will return + True. On failure, you may use get_exception to get more detailed error + information.

+

Since 1.1, if no event is passed, this method will block until the + authentication succeeds or fails. On failure, an exception is raised. + Otherwise, the method simply returns.

+ If the server requires multi-step authentication (which is very + rare), this method will return a list of auth types permissible for the + next step. Otherwise, in the normal case, an empty list is + returned. +
+
Parameters:
+
username - + the username to authenticate as +
           + (type=string) +
key - + the private key to authenticate with +
           + (type=PKey) +
event - + an event to trigger when the authentication attempt is + complete (whether it was successful or not) +
           + (type=threading.Event) +
+
+
Returns:
+
+ list of auth types permissible for the next stage of + authentication (normally empty). +
           + (type=list) +
+
+
Raises:
+
BadAuthenticationType - + if public-key authentication isn't allowed by the server for + this user (and no event was passed in). +
SSHException - + if the authentication failed (and no event was passed in). +
+
+
+ + +
+

close(self) +

+ Close this session, and any open channels that are tied to it. +
+
+
+ + +
+

connect(self, + hostkey=None, + username='', + password=None, + pkey=None) +

+

Negotiate an SSH2 session, and optionally verify the server's host + key and authenticate using a password or private key. This is a + shortcut for start_client, get_remote_server_key, and Transport.auth_password or Transport.auth_publickey. Use those + methods if you want more control.

+ You can use this method immediately after creating a Transport to + negotiate encryption with a server. If it fails, an exception will be + thrown. On success, the method will return cleanly, and an encrypted + session exists. You may immediately call open_channel or open_session to get a Channel object, which is used for data + transfer. +
+
Parameters:
+
hostkey - + the host key expected from the server, or None if + you don't want to do host key verification. +
           + (type=PKey) +
username - + the username to authenticate as. +
           + (type=str) +
password - + a password to use for authentication, if you want to use + password authentication; otherwise None. +
           + (type=str) +
pkey - + a private key to use for authentication, if you want to use + private key authentication; otherwise None. +
           + (type=PKey) +
+
+
Raises:
+
SSHException - + if the SSH2 negotiation fails, the host key supplied by the + server is incorrect, or authentication fails. +
+

Note: If you fail to supply a password or private key, this method may +succeed, but a subsequent open_channel or open_session call may fail because you +haven't authenticated yet. +

+ +

Since: doduo +

+ +
+
+ + +
+

get_exception(self) +

+ Return any exception that happened during the last server request. + This can be used to fetch more specific error information after using + calls like start_client. The exception (if any) is + cleared after this call. +
+
Returns:
+
+ an exception, or None if there is no stored + exception. +
           + (type=Exception) +
+
+

Since: 1.1 +

+ +
+
+ + +
+

get_hexdump(self) +

+ Return True if the transport is currently logging hex + dumps of protocol traffic. +
+
Returns:
+
+ True if hex dumps are being logged +
           + (type=bool) +
+
+

Since: 1.4 +

+ +
+
+ + +
+

get_log_channel(self) +

+ Return the channel name used for this transport's logging. +
+
Returns:
+
+ channel name. +
           + (type=str) +
+
+

Since: 1.2 +

+ +
+
+ + +
+

get_remote_server_key(self) +

+ Return the host key of the server (in client mode). +
+
Returns:
+
+ public key of the remote server. +
           + (type=PKey) +
+
+
Raises:
+
SSHException - + if no session is currently active. +
+

Note: Previously this call returned a tuple of (key type, key string). You +can get the same effect by calling PKey.get_name for the key type, and +str(key) for the key string. +

+ +
+
+ + +
+

get_security_options(self) +

+ Return a SecurityOptions object which can be used + to tweak the encryption algorithms this transport will permit, and the + order of preference for them. +
+
Returns:
+
+ an object that can be used to change the preferred algorithms + for encryption, digest (hash), public key, and key exchange. +
           + (type=SecurityOptions) +
+
+

Since: ivysaur +

+ +
+
+ + +
+

get_server_key(self) +

+ Return the active host key, in server mode. After negotiating with + the client, this method will return the negotiated host key. If only + one type of host key was set with add_server_key, that's the only key that + will ever be returned. But in cases where you have set more than one + type of host key (for example, an RSA key and a DSS key), the key type + will be negotiated by the client, and this method will return the key + of the type agreed on. If the host key has not been negotiated yet, + None is returned. In client mode, the behavior is + undefined. +
+
Returns:
+
+ host key of the type negotiated by the client, or + None. +
           + (type=PKey) +
+
+
+
+ + +
+

get_username(self) +

+ Return the username this connection is authenticated for. If the + session is not authenticated (or authentication failed), this method + returns None. +
+
Returns:
+
+ username that was authenticated, or None. +
           + (type=string) +
+
+

Since: fearow +

+ +
+
+ + +
+

global_request(self, + kind, + data=None, + wait=True) +

+ Make a global request to the remote host. These are normally + extensions to the SSH2 protocol. +
+
Parameters:
+
kind - + name of the request. +
           + (type=str) +
data - + an optional tuple containing additional data to attach to the + request. +
           + (type=tuple) +
wait - + True if this method should not return until a + response is received; False otherwise. +
           + (type=bool) +
+
+
Returns:
+
+ a Message containing possible + additional data if the request was successful (or an empty Message if wait was + False); None if the request was + denied. +
           + (type=Message) +
+
+

Since: fearow +

+ +
+
+ + +
+

is_active(self) +

+ Return true if this session is active (open). +
+
Returns:
+
+ True if the session is still active (open); False if the + session is closed. +
           + (type=bool) +
+
+
+
+ + +
+

is_authenticated(self) +

+ Return true if this session is active and authenticated. +
+
Returns:
+
+ True if the session is still open and has been authenticated + successfully; False if authentication failed and/or the session + is closed. +
           + (type=bool) +
+
+
+
+ + +
+

open_channel(self, + kind, + dest_addr=None, + src_addr=None) +

+ Request a new channel to the server. Channels are socket-like objects used for + the actual transfer of data across the session. You may only request a + channel after negotiating encryption (using connect or start_client) and authenticating. +
+
Parameters:
+
kind - + the kind of channel requested (usually + "session", + "forwarded-tcpip" or + "direct-tcpip"). +
           + (type=str) +
dest_addr - + the destination address of this port forwarding, if + kind is "forwarded-tcpip" or + "direct-tcpip" (ignored for other channel + types). +
           + (type=(str, int)) +
src_addr - + the source address of this port forwarding, if + kind is "forwarded-tcpip" or + "direct-tcpip". +
           + (type=(str, int)) +
+
+
Returns:
+
+ a new Channel on success, or + None if the request is rejected or the session ends + prematurely. +
           + (type=Channel) +
+
+
+
+ + +
+

open_session(self) +

+ Request a new channel to the server, of type + "session". This is just an alias for + open_channel('session'). +
+
Returns:
+
+ a new Channel on success, or + None if the request is rejected or the session ends + prematurely. +
           + (type=Channel) +
+
+
+
+ + +
+

open_sftp_client(self) +

+ Create an SFTP client channel from an open transport. On success, an + SFTP session will be opened with the remote host, and a new SFTPClient + object will be returned. +
+
Returns:
+
+ a new SFTPClient object, referring to an + sftp session (channel) across this transport +
           + (type=SFTPClient) +
+
+
+
+ + +
+

renegotiate_keys(self) +

+ Force this session to switch to new keys. Normally this is done + automatically after the session hits a certain number of packets or + bytes sent or received, but this method gives you the option of forcing + new keys whenever you want. Negotiating new keys causes a pause in + traffic both ways as the two sides swap keys and do computations. This + method returns when the session has switched to new keys, or the + session has died mid-negotiation. +
+
Returns:
+
+ True if the renegotiation was successful, and the link is + using new keys; False if the session dropped during + renegotiation. +
           + (type=bool) +
+
+
+
+ + +
+

send_ignore(self, + bytes=None) +

+ Send a junk packet across the encrypted link. This is sometimes used + to add "noise" to a connection to confuse would-be attackers. + It can also be used as a keep-alive for long lived connections + traversing firewalls. +
+
Parameters:
+
bytes - + the number of random bytes to send in the payload of the + ignored packet -- defaults to a random number from 10 to 41. +
           + (type=int) +
+
+

Since: fearow +

+ +
+
+ + +
+

set_hexdump(self, + hexdump) +

+ Turn on/off logging a hex dump of protocol traffic at DEBUG level in + the logs. Normally you would want this off (which is the default), but + if you are debugging something, it may be useful. +
+
Parameters:
+
hexdump - + True to log protocol traffix (in hex) to the log; + False otherwise. +
           + (type=bool) +
+
+
+
+ + +
+

set_keepalive(self, + interval) +

+ Turn on/off keepalive packets (default is off). If this is set, + after interval seconds without sending any data over the + connection, a "keepalive" packet will be sent (and ignored by + the remote host). This can be useful to keep connections alive over a + NAT, for example. +
+
Parameters:
+
interval - + seconds to wait before sending a keepalive packet (or 0 to + disable keepalives). +
           + (type=int) +
+
+

Since: fearow +

+ +
+
+ + +
+

set_log_channel(self, + name) +

+ Set the channel for this transport's logging. The default is + "paramiko.transport" but it can be set to + anything you want. (See the logging module for more info.) + SSH Channels will log to a sub-channel of the one specified. +
+
Parameters:
+
name - + new channel name for logging. +
           + (type=str) +
+
+

Since: 1.1 +

+ +
+
+ + +
+

set_subsystem_handler(self, + name, + handler, + *larg, + **kwarg) +

+

Set the handler class for a subsystem in server mode. If a request + for this subsystem is made on an open ssh channel later, this handler + will be constructed and called -- see SubsystemHandler for more detailed + documentation.

+ Any extra parameters (including keyword arguments) are saved and + passed to the SubsystemHandler constructor later. +
+
Parameters:
+
name - + name of the subsystem. +
           + (type=str) +
handler - + subclass of SubsystemHandler that handles this + subsystem. +
           + (type=class) +
+
+
+
+ + +
+

start_client(self, + event=None) +

+

Negotiate a new SSH2 session as a client. This is the first step + after creating a new Transport. A separate thread is created + for protocol negotiation.

+

If an event is passed in, this method returns immediately. When + negotiation is done (successful or not), the given Event + will be triggered. On failure, is_active will return + False.

+

(Since 1.4) If event is None, this method + will not return until negotation is done. On success, the method + returns normally. Otherwise an SSHException is raised.

+ After a successful negotiation, you will usually want to + authenticate, calling auth_password or auth_publickey. +
+
Parameters:
+
event - + an event to trigger when negotiation is complete + (optional) +
           + (type=threading.Event) +
+
+
Raises:
+
SSHException - + if negotiation fails (and no event was passed + in) +
+

Notes: +

    +
  • connect is a simpler method for connecting +as a client. +
  • +
  • After calling this method (or start_server or connect), you should no longer directly +read from or write to the original socket object. + +
  • +

+ +
+
+ + +
+

start_server(self, + event=None, + server=None) +

+

Negotiate a new SSH2 session as a server. This is the first step + after creating a new Transport and setting up your server host + key(s). A separate thread is created for protocol negotiation.

+

If an event is passed in, this method returns immediately. When + negotiation is done (successful or not), the given Event + will be triggered. On failure, is_active will return + False.

+

(Since 1.4) If event is None, this method + will not return until negotation is done. On success, the method + returns normally. Otherwise an SSHException is raised.

+

After a successful negotiation, the client will need to + authenticate. Override the methods get_allowed_auths, check_auth_none, check_auth_password, and check_auth_publickey in the given + server object to control the authentication process.

+ After a successful authentication, the client should request to open + a channel. Override check_channel_request in the given + server object to allow channels to be opened. +
+
Parameters:
+
event - + an event to trigger when negotiation is complete. +
           + (type=threading.Event) +
server - + an object used to perform authentication and create Channels. +
           + (type=server.ServerInterface) +
+
+
Raises:
+
SSHException - + if negotiation fails (and no event was passed + in) +
+

Note: After calling this method (or start_client or connect), you should no longer directly +read from or write to the original socket object. +

+ +
+
+ + +
+

use_compression(self, + compress=True) +

+ Turn on/off compression. This will only have an affect before + starting the transport (ie before calling connect, etc). By default, compression is + off since it negatively affects interactive sessions and is not fully + tested. +
+
Parameters:
+
compress - + True to ask the remote client/server to compress + traffic; False to refuse compression +
           + (type=bool) +
+
+

Since: 1.5.2 +

+ +
+
+
+ + + + + + +
Static Method Details
+ + +
+

load_server_moduli(filename=None) +

+

(optional) Load a file of prime moduli for use in doing + group-exchange key negotiation in server mode. It's a rather obscure + option and can be safely ignored.

+ In server mode, the remote client may request + "group-exchange" key negotiation, which asks the server to + send a random prime number that fits certain criteria. These primes are + pretty difficult to compute, so they can't be generated on demand. But + many systems contain a file of suitable primes (usually named something + like /etc/ssh/moduli). If you call + load_server_moduli and it returns True, then + this file of primes has been loaded and we will support + "group-exchange" in server mode. Otherwise server mode will + just claim that it doesn't support that method of key negotiation. +
+
Parameters:
+
filename - + optional path to the moduli file, if you happen to know that + it's not in a standard location. +
           + (type=str) +
+
+
Returns:
+
+ True if a moduli file was successfully loaded; False + otherwise. +
           + (type=bool) +
+
+

Note: This has no effect when used in client mode. +

+ +

Since: doduo +

+ +
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.agent-module.html b/docs/public/paramiko.agent-module.html new file mode 100644 index 0000000..560432a --- /dev/null +++ b/docs/public/paramiko.agent-module.html @@ -0,0 +1,164 @@ + + + + + paramiko.agent + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module agent +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.agent

+ +SSH Agent interface for Unix clients. +
+ + + + + + + + + + + + + +
Variable Summary
intSSH2_AGENT_IDENTITIES_ANSWER = 12                                                                    
intSSH2_AGENT_SIGN_RESPONSE = 14                                                                    
intSSH2_AGENTC_REQUEST_IDENTITIES = 11                                                                    
intSSH2_AGENTC_SIGN_REQUEST = 13                                                                    

+ + + + + + +
Variable Details
+
+ +

SSH2_AGENT_IDENTITIES_ANSWER

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+12                                                                    
+
+
+
+
+
+ +

SSH2_AGENT_SIGN_RESPONSE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+14                                                                    
+
+
+
+
+
+ +

SSH2_AGENTC_REQUEST_IDENTITIES

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+11                                                                    
+
+
+
+
+
+ +

SSH2_AGENTC_SIGN_REQUEST

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+13                                                                    
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.dsskey-module.html b/docs/public/paramiko.dsskey-module.html new file mode 100644 index 0000000..f600c89 --- /dev/null +++ b/docs/public/paramiko.dsskey-module.html @@ -0,0 +1,62 @@ + + + + + paramiko.dsskey + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module dsskey +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.dsskey

+ +DSSKey +
+ + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.file-module.html b/docs/public/paramiko.file-module.html new file mode 100644 index 0000000..4cb6c90 --- /dev/null +++ b/docs/public/paramiko.file-module.html @@ -0,0 +1,61 @@ + + + + + paramiko.file + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module file +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.file

+ +BufferedFile. +
+ + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.message-module.html b/docs/public/paramiko.message-module.html new file mode 100644 index 0000000..2ccf4d9 --- /dev/null +++ b/docs/public/paramiko.message-module.html @@ -0,0 +1,61 @@ + + + + + paramiko.message + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module message +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.message

+ +Implementation of an SSH2 "message". +
+ + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:46 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.pkey-module.html b/docs/public/paramiko.pkey-module.html new file mode 100644 index 0000000..e7aac95 --- /dev/null +++ b/docs/public/paramiko.pkey-module.html @@ -0,0 +1,61 @@ + + + + + paramiko.pkey + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module pkey +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.pkey

+ +Common API for all public keys. +
+ + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.rsakey-module.html b/docs/public/paramiko.rsakey-module.html new file mode 100644 index 0000000..b287187 --- /dev/null +++ b/docs/public/paramiko.rsakey-module.html @@ -0,0 +1,62 @@ + + + + + paramiko.rsakey + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module rsakey +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.rsakey

+ +RSAKey +
+ + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.server-module.html b/docs/public/paramiko.server-module.html new file mode 100644 index 0000000..b283866 --- /dev/null +++ b/docs/public/paramiko.server-module.html @@ -0,0 +1,74 @@ + + + + + paramiko.server + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module server +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.server

+ +ServerInterface is an interface to override +for server support. +
+ + + + + + + +
Classes
+ InteractiveQueryA query (set of prompts) for a user during interactive +authentication.

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.server.InteractiveQuery-class.html b/docs/public/paramiko.server.InteractiveQuery-class.html new file mode 100644 index 0000000..6a96be3 --- /dev/null +++ b/docs/public/paramiko.server.InteractiveQuery-class.html @@ -0,0 +1,195 @@ + + + + + paramiko.server.InteractiveQuery + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module server :: + Class InteractiveQuery +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type InteractiveQuery

+ +
+object --+
+         |
+        InteractiveQuery
+

+ +
+ +A query (set of prompts) for a user during interactive +authentication. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + name, + instructions, + *prompts) +
+Create a new interactive query to send to the client.
 add_prompt(self, + prompt, + echo) +
+Add a prompt to this query.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + +
Method Details
+ + +
+

__init__(self, + name='', + instructions='', + *prompts) +
(Constructor) +

+ Create a new interactive query to send to the client. The name and + instructions are optional, but are generally displayed to the end user. + A list of prompts may be included, or they may be added via the add_prompt method. +
+
Parameters:
+
name - + name of this query +
           + (type=str) +
instructions - + user instructions (usually short) about this query +
           + (type=str) +
+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

add_prompt(self, + prompt, + echo=True) +

+ Add a prompt to this query. The prompt should be a (reasonably + short) string. Multiple prompts can be added to the same query. +
+
Parameters:
+
prompt - + the user prompt +
           + (type=str) +
echo - + True (default) if the user's response should be + echoed; False if not (for a password or similar) +
           + (type=bool) +
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.sftp-module.html b/docs/public/paramiko.sftp-module.html new file mode 100644 index 0000000..66fb99e --- /dev/null +++ b/docs/public/paramiko.sftp-module.html @@ -0,0 +1,1060 @@ + + + + + paramiko.sftp + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module sftp +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.sftp

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Variable Summary
intCMD_ATTRS = 105                                                                   
intCMD_CLOSE = 4                                                                     
intCMD_DATA = 103                                                                   
intCMD_EXTENDED = 200                                                                   
intCMD_EXTENDED_REPLY = 201                                                                   
intCMD_FSETSTAT = 10                                                                    
intCMD_FSTAT = 8                                                                     
intCMD_HANDLE = 102                                                                   
intCMD_INIT = 1                                                                     
intCMD_LSTAT = 7                                                                     
intCMD_MKDIR = 14                                                                    
intCMD_NAME = 104                                                                   
dictCMD_NAMES = {1: 'init', 2: 'version', 3: 'open', 4: 'clo... +
intCMD_OPEN = 3                                                                     
intCMD_OPENDIR = 11                                                                    
intCMD_READ = 5                                                                     
intCMD_READDIR = 12                                                                    
intCMD_READLINK = 19                                                                    
intCMD_REALPATH = 16                                                                    
intCMD_REMOVE = 13                                                                    
intCMD_RENAME = 18                                                                    
intCMD_RMDIR = 15                                                                    
intCMD_SETSTAT = 9                                                                     
intCMD_STAT = 17                                                                    
intCMD_STATUS = 101                                                                   
intCMD_SYMLINK = 20                                                                    
intCMD_VERSION = 2                                                                     
intCMD_WRITE = 6                                                                     
intSFTP_BAD_MESSAGE = 5                                                                     
intSFTP_CONNECTION_LOST = 7                                                                     
listSFTP_DESC = ['Success', 'End of file', 'No such file', '... +
intSFTP_EOF = 1                                                                     
intSFTP_FAILURE = 4                                                                     
intSFTP_FLAG_APPEND = 4                                                                     
intSFTP_FLAG_CREATE = 8                                                                     
intSFTP_FLAG_EXCL = 32                                                                    
intSFTP_FLAG_READ = 1                                                                     
intSFTP_FLAG_TRUNC = 16                                                                    
intSFTP_FLAG_WRITE = 2                                                                     
intSFTP_NO_CONNECTION = 6                                                                     
intSFTP_NO_SUCH_FILE = 2                                                                     
intSFTP_OK = 0                                                                     
intSFTP_OP_UNSUPPORTED = 8                                                                     
intSFTP_PERMISSION_DENIED = 3                                                                     

+ + + + + + +
Variable Details
+
+ +

CMD_ATTRS

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+105                                                                   
+
+
+
+
+
+ +

CMD_CLOSE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+4                                                                     
+
+
+
+
+
+ +

CMD_DATA

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+103                                                                   
+
+
+
+
+
+ +

CMD_EXTENDED

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+200                                                                   
+
+
+
+
+
+ +

CMD_EXTENDED_REPLY

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+201                                                                   
+
+
+
+
+
+ +

CMD_FSETSTAT

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+10                                                                    
+
+
+
+
+
+ +

CMD_FSTAT

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+8                                                                     
+
+
+
+
+
+ +

CMD_HANDLE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+102                                                                   
+
+
+
+
+
+ +

CMD_INIT

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1                                                                     
+
+
+
+
+
+ +

CMD_LSTAT

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+7                                                                     
+
+
+
+
+
+ +

CMD_MKDIR

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+14                                                                    
+
+
+
+
+
+ +

CMD_NAME

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+104                                                                   
+
+
+
+
+
+ +

CMD_NAMES

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{1: 'init',
+ 2: 'version',
+ 3: 'open',
+ 4: 'close',
+ 5: 'read',
+ 6: 'write',
+ 7: 'lstat',
+ 8: 'fstat',
+...                                                                    
+
+
+
+
+
+ +

CMD_OPEN

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+3                                                                     
+
+
+
+
+
+ +

CMD_OPENDIR

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+11                                                                    
+
+
+
+
+
+ +

CMD_READ

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+5                                                                     
+
+
+
+
+
+ +

CMD_READDIR

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+12                                                                    
+
+
+
+
+
+ +

CMD_READLINK

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+19                                                                    
+
+
+
+
+
+ +

CMD_REALPATH

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+16                                                                    
+
+
+
+
+
+ +

CMD_REMOVE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+13                                                                    
+
+
+
+
+
+ +

CMD_RENAME

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+18                                                                    
+
+
+
+
+
+ +

CMD_RMDIR

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+15                                                                    
+
+
+
+
+
+ +

CMD_SETSTAT

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+9                                                                     
+
+
+
+
+
+ +

CMD_STAT

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+17                                                                    
+
+
+
+
+
+ +

CMD_STATUS

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+101                                                                   
+
+
+
+
+
+ +

CMD_SYMLINK

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+20                                                                    
+
+
+
+
+
+ +

CMD_VERSION

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ +

CMD_WRITE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+6                                                                     
+
+
+
+
+
+ +

SFTP_BAD_MESSAGE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+5                                                                     
+
+
+
+
+
+ +

SFTP_CONNECTION_LOST

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+7                                                                     
+
+
+
+
+
+ +

SFTP_DESC

+
+
+
+
+
Type:
+
+ list + +
+
Value:
+
+
+['Success',
+ 'End of file',
+ 'No such file',
+ 'Permission denied',
+ 'Failure',
+ 'Bad message',
+ 'No connection',
+ 'Connection lost',
+...                                                                    
+
+
+
+
+
+ +

SFTP_EOF

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1                                                                     
+
+
+
+
+
+ +

SFTP_FAILURE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+4                                                                     
+
+
+
+
+
+ +

SFTP_FLAG_APPEND

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+4                                                                     
+
+
+
+
+
+ +

SFTP_FLAG_CREATE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+8                                                                     
+
+
+
+
+
+ +

SFTP_FLAG_EXCL

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+32                                                                    
+
+
+
+
+
+ +

SFTP_FLAG_READ

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1                                                                     
+
+
+
+
+
+ +

SFTP_FLAG_TRUNC

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+16                                                                    
+
+
+
+
+
+ +

SFTP_FLAG_WRITE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ +

SFTP_NO_CONNECTION

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+6                                                                     
+
+
+
+
+
+ +

SFTP_NO_SUCH_FILE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ +

SFTP_OK

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+0                                                                     
+
+
+
+
+
+ +

SFTP_OP_UNSUPPORTED

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+8                                                                     
+
+
+
+
+
+ +

SFTP_PERMISSION_DENIED

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+3                                                                     
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.sftp_attr-module.html b/docs/public/paramiko.sftp_attr-module.html new file mode 100644 index 0000000..7ff2add --- /dev/null +++ b/docs/public/paramiko.sftp_attr-module.html @@ -0,0 +1,59 @@ + + + + + paramiko.sftp_attr + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module sftp_attr +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.sftp_attr

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.sftp_client-module.html b/docs/public/paramiko.sftp_client-module.html new file mode 100644 index 0000000..a82e15f --- /dev/null +++ b/docs/public/paramiko.sftp_client-module.html @@ -0,0 +1,61 @@ + + + + + paramiko.sftp_client + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module sftp_client +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.sftp_client

+ +Client-mode SFTP support. +
+ + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.sftp_file-module.html b/docs/public/paramiko.sftp_file-module.html new file mode 100644 index 0000000..3d2f402 --- /dev/null +++ b/docs/public/paramiko.sftp_file-module.html @@ -0,0 +1,62 @@ + + + + + paramiko.sftp_file + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module sftp_file +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.sftp_file

+ +SFTPFile +
+ + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.sftp_handle-module.html b/docs/public/paramiko.sftp_handle-module.html new file mode 100644 index 0000000..2a75e59 --- /dev/null +++ b/docs/public/paramiko.sftp_handle-module.html @@ -0,0 +1,61 @@ + + + + + paramiko.sftp_handle + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module sftp_handle +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.sftp_handle

+ +Abstraction of an SFTP file handle (for server mode). +
+ + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.sftp_server-module.html b/docs/public/paramiko.sftp_server-module.html new file mode 100644 index 0000000..06183af --- /dev/null +++ b/docs/public/paramiko.sftp_server-module.html @@ -0,0 +1,61 @@ + + + + + paramiko.sftp_server + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module sftp_server +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.sftp_server

+ +Server-mode SFTP support. +
+ + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.sftp_si-module.html b/docs/public/paramiko.sftp_si-module.html new file mode 100644 index 0000000..121d97e --- /dev/null +++ b/docs/public/paramiko.sftp_si-module.html @@ -0,0 +1,63 @@ + + + + + paramiko.sftp_si + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module sftp_si +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.sftp_si

+ +SFTPServerInterface is an interface to +override for SFTP server support. +
+ + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.transport-module.html b/docs/public/paramiko.transport-module.html new file mode 100644 index 0000000..42d378f --- /dev/null +++ b/docs/public/paramiko.transport-module.html @@ -0,0 +1,63 @@ + + + + + paramiko.transport + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module transport +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.transport

+ +Transport handles the core SSH2 +protocol. +
+ + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.util-module.html b/docs/public/paramiko.util-module.html new file mode 100644 index 0000000..a7ad4cd --- /dev/null +++ b/docs/public/paramiko.util-module.html @@ -0,0 +1,369 @@ + + + + + paramiko.util + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module util +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module paramiko.util

+ +Useful functions used by the rest of paramiko. +
+ + + + + + + +
Classes
+ PFilter 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function Summary
 bit_length(n) +
 deflate_long(n, + add_sign_padding) +
+turns a long-int into a normalized byte string (adapted from +Crypto.Util.number)
 format_binary(data, + prefix) +
 format_binary_line(data) +
 format_binary_weird(data) +
string +generate_key_bytes(hashclass, + salt, + key, + nbytes) +
+Given a password, passphrase, or other human-source key, scramble it +through a secure hash into some keyworthy bytes.
 get_logger(name) +
 get_thread_id() +
 hexify(s) +
+turn a string into a hex sequence
 inflate_long(s, + always_positive) +
+turns a normalized byte string into a long-int (adapted from +Crypto.Util.number)
dict(hostname, dict(keytype, PKey)) +load_host_keys(filename) +
+Read a file of known SSH host keys, in the format used by openssh, and +return a compound dict of hostname -> keytype -> PKey.
 log_to_file(filename, + level) +
+send paramiko logs to a logfile, if they're not already going +somewhere
 lookup_ssh_host_config(hostname, + config) +
+Return a dict of config options for a given hostname.
 mod_inverse(x, + m) +
object +parse_ssh_config(file_obj) +
+Parse a config file of the format used by OpenSSH, and return an +object that can be used to make queries to lookup_ssh_host_config.
 safe_string(s) +
 tb_strings() +
 unhexify(s) +
+turn a hex sequence back into a string

+ + + + + + +
Function Details
+ + +
+

deflate_long(n, + add_sign_padding=True) +

+ turns a long-int into a normalized byte string (adapted from + Crypto.Util.number) +
+
+
+ + +
+

generate_key_bytes(hashclass, + salt, + key, + nbytes) +

+ Given a password, passphrase, or other human-source key, scramble it + through a secure hash into some keyworthy bytes. This specific + algorithm is used for encrypting/decrypting private key files. +
+
Parameters:
+
hashclass - + class from Crypto.Hash that can be used as a + secure hashing function (like MD5 or + SHA). +
           + (type=Crypto.Hash) +
salt - + data to salt the hash with. +
           + (type=string) +
key - + human-entered password or passphrase. +
           + (type=string) +
nbytes - + number of bytes to generate. +
           + (type=int) +
+
+
Returns:
+
+ key data +
           + (type=string) +
+
+
+
+ + +
+

hexify(s) +

+ turn a string into a hex sequence +
+
+
+ + +
+

inflate_long(s, + always_positive=False) +

+ turns a normalized byte string into a long-int (adapted from + Crypto.Util.number) +
+
+
+ + +
+

load_host_keys(filename) +

+

Read a file of known SSH host keys, in the format used by openssh, + and return a compound dict of hostname -> keytype -> + PKey. The hostname may be an IP address + or DNS name. The keytype will be either + "ssh-rsa" or + "ssh-dss".

+ This type of file unfortunately doesn't exist on Windows, but on + posix, it will usually be stored in + os.path.expanduser("~/.ssh/known_hosts"). +
+
Parameters:
+
filename - + name of the file to read host keys from +
           + (type=str) +
+
+
Returns:
+
+ dict of host keys, indexed by hostname and then keytype +
           + (type=dict(hostname, dict(keytype, PKey))) +
+
+
+
+ + +
+

log_to_file(filename, + level=10) +

+ send paramiko logs to a logfile, if they're not already going + somewhere +
+
+
+ + +
+

lookup_ssh_host_config(hostname, + config) +

+

Return a dict of config options for a given hostname. The + config object must come from parse_ssh_config.

+

The host-matching rules of OpenSSH's ssh_config man + page are used, which means that all configuration options from matching + host specifications are merged, with more specific hostmasks taking + precedence. In other words, if "Port" is set + under "Host *" and also "Host + *.example.com", and the lookup is for + "ssh.example.com", then the port entry for + "Host *.example.com" will win out.

+ The keys in the returned dict are all normalized to lowercase (look + for "port", not "Port". + No other processing is done to the keys or values. +
+
Parameters:
+
hostname - + the hostname to lookup +
           + (type=str) +
config - + the config object to search +
           + (type=object) +
+
+
+
+ + +
+

parse_ssh_config(file_obj) +

+

Parse a config file of the format used by OpenSSH, and return an + object that can be used to make queries to lookup_ssh_host_config. The format is + described in OpenSSH's ssh_config man page. This method is + provided primarily as a convenience to posix users (since the OpenSSH + format is a de-facto standard on posix) but should work fine on Windows + too.

+ The return value is currently a list of dictionaries, each + containing host-specific configuration, but this is considered an + implementation detail and may be subject to change in later + versions. +
+
Parameters:
+
file_obj - + a file-like object to read the config file from +
           + (type=file) +
+
+
Returns:
+
+ opaque configuration object +
           + (type=object) +
+
+
+
+ + +
+

unhexify(s) +

+ turn a hex sequence back into a string +
+
+
+
+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/public/paramiko.util.PFilter-class.html b/docs/public/paramiko.util.PFilter-class.html new file mode 100644 index 0000000..f1e8059 --- /dev/null +++ b/docs/public/paramiko.util.PFilter-class.html @@ -0,0 +1,124 @@ + + + + + paramiko.util.PFilter + + + + + + + + + + + + + + + + + + +
+ + Package paramiko :: + Module util :: + Class PFilter +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type PFilter

+ +
+object --+
+         |
+        PFilter
+

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 filter(self, + record) +
    Inherited from object
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for +signature
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+x.__repr__() <==> repr(x)
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/docs/public/threading.Thread-class.html b/docs/public/threading.Thread-class.html new file mode 100644 index 0000000..951099e --- /dev/null +++ b/docs/public/threading.Thread-class.html @@ -0,0 +1,161 @@ + + + + + threading.Thread + + + + + + + + + + + + + + + + + + +
+ + Module threading :: + Class Thread +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type Thread

+ +
+object --+    
+         |    
+  _Verbose --+
+             |
+            Thread
+

+ +
Known Subclasses:
+
+ SubsystemHandler, + Transport
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + group, + target, + name, + args, + kwargs, + verbose) +
(type, value, traceback)__exc_info() +
+Return information about the most recent exception caught by an except +clause in the current stack frame or in an older stack frame.
 __repr__(self) +
 getName(self) +
 isAlive(self) +
 isDaemon(self) +
 join(self, + timeout) +
 run(self) +
 setDaemon(self, + daemonic) +
 setName(self, + name) +
 start(self) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+x.__hash__() <==> hash(x)
 __new__(T, + S, + ...) +
+T.__new__(S, ...) -> a new object with type S, a subtype of T
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+x.__str__() <==> str(x)

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:47 2005http://epydoc.sf.net
+ + diff --git a/docs/public/toc-everything.html b/docs/public/toc-everything.html new file mode 100644 index 0000000..e699f06 --- /dev/null +++ b/docs/public/toc-everything.html @@ -0,0 +1,121 @@ + + + + + Everything + + + +
Everything
+
+ + +All Classes
+paramiko.Agent
+paramiko.AgentKey
+paramiko.BufferedFile
+paramiko.Channel
+paramiko.DSSKey
+paramiko.Message
+paramiko.RSAKey
+paramiko.SecurityOptions
+paramiko.server.InteractiveQuery
+paramiko.SFTP
+paramiko.SFTPAttributes
+paramiko.SFTPClient
+paramiko.SFTPFile
+paramiko.SFTPHandle
+paramiko.SFTPServer
+paramiko.SubsystemHandler
+paramiko.Transport
+paramiko.util.PFilter
+
+ + +All Exceptions
+paramiko.BadAuthenticationType
+paramiko.PasswordRequiredException
+paramiko.SFTPError
+paramiko.SSHException
+
+ + +All Functions
+bit_length
+deflate_long
+format_binary
+format_binary_line
+format_binary_weird
+generate_key_bytes
+get_logger
+get_thread_id
+hexify
+inflate_long
+load_host_keys
+log_to_file
+lookup_ssh_host_config
+mod_inverse
+parse_ssh_config
+safe_string
+tb_strings
+unhexify
+
+ + +All Variables
+CMD_ATTRS
+CMD_CLOSE
+CMD_DATA
+CMD_EXTENDED
+CMD_EXTENDED_REPLY
+CMD_FSETSTAT
+CMD_FSTAT
+CMD_HANDLE
+CMD_INIT
+CMD_LSTAT
+CMD_MKDIR
+CMD_NAME
+CMD_NAMES
+CMD_OPEN
+CMD_OPENDIR
+CMD_READ
+CMD_READDIR
+CMD_READLINK
+CMD_REALPATH
+CMD_REMOVE
+CMD_RENAME
+CMD_RMDIR
+CMD_SETSTAT
+CMD_STAT
+CMD_STATUS
+CMD_SYMLINK
+CMD_VERSION
+CMD_WRITE
+SFTP_BAD_MESSAGE
+SFTP_CONNECTION_LOST
+SFTP_DESC
+SFTP_EOF
+SFTP_FAILURE
+SFTP_FLAG_APPEND
+SFTP_FLAG_CREATE
+SFTP_FLAG_EXCL
+SFTP_FLAG_READ
+SFTP_FLAG_TRUNC
+SFTP_FLAG_WRITE
+SFTP_NO_CONNECTION
+SFTP_NO_SUCH_FILE
+SFTP_OK
+SFTP_OP_UNSUPPORTED
+SFTP_PERMISSION_DENIED
+SSH2_AGENT_IDENTITIES_ANSWER
+SSH2_AGENT_SIGN_RESPONSE
+SSH2_AGENTC_REQUEST_IDENTITIES
+SSH2_AGENTC_SIGN_REQUEST
+
+ +
+[show private | hide private] + + diff --git a/docs/public/toc-paramiko-module.html b/docs/public/toc-paramiko-module.html new file mode 100644 index 0000000..7353601 --- /dev/null +++ b/docs/public/toc-paramiko-module.html @@ -0,0 +1,69 @@ + + + + + paramiko + + + +
paramiko
+
+ + +Modules
+agent
+dsskey
+file
+message
+pkey
+rsakey
+server
+sftp
+sftp_attr
+sftp_client
+sftp_file
+sftp_handle
+sftp_server
+sftp_si
+transport
+util
+
+ + +Classes
+Agent
+AgentKey
+BufferedFile
+Channel
+DSSKey
+Message
+RSAKey
+SecurityOptions
+SFTP
+SFTPAttributes
+SFTPClient
+SFTPFile
+SFTPHandle
+SFTPServer
+SubsystemHandler
+Transport
+
+ + +Exceptions
+BadAuthenticationType
+PasswordRequiredException
+SFTPError
+SSHException
+
+ + +Variables
+
+ +
+[show private | hide private] + + diff --git a/docs/public/toc-paramiko.agent-module.html b/docs/public/toc-paramiko.agent-module.html new file mode 100644 index 0000000..543e5af --- /dev/null +++ b/docs/public/toc-paramiko.agent-module.html @@ -0,0 +1,25 @@ + + + + + paramiko.agent + + + +
agent
+
+ + +Variables
+SSH2_AGENT_IDENTITIES_ANSWER
+SSH2_AGENT_SIGN_RESPONSE
+SSH2_AGENTC_REQUEST_IDENTITIES
+SSH2_AGENTC_SIGN_REQUEST
+
+ +
+[show private | hide private] + + diff --git a/docs/public/toc-paramiko.dsskey-module.html b/docs/public/toc-paramiko.dsskey-module.html new file mode 100644 index 0000000..7f5fddb --- /dev/null +++ b/docs/public/toc-paramiko.dsskey-module.html @@ -0,0 +1,17 @@ + + + + + paramiko.dsskey + + + +
dsskey
+
+ +
+[show private | hide private] + + diff --git a/docs/public/toc-paramiko.file-module.html b/docs/public/toc-paramiko.file-module.html new file mode 100644 index 0000000..9c02537 --- /dev/null +++ b/docs/public/toc-paramiko.file-module.html @@ -0,0 +1,21 @@ + + + + + paramiko.file + + + +
file
+
+ + +Variables
+
+ +
+[show private | hide private] + + diff --git a/docs/public/toc-paramiko.message-module.html b/docs/public/toc-paramiko.message-module.html new file mode 100644 index 0000000..14ecd78 --- /dev/null +++ b/docs/public/toc-paramiko.message-module.html @@ -0,0 +1,17 @@ + + + + + paramiko.message + + + +
message
+
+ +
+[show private | hide private] + + diff --git a/docs/public/toc-paramiko.pkey-module.html b/docs/public/toc-paramiko.pkey-module.html new file mode 100644 index 0000000..a2c0c5b --- /dev/null +++ b/docs/public/toc-paramiko.pkey-module.html @@ -0,0 +1,17 @@ + + + + + paramiko.pkey + + + +
pkey
+
+ +
+[show private | hide private] + + diff --git a/docs/public/toc-paramiko.rsakey-module.html b/docs/public/toc-paramiko.rsakey-module.html new file mode 100644 index 0000000..ceceb19 --- /dev/null +++ b/docs/public/toc-paramiko.rsakey-module.html @@ -0,0 +1,17 @@ + + + + + paramiko.rsakey + + + +
rsakey
+
+ +
+[show private | hide private] + + diff --git a/docs/public/toc-paramiko.server-module.html b/docs/public/toc-paramiko.server-module.html new file mode 100644 index 0000000..c01d6d6 --- /dev/null +++ b/docs/public/toc-paramiko.server-module.html @@ -0,0 +1,22 @@ + + + + + paramiko.server + + + +
server
+
+ + +Classes
+InteractiveQuery
+
+ +
+[show private | hide private] + + diff --git a/docs/public/toc-paramiko.sftp-module.html b/docs/public/toc-paramiko.sftp-module.html new file mode 100644 index 0000000..52f03a3 --- /dev/null +++ b/docs/public/toc-paramiko.sftp-module.html @@ -0,0 +1,65 @@ + + + + + paramiko.sftp + + + +
sftp
+
+ + +Variables
+CMD_ATTRS
+CMD_CLOSE
+CMD_DATA
+CMD_EXTENDED
+CMD_EXTENDED_REPLY
+CMD_FSETSTAT
+CMD_FSTAT
+CMD_HANDLE
+CMD_INIT
+CMD_LSTAT
+CMD_MKDIR
+CMD_NAME
+CMD_NAMES
+CMD_OPEN
+CMD_OPENDIR
+CMD_READ
+CMD_READDIR
+CMD_READLINK
+CMD_REALPATH
+CMD_REMOVE
+CMD_RENAME
+CMD_RMDIR
+CMD_SETSTAT
+CMD_STAT
+CMD_STATUS
+CMD_SYMLINK
+CMD_VERSION
+CMD_WRITE
+SFTP_BAD_MESSAGE
+SFTP_CONNECTION_LOST
+SFTP_DESC
+SFTP_EOF
+SFTP_FAILURE
+SFTP_FLAG_APPEND
+SFTP_FLAG_CREATE
+SFTP_FLAG_EXCL
+SFTP_FLAG_READ
+SFTP_FLAG_TRUNC
+SFTP_FLAG_WRITE
+SFTP_NO_CONNECTION
+SFTP_NO_SUCH_FILE
+SFTP_OK
+SFTP_OP_UNSUPPORTED
+SFTP_PERMISSION_DENIED
+
+ +
+[show private | hide private] + + diff --git a/docs/public/toc-paramiko.sftp_attr-module.html b/docs/public/toc-paramiko.sftp_attr-module.html new file mode 100644 index 0000000..080044e --- /dev/null +++ b/docs/public/toc-paramiko.sftp_attr-module.html @@ -0,0 +1,17 @@ + + + + + paramiko.sftp_attr + + + +
sftp_attr
+
+ +
+[show private | hide private] + + diff --git a/docs/public/toc-paramiko.sftp_client-module.html b/docs/public/toc-paramiko.sftp_client-module.html new file mode 100644 index 0000000..7bf1ad8 --- /dev/null +++ b/docs/public/toc-paramiko.sftp_client-module.html @@ -0,0 +1,21 @@ + + + + + paramiko.sftp_client + + + +
sftp_client
+
+ + +Functions
+
+ +
+[show private | hide private] + + diff --git a/docs/public/toc-paramiko.sftp_file-module.html b/docs/public/toc-paramiko.sftp_file-module.html new file mode 100644 index 0000000..aee1350 --- /dev/null +++ b/docs/public/toc-paramiko.sftp_file-module.html @@ -0,0 +1,17 @@ + + + + + paramiko.sftp_file + + + +
sftp_file
+
+ +
+[show private | hide private] + + diff --git a/docs/public/toc-paramiko.sftp_handle-module.html b/docs/public/toc-paramiko.sftp_handle-module.html new file mode 100644 index 0000000..fc8b60a --- /dev/null +++ b/docs/public/toc-paramiko.sftp_handle-module.html @@ -0,0 +1,17 @@ + + + + + paramiko.sftp_handle + + + +
sftp_handle
+
+ +
+[show private | hide private] + + diff --git a/docs/public/toc-paramiko.sftp_server-module.html b/docs/public/toc-paramiko.sftp_server-module.html new file mode 100644 index 0000000..93677ba --- /dev/null +++ b/docs/public/toc-paramiko.sftp_server-module.html @@ -0,0 +1,21 @@ + + + + + paramiko.sftp_server + + + +
sftp_server
+
+ + +Variables
+
+ +
+[show private | hide private] + + diff --git a/docs/public/toc-paramiko.sftp_si-module.html b/docs/public/toc-paramiko.sftp_si-module.html new file mode 100644 index 0000000..58a1d30 --- /dev/null +++ b/docs/public/toc-paramiko.sftp_si-module.html @@ -0,0 +1,17 @@ + + + + + paramiko.sftp_si + + + +
sftp_si
+
+ +
+[show private | hide private] + + diff --git a/docs/public/toc-paramiko.transport-module.html b/docs/public/toc-paramiko.transport-module.html new file mode 100644 index 0000000..14e73b4 --- /dev/null +++ b/docs/public/toc-paramiko.transport-module.html @@ -0,0 +1,25 @@ + + + + + paramiko.transport + + + +
transport
+
+ + +Functions
+
+ + +Variables
+
+ +
+[show private | hide private] + + diff --git a/docs/public/toc-paramiko.util-module.html b/docs/public/toc-paramiko.util-module.html new file mode 100644 index 0000000..1224321 --- /dev/null +++ b/docs/public/toc-paramiko.util-module.html @@ -0,0 +1,48 @@ + + + + + paramiko.util + + + +
util
+
+ + +Classes
+PFilter
+
+ + +Functions
+bit_length
+deflate_long
+format_binary
+format_binary_line
+format_binary_weird
+generate_key_bytes
+get_logger
+get_thread_id
+hexify
+inflate_long
+load_host_keys
+log_to_file
+lookup_ssh_host_config
+mod_inverse
+parse_ssh_config
+safe_string
+tb_strings
+unhexify
+
+ + +Variables
+
+ +
+[show private | hide private] + + diff --git a/docs/public/toc.html b/docs/public/toc.html new file mode 100644 index 0000000..a99a3d0 --- /dev/null +++ b/docs/public/toc.html @@ -0,0 +1,41 @@ + + + + + Table of Contents + + + +
Table of Contents
+
+Everything
+ + +
Packages
+paramiko
+ + +
Modules
+paramiko.agent
+paramiko.dsskey
+paramiko.file
+paramiko.message
+paramiko.pkey
+paramiko.rsakey
+paramiko.server
+paramiko.sftp
+paramiko.sftp_attr
+paramiko.sftp_client
+paramiko.sftp_file
+paramiko.sftp_handle
+paramiko.sftp_server
+paramiko.sftp_si
+paramiko.transport
+paramiko.util
+ +

+[show private | hide private] + + diff --git a/docs/public/trees.html b/docs/public/trees.html new file mode 100644 index 0000000..6c85192 --- /dev/null +++ b/docs/public/trees.html @@ -0,0 +1,151 @@ + + + + + Module and Class Hierarchies + + + + + + + + + + + + + + + + + + +
+ + + +
[show private | hide private]
[frames | no frames]
+ + +

Module Hierarchy

+ + + +

Class Hierarchy

+ + + + + + + + + + + + + + + + + + +
Generated by Epydoc 2.1 on Sun Dec 4 11:16:48 2005http://epydoc.sf.net
+ + diff --git a/forward.py b/forward.py new file mode 100644 index 0000000..f91e969 --- /dev/null +++ b/forward.py @@ -0,0 +1,219 @@ +#!/usr/bin/python + +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +Sample script showing how to do local port forwarding over paramiko. + +This script connects to the requested SSH server and sets up local port +forwarding (the openssh -L option) from a local port through a tunneled +connection to a destination reachable from the SSH server machine. +""" + +import sys +import os +import socket +import select +import SocketServer +import getpass +import base64 +from optparse import OptionParser + +import paramiko + +DEFAULT_PORT = 4000 +SSH_PORT = 22 +VERBOSE = True +READPASS = False + + +class ForwardServer (SocketServer.ThreadingTCPServer): + daemon_threads = True + allow_reuse_address = True + + +class Handler (SocketServer.BaseRequestHandler): + + def handle(self): + try: + chan = self.ssh_transport.open_channel('direct-tcpip', + (self.chain_host, self.chain_port), + self.request.getpeername()) + except Exception, e: + verbose('Incoming request to %s:%d failed: %s' % (self.chain_host, + self.chain_port, + repr(e))) + return + + verbose('Connected! Tunnel open.') + while True: + r, w, x = select.select([self.request, chan], [], []) + if self.request in r: + data = self.request.recv(1024) + if len(data) == 0: + break + chan.send(data) + if chan in r: + data = chan.recv(1024) + if len(data) == 0: + break + self.request.send(data) + chan.close() + self.request.close() + verbose('Tunnel closed.') + + +def forward_tunnel(local_port, remote_host, remote_port, transport): + # this is a little convoluted, but lets me configure things for the Handler + # object. (SocketServer doesn't give Handlers any way to access the outer + # server normally.) + class SubHander (Handler): + chain_host = remote_host + chain_port = remote_port + ssh_transport = transport + ForwardServer(('', local_port), SubHander).serve_forever() + +def find_default_key_file(): + filename = os.path.expanduser('~/.ssh/id_rsa') + if os.access(filename, os.R_OK): + return filename + filename = os.path.expanduser('~/ssh/id_rsa') + if os.access(filename, os.R_OK): + return filename + filename = os.path.expanduser('~/.ssh/id_dsa') + if os.access(filename, os.R_OK): + return filename + filename = os.path.expanduser('~/ssh/id_dsa') + if os.access(filename, os.R_OK): + return filename + return '' + +def verbose(s): + if VERBOSE: + print s + + +##### + + +parser = OptionParser(usage='usage: %prog [options] :', + version='%prog 1.0') +parser.add_option('-q', '--quiet', action='store_false', dest='verbose', default=VERBOSE, + help='squelch all informational output') +parser.add_option('-l', '--local-port', action='store', type='int', dest='port', + default=DEFAULT_PORT, + help='local port to forward (default: %d)' % DEFAULT_PORT) +parser.add_option('-r', '--host', action='store', type='string', dest='ssh_host', + help='SSH host to tunnel through (required)') +parser.add_option('-p', '--port', action='store', type='int', dest='ssh_port', default=SSH_PORT, + help='SSH port to tunnel through (default: %d)' % SSH_PORT) +parser.add_option('-u', '--user', action='store', type='string', dest='user', + default=getpass.getuser(), + help='username for SSH authentication (default: %s)' % getpass.getuser()) +parser.add_option('-K', '--key', action='store', type='string', dest='keyfile', + default=find_default_key_file(), + help='private key file to use for SSH authentication') +parser.add_option('', '--no-key', action='store_false', dest='use_key', default=True, + help='don\'t look for or use a private key file') +parser.add_option('-P', '--password', action='store_true', dest='readpass', default=READPASS, + help='read password (for key or password auth) from stdin') +options, args = parser.parse_args() + +VERBOSE = options.verbose +READPASS = options.readpass + + +if len(args) != 1: + parser.error('Incorrect number of arguments.') +remote_host = args[0] +if ':' not in remote_host: + parser.error('Remote port missing.') +remote_host, remote_port = remote_host.split(':', 1) +try: + remote_port = int(remote_port) +except: + parser.error('Remote port must be a number.') + +if not options.ssh_host: + parser.error('SSH host is required.') +if ':' in options.ssh_host: + options.ssh_host, options.ssh_port = options.ssh_host.split(':', 1) + try: + options.ssh_port = int(options.ssh_port) + except: + parser.error('SSH port must be a number.') + +try: + host_keys = paramiko.util.load_host_keys(os.path.expanduser('~/.ssh/known_hosts')) +except IOError: + try: + host_keys = paramiko.util.load_host_keys(os.path.expanduser('~/ssh/known_hosts')) + except IOError: + print '*** Unable to open host keys file' + host_keys = {} + +if not host_keys.has_key(options.ssh_host): + print '*** Warning: no host key for %s' % options.ssh_host + expected_host_key_type = None + expected_host_key = None +else: + expected_host_key_type = host_keys[options.ssh_host].keys()[0] + expected_host_key = host_keys[options.ssh_host][expected_host_key_type] + +key = None +password = None +if options.use_key: + try: + key = paramiko.RSAKey.from_private_key_file(options.keyfile) + except paramiko.PasswordRequiredException: + if not READPASS: + print '*** Password needed for keyfile (use -P): %s' % options.keyfile + sys.exit(1) + key_password = getpass.getpass('Enter password for key: ') + try: + key = paramiko.RSAKey.from_private_key_file(options.keyfile, key_password) + except: + print '*** Unable to read keyfile: %s' % options.keyfile + sys.exit(1) + except: + pass + +if key is None: + # try reading a password then + if not READPASS: + print '*** Either a valid private key or password is required (use -K or -P).' + sys.exit(1) + password = getpass.getpass('Enter password: ') + +verbose('Connecting to ssh host %s:%d ...' % (options.ssh_host, options.ssh_port)) + +transport = paramiko.Transport((options.ssh_host, options.ssh_port)) +transport.connect(hostkeytype=expected_host_key_type, + hostkey=expected_host_key, + username=options.user, + password=password, + pkey=key) + +verbose('Now forwarding port %d to %s:%d ...' % (options.port, remote_host, remote_port)) + +try: + forward_tunnel(options.port, remote_host, remote_port, transport) +except KeyboardInterrupt: + print 'Port forwarding stopped.' + sys.exit(0) diff --git a/paramiko/__init__.py b/paramiko/__init__.py new file mode 100644 index 0000000..0a312cb --- /dev/null +++ b/paramiko/__init__.py @@ -0,0 +1,146 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +I{Paramiko} (a combination of the esperanto words for "paranoid" and "friend") +is a module for python 2.3 or greater that implements the SSH2 protocol for +secure (encrypted and authenticated) connections to remote machines. Unlike +SSL (aka TLS), the SSH2 protocol does not require heirarchical certificates +signed by a powerful central authority. You may know SSH2 as the protocol that +replaced C{telnet} and C{rsh} for secure access to remote shells, but the +protocol also includes the ability to open arbitrary channels to remote +services across an encrypted tunnel. (This is how C{sftp} works, for example.) + +To use this package, pass a socket (or socket-like object) to a L{Transport}, +and use L{start_server } or +L{start_client } to negoatite +with the remote host as either a server or client. As a client, you are +responsible for authenticating using a password or private key, and checking +the server's host key. I{(Key signature and verification is done by paramiko, +but you will need to provide private keys and check that the content of a +public key matches what you expected to see.)} As a server, you are +responsible for deciding which users, passwords, and keys to allow, and what +kind of channels to allow. + +Once you have finished, either side may request flow-controlled L{Channel}s to +the other side, which are python objects that act like sockets, but send and +receive data over the encrypted session. + +Paramiko is written entirely in python (no C or platform-dependent code) and is +released under the GNU Lesser General Public License (LGPL). + +Website: U{http://www.lag.net/paramiko/} + +@version: 1.5.2 (rhydon) +@author: Robey Pointer +@contact: robey@lag.net +@license: GNU Lesser General Public License (LGPL) +""" + +import sys + +if sys.version_info < (2, 2): + raise RuntimeError('You need python 2.2 for this module.') + + +__author__ = "Robey Pointer " +__date__ = "04 Dec 2005" +__version__ = "1.5.2 (rhydon)" +__version_info__ = (1, 5, 2) +__license__ = "GNU Lesser General Public License (LGPL)" + + +import transport, auth_handler, channel, rsakey, dsskey, message +import ssh_exception, file, packet, agent, server, util +import sftp_client, sftp_attr, sftp_handle, sftp_server, sftp_si + +from transport import randpool, SecurityOptions, Transport +from auth_handler import AuthHandler +from channel import Channel, ChannelFile +from ssh_exception import SSHException, PasswordRequiredException, BadAuthenticationType +from server import ServerInterface, SubsystemHandler, InteractiveQuery +from rsakey import RSAKey +from dsskey import DSSKey +from sftp import SFTPError, BaseSFTP +from sftp_client import SFTP, SFTPClient +from sftp_server import SFTPServer +from sftp_attr import SFTPAttributes +from sftp_handle import SFTPHandle +from sftp_si import SFTPServerInterface +from sftp_file import SFTPFile +from message import Message +from packet import Packetizer +from file import BufferedFile +from agent import Agent, AgentKey +from pkey import PKey + +# fix module names for epydoc +for x in [Transport, SecurityOptions, Channel, SFTPServer, SSHException, \ + PasswordRequiredException, BadAuthenticationType, ChannelFile, \ + SubsystemHandler, AuthHandler, RSAKey, DSSKey, SFTPError, \ + SFTP, SFTPClient, SFTPServer, Message, Packetizer, SFTPAttributes, \ + SFTPHandle, SFTPServerInterface, BufferedFile, Agent, AgentKey, \ + PKey, BaseSFTP, SFTPFile, ServerInterface]: + x.__module__ = 'paramiko' + +from common import AUTH_SUCCESSFUL, AUTH_PARTIALLY_SUCCESSFUL, AUTH_FAILED, \ + OPEN_SUCCEEDED, OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED, OPEN_FAILED_CONNECT_FAILED, \ + OPEN_FAILED_UNKNOWN_CHANNEL_TYPE, OPEN_FAILED_RESOURCE_SHORTAGE + +from sftp import SFTP_OK, SFTP_EOF, SFTP_NO_SUCH_FILE, SFTP_PERMISSION_DENIED, SFTP_FAILURE, \ + SFTP_BAD_MESSAGE, SFTP_NO_CONNECTION, SFTP_CONNECTION_LOST, SFTP_OP_UNSUPPORTED + +__all__ = [ 'Transport', + 'SecurityOptions', + 'SubsystemHandler', + 'Channel', + 'RSAKey', + 'DSSKey', + 'Agent', + 'Message', + 'SSHException', + 'PasswordRequiredException', + 'BadAuthenticationType', + 'SFTP', + 'SFTPFile', + 'SFTPHandle', + 'SFTPClient', + 'SFTPServer', + 'SFTPError', + 'SFTPAttributes', + 'SFTPServerInterface' + 'ServerInterface', + 'BufferedFile', + 'Agent', + 'AgentKey', + 'rsakey', + 'dsskey', + 'pkey', + 'message', + 'transport', + 'sftp', + 'sftp_client', + 'sftp_server', + 'sftp_attr', + 'sftp_file', + 'sftp_si', + 'sftp_handle', + 'server', + 'file', + 'agent', + 'util' ] diff --git a/paramiko/agent.py b/paramiko/agent.py new file mode 100644 index 0000000..3555512 --- /dev/null +++ b/paramiko/agent.py @@ -0,0 +1,138 @@ +# Copyright (C) 2003-2005 John Rochester +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +SSH Agent interface for Unix clients. +""" + +import os +import socket +import struct +import sys + +from paramiko.ssh_exception import SSHException +from paramiko.message import Message +from paramiko.pkey import PKey + + +SSH2_AGENTC_REQUEST_IDENTITIES, SSH2_AGENT_IDENTITIES_ANSWER, \ + SSH2_AGENTC_SIGN_REQUEST, SSH2_AGENT_SIGN_RESPONSE = range(11, 15) + + +class Agent: + """ + Client interface for using private keys from an SSH agent running on the + local machine. If an SSH agent is running, this class can be used to + connect to it and retreive L{PKey} objects which can be used when + attempting to authenticate to remote SSH servers. + + Because the SSH agent protocol uses environment variables and unix-domain + sockets, this probably doesn't work on Windows. It does work on most + posix platforms though (Linux and MacOS X, for example). + """ + + def __init__(self): + """ + Open a session with the local machine's SSH agent, if one is running. + If no agent is running, initialization will succeed, but L{get_keys} + will return an empty tuple. + + @raise SSHException: if an SSH agent is found, but speaks an + incompatible protocol + """ + if ('SSH_AUTH_SOCK' in os.environ) and (sys.platform != 'win32'): + conn = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + conn.connect(os.environ['SSH_AUTH_SOCK']) + self.conn = conn + type, result = self._send_message(chr(SSH2_AGENTC_REQUEST_IDENTITIES)) + if type != SSH2_AGENT_IDENTITIES_ANSWER: + raise SSHException('could not get keys from ssh-agent') + keys = [] + for i in range(result.get_int()): + keys.append(AgentKey(self, result.get_string())) + result.get_string() + self.keys = tuple(keys) + else: + self.keys = () + + def close(self): + """ + Close the SSH agent connection. + """ + self.conn.close() + self.conn = None + self.keys = () + + def get_keys(self): + """ + Return the list of keys available through the SSH agent, if any. If + no SSH agent was running (or it couldn't be contacted), an empty list + will be returned. + + @return: a list of keys available on the SSH agent + @rtype: tuple of L{AgentKey} + """ + return self.keys + + def _send_message(self, msg): + msg = str(msg) + self.conn.send(struct.pack('>I', len(msg)) + msg) + l = self._read_all(4) + msg = Message(self._read_all(struct.unpack('>I', l)[0])) + return ord(msg.get_byte()), msg + + def _read_all(self, wanted): + result = self.conn.recv(wanted) + while len(result) < wanted: + if len(result) == 0: + raise SSHException('lost ssh-agent') + extra = self.conn.recv(wanted - len(result)) + if len(extra) == 0: + raise SSHException('lost ssh-agent') + result += extra + return result + + +class AgentKey(PKey): + """ + Private key held in a local SSH agent. This type of key can be used for + authenticating to a remote server (signing). Most other key operations + work as expected. + """ + + def __init__(self, agent, blob): + self.agent = agent + self.blob = blob + self.name = Message(blob).get_string() + + def __str__(self): + return self.blob + + def get_name(self): + return self.name + + def sign_ssh_data(self, randpool, data): + msg = Message() + msg.add_byte(chr(SSH2_AGENTC_SIGN_REQUEST)) + msg.add_string(self.blob) + msg.add_string(data) + msg.add_int(0) + type, result = self.agent._send_message(msg) + if type != SSH2_AGENT_SIGN_RESPONSE: + raise SSHException('key cannot be used for signing') + return result.get_string() diff --git a/paramiko/auth_handler.py b/paramiko/auth_handler.py new file mode 100644 index 0000000..59aa376 --- /dev/null +++ b/paramiko/auth_handler.py @@ -0,0 +1,410 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +L{AuthHandler} +""" + +import threading + +# this helps freezing utils +import encodings.utf_8 + +from paramiko.common import * +from paramiko import util +from paramiko.message import Message +from paramiko.ssh_exception import SSHException, BadAuthenticationType, PartialAuthentication +from paramiko.server import InteractiveQuery + + +class AuthHandler (object): + """ + Internal class to handle the mechanics of authentication. + """ + + def __init__(self, transport): + self.transport = transport + self.username = None + self.authenticated = False + self.auth_event = None + self.auth_method = '' + self.password = None + self.private_key = None + # for server mode: + self.auth_username = None + self.auth_fail_count = 0 + + def is_authenticated(self): + return self.authenticated + + def get_username(self): + if self.transport.server_mode: + return self.auth_username + else: + return self.username + + def auth_none(self, username, event): + self.transport.lock.acquire() + try: + self.auth_event = event + self.auth_method = 'none' + self.username = username + self._request_auth() + finally: + self.transport.lock.release() + + def auth_publickey(self, username, key, event): + self.transport.lock.acquire() + try: + self.auth_event = event + self.auth_method = 'publickey' + self.username = username + self.private_key = key + self._request_auth() + finally: + self.transport.lock.release() + + def auth_password(self, username, password, event): + self.transport.lock.acquire() + try: + self.auth_event = event + self.auth_method = 'password' + self.username = username + self.password = password + self._request_auth() + finally: + self.transport.lock.release() + + def auth_interactive(self, username, handler, event, submethods=''): + """ + response_list = handler(title, instructions, prompt_list) + """ + self.transport.lock.acquire() + try: + self.auth_event = event + self.auth_method = 'keyboard-interactive' + self.username = username + self.interactive_handler = handler + self.submethods = submethods + self._request_auth() + finally: + self.transport.lock.release() + + def abort(self): + if self.auth_event is not None: + self.auth_event.set() + + + ### internals... + + + def _request_auth(self): + m = Message() + m.add_byte(chr(MSG_SERVICE_REQUEST)) + m.add_string('ssh-userauth') + self.transport._send_message(m) + + def _disconnect_service_not_available(self): + m = Message() + m.add_byte(chr(MSG_DISCONNECT)) + m.add_int(DISCONNECT_SERVICE_NOT_AVAILABLE) + m.add_string('Service not available') + m.add_string('en') + self.transport._send_message(m) + self.transport.close() + + def _disconnect_no_more_auth(self): + m = Message() + m.add_byte(chr(MSG_DISCONNECT)) + m.add_int(DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE) + m.add_string('No more auth methods available') + m.add_string('en') + self.transport._send_message(m) + self.transport.close() + + def _get_session_blob(self, key, service, username): + m = Message() + m.add_string(self.transport.session_id) + m.add_byte(chr(MSG_USERAUTH_REQUEST)) + m.add_string(username) + m.add_string(service) + m.add_string('publickey') + m.add_boolean(1) + m.add_string(key.get_name()) + m.add_string(str(key)) + return str(m) + + def wait_for_response(self, event): + while True: + event.wait(0.1) + if not self.transport.is_active(): + e = self.transport.get_exception() + if e is None: + e = SSHException('Authentication failed.') + raise e + if event.isSet(): + break + if not self.is_authenticated(): + e = self.transport.get_exception() + if e is None: + e = SSHException('Authentication failed.') + # this is horrible. python Exception isn't yet descended from + # object, so type(e) won't work. :( + if issubclass(e.__class__, PartialAuthentication): + return e.allowed_types + raise e + return [] + + def _parse_service_request(self, m): + service = m.get_string() + if self.transport.server_mode and (service == 'ssh-userauth'): + # accepted + m = Message() + m.add_byte(chr(MSG_SERVICE_ACCEPT)) + m.add_string(service) + self.transport._send_message(m) + return + # dunno this one + self._disconnect_service_not_available() + + def _parse_service_accept(self, m): + service = m.get_string() + if service == 'ssh-userauth': + self.transport._log(DEBUG, 'userauth is OK') + m = Message() + m.add_byte(chr(MSG_USERAUTH_REQUEST)) + m.add_string(self.username) + m.add_string('ssh-connection') + m.add_string(self.auth_method) + if self.auth_method == 'password': + m.add_boolean(False) + m.add_string(self.password.encode('UTF-8')) + elif self.auth_method == 'publickey': + m.add_boolean(True) + m.add_string(self.private_key.get_name()) + m.add_string(str(self.private_key)) + blob = self._get_session_blob(self.private_key, 'ssh-connection', self.username) + sig = self.private_key.sign_ssh_data(self.transport.randpool, blob) + m.add_string(str(sig)) + elif self.auth_method == 'keyboard-interactive': + m.add_string('') + m.add_string(self.submethods) + elif self.auth_method == 'none': + pass + else: + raise SSHException('Unknown auth method "%s"' % self.auth_method) + self.transport._send_message(m) + else: + self.transport._log(DEBUG, 'Service request "%s" accepted (?)' % service) + + def _send_auth_result(self, username, method, result): + # okay, send result + m = Message() + if result == AUTH_SUCCESSFUL: + self.transport._log(INFO, 'Auth granted (%s).' % method) + m.add_byte(chr(MSG_USERAUTH_SUCCESS)) + self.authenticated = True + else: + self.transport._log(INFO, 'Auth rejected (%s).' % method) + m.add_byte(chr(MSG_USERAUTH_FAILURE)) + m.add_string(self.transport.server_object.get_allowed_auths(username)) + if result == AUTH_PARTIALLY_SUCCESSFUL: + m.add_boolean(1) + else: + m.add_boolean(0) + self.auth_fail_count += 1 + self.transport._send_message(m) + if self.auth_fail_count >= 10: + self._disconnect_no_more_auth() + if result == AUTH_SUCCESSFUL: + self.transport._auth_trigger() + + def _interactive_query(self, q): + # make interactive query instead of response + m = Message() + m.add_byte(chr(MSG_USERAUTH_INFO_REQUEST)) + m.add_string(q.name) + m.add_string(q.instructions) + m.add_string('') + m.add_int(len(q.prompts)) + for p in q.prompts: + m.add_string(p[0]) + m.add_boolean(p[1]) + self.transport._send_message(m) + + def _parse_userauth_request(self, m): + if not self.transport.server_mode: + # er, uh... what? + m = Message() + m.add_byte(chr(MSG_USERAUTH_FAILURE)) + m.add_string('none') + m.add_boolean(0) + self.transport._send_message(m) + return + if self.authenticated: + # ignore + return + username = m.get_string() + service = m.get_string() + method = m.get_string() + self.transport._log(DEBUG, 'Auth request (type=%s) service=%s, username=%s' % (method, service, username)) + if service != 'ssh-connection': + self._disconnect_service_not_available() + return + if (self.auth_username is not None) and (self.auth_username != username): + self.transport._log(WARNING, 'Auth rejected because the client attempted to change username in mid-flight') + self._disconnect_no_more_auth() + return + self.auth_username = username + + if method == 'none': + result = self.transport.server_object.check_auth_none(username) + elif method == 'password': + changereq = m.get_boolean() + password = m.get_string().decode('UTF-8', 'replace') + if changereq: + # always treated as failure, since we don't support changing passwords, but collect + # the list of valid auth types from the callback anyway + self.transport._log(DEBUG, 'Auth request to change passwords (rejected)') + newpassword = m.get_string().decode('UTF-8', 'replace') + result = AUTH_FAILED + else: + result = self.transport.server_object.check_auth_password(username, password) + elif method == 'publickey': + sig_attached = m.get_boolean() + keytype = m.get_string() + keyblob = m.get_string() + try: + key = self.transport._key_info[keytype](Message(keyblob)) + except SSHException, e: + self.transport._log(INFO, 'Auth rejected: public key: %s' % str(e)) + key = None + except: + self.transport._log(INFO, 'Auth rejected: unsupported or mangled public key') + key = None + if key is None: + self._disconnect_no_more_auth() + return + # first check if this key is okay... if not, we can skip the verify + result = self.transport.server_object.check_auth_publickey(username, key) + if result != AUTH_FAILED: + # key is okay, verify it + if not sig_attached: + # client wants to know if this key is acceptable, before it + # signs anything... send special "ok" message + m = Message() + m.add_byte(chr(MSG_USERAUTH_PK_OK)) + m.add_string(keytype) + m.add_string(keyblob) + self.transport._send_message(m) + return + sig = Message(m.get_string()) + blob = self._get_session_blob(key, service, username) + if not key.verify_ssh_sig(blob, sig): + self.transport._log(INFO, 'Auth rejected: invalid signature') + result = AUTH_FAILED + elif method == 'keyboard-interactive': + lang = m.get_string() + submethods = m.get_string() + result = self.transport.server_object.check_auth_interactive(username, submethods) + if isinstance(result, InteractiveQuery): + # make interactive query instead of response + self._interactive_query(result) + return + else: + result = self.transport.server_object.check_auth_none(username) + # okay, send result + self._send_auth_result(username, method, result) + + def _parse_userauth_success(self, m): + self.transport._log(INFO, 'Authentication successful!') + self.authenticated = True + self.transport._auth_trigger() + if self.auth_event != None: + self.auth_event.set() + + def _parse_userauth_failure(self, m): + authlist = m.get_list() + partial = m.get_boolean() + if partial: + self.transport._log(INFO, 'Authentication continues...') + self.transport._log(DEBUG, 'Methods: ' + str(authlist)) + self.transport.saved_exception = PartialAuthentication(authlist) + elif self.auth_method not in authlist: + self.transport._log(INFO, 'Authentication type not permitted.') + self.transport._log(DEBUG, 'Allowed methods: ' + str(authlist)) + self.transport.saved_exception = BadAuthenticationType('Bad authentication type', authlist) + else: + self.transport._log(INFO, 'Authentication failed.') + self.authenticated = False + self.username = None + if self.auth_event != None: + self.auth_event.set() + + def _parse_userauth_banner(self, m): + banner = m.get_string() + lang = m.get_string() + self.transport._log(INFO, 'Auth banner: ' + banner) + # who cares. + + def _parse_userauth_info_request(self, m): + if self.auth_method != 'keyboard-interactive': + raise SSHException('Illegal info request from server') + title = m.get_string() + instructions = m.get_string() + m.get_string() # lang + prompts = m.get_int() + prompt_list = [] + for i in range(prompts): + prompt_list.append((m.get_string(), m.get_boolean())) + response_list = self.interactive_handler(title, instructions, prompt_list) + + m = Message() + m.add_byte(chr(MSG_USERAUTH_INFO_RESPONSE)) + m.add_int(len(response_list)) + for r in response_list: + m.add_string(r) + self.transport._send_message(m) + + def _parse_userauth_info_response(self, m): + if not self.transport.server_mode: + raise SSHException('Illegal info response from server') + n = m.get_int() + responses = [] + for i in range(n): + responses.append(m.get_string()) + result = self.transport.server_object.check_auth_interactive_response(responses) + if isinstance(type(result), InteractiveQuery): + # make interactive query instead of response + self._interactive_query(result) + return + self._send_auth_result(self.auth_username, 'keyboard-interactive', result) + + + _handler_table = { + MSG_SERVICE_REQUEST: _parse_service_request, + MSG_SERVICE_ACCEPT: _parse_service_accept, + MSG_USERAUTH_REQUEST: _parse_userauth_request, + MSG_USERAUTH_SUCCESS: _parse_userauth_success, + MSG_USERAUTH_FAILURE: _parse_userauth_failure, + MSG_USERAUTH_BANNER: _parse_userauth_banner, + MSG_USERAUTH_INFO_REQUEST: _parse_userauth_info_request, + MSG_USERAUTH_INFO_RESPONSE: _parse_userauth_info_response, + } + + diff --git a/paramiko/ber.py b/paramiko/ber.py new file mode 100644 index 0000000..6a7823d --- /dev/null +++ b/paramiko/ber.py @@ -0,0 +1,128 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +import struct +import util + + +class BERException (Exception): + pass + + +class BER(object): + """ + Robey's tiny little attempt at a BER decoder. + """ + + def __init__(self, content=''): + self.content = content + self.idx = 0 + + def __str__(self): + return self.content + + def __repr__(self): + return 'BER(\'' + repr(self.content) + '\')' + + def decode(self): + return self.decode_next() + + def decode_next(self): + if self.idx >= len(self.content): + return None + ident = ord(self.content[self.idx]) + self.idx += 1 + if (ident & 31) == 31: + # identifier > 30 + ident = 0 + while self.idx < len(self.content): + t = ord(self.content[self.idx]) + self.idx += 1 + ident = (ident << 7) | (t & 0x7f) + if not (t & 0x80): + break + if self.idx >= len(self.content): + return None + # now fetch length + size = ord(self.content[self.idx]) + self.idx += 1 + if size & 0x80: + # more complimicated... + # FIXME: theoretically should handle indefinite-length (0x80) + t = size & 0x7f + if self.idx + t > len(self.content): + return None + size = util.inflate_long(self.content[self.idx : self.idx + t], True) + self.idx += t + if self.idx + size > len(self.content): + # can't fit + return None + data = self.content[self.idx : self.idx + size] + self.idx += size + # now switch on id + if ident == 0x30: + # sequence + return self.decode_sequence(data) + elif ident == 2: + # int + return util.inflate_long(data) + else: + # 1: boolean (00 false, otherwise true) + raise BERException('Unknown ber encoding type %d (robey is lazy)' % ident) + + def decode_sequence(data): + out = [] + b = BER(data) + while True: + x = b.decode_next() + if x is None: + return out + out.append(x) + decode_sequence = staticmethod(decode_sequence) + + def encode_tlv(self, ident, val): + # no need to support ident > 31 here + self.content += chr(ident) + if len(val) > 0x7f: + lenstr = util.deflate_long(len(val)) + self.content += chr(0x80 + len(lenstr)) + lenstr + else: + self.content += chr(len(val)) + self.content += val + + def encode(self, x): + if type(x) is bool: + if x: + self.encode_tlv(1, '\xff') + else: + self.encode_tlv(1, '\x00') + elif (type(x) is int) or (type(x) is long): + self.encode_tlv(2, util.deflate_long(x)) + elif type(x) is str: + self.encode_tlv(4, x) + elif (type(x) is list) or (type(x) is tuple): + self.encode_tlv(0x30, self.encode_sequence(x)) + else: + raise BERException('Unknown type for encoding: %s' % repr(type(x))) + + def encode_sequence(data): + b = BER() + for item in data: + b.encode(item) + return str(b) + encode_sequence = staticmethod(encode_sequence) diff --git a/paramiko/channel.py b/paramiko/channel.py new file mode 100644 index 0000000..8a00233 --- /dev/null +++ b/paramiko/channel.py @@ -0,0 +1,1174 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +Abstraction for an SSH2 channel. +""" + +import sys +import time +import threading +import socket +import os + +from paramiko.common import * +from paramiko import util +from paramiko.message import Message +from paramiko.ssh_exception import SSHException +from paramiko.file import BufferedFile +from paramiko import pipe + + +class Channel (object): + """ + A secure tunnel across an SSH L{Transport}. A Channel is meant to behave + like a socket, and has an API that should be indistinguishable from the + python socket API. + + Because SSH2 has a windowing kind of flow control, if you stop reading data + from a Channel and its buffer fills up, the server will be unable to send + you any more data until you read some of it. (This won't affect other + channels on the same transport -- all channels on a single transport are + flow-controlled independently.) Similarly, if the server isn't reading + data you send, calls to L{send} may block, unless you set a timeout. This + is exactly like a normal network socket, so it shouldn't be too surprising. + """ + + # lower bound on the max packet size we'll accept from the remote host + MIN_PACKET_SIZE = 1024 + + def __init__(self, chanid): + """ + Create a new channel. The channel is not associated with any + particular session or L{Transport} until the Transport attaches it. + Normally you would only call this method from the constructor of a + subclass of L{Channel}. + + @param chanid: the ID of this channel, as passed by an existing + L{Transport}. + @type chanid: int + """ + self.chanid = chanid + self.remote_chanid = 0 + self.transport = None + self.active = False + self.eof_received = 0 + self.eof_sent = 0 + self.in_buffer = '' + self.in_stderr_buffer = '' + self.timeout = None + self.closed = False + self.ultra_debug = False + self.lock = threading.Lock() + self.in_buffer_cv = threading.Condition(self.lock) + self.in_stderr_buffer_cv = threading.Condition(self.lock) + self.out_buffer_cv = threading.Condition(self.lock) + self.in_window_size = 0 + self.out_window_size = 0 + self.in_max_packet_size = 0 + self.out_max_packet_size = 0 + self.in_window_threshold = 0 + self.in_window_sofar = 0 + self.status_event = threading.Event() + self.name = str(chanid) + self.logger = util.get_logger('paramiko.chan.' + str(chanid)) + self.pipe = None + self.event = threading.Event() + self.combine_stderr = False + self.exit_status = -1 + + def __del__(self): + self.close() + + def __repr__(self): + """ + Return a string representation of this object, for debugging. + + @rtype: str + """ + out = ' 0: + out += ' in-buffer=%d' % (len(self.in_buffer),) + out += ' -> ' + repr(self.transport) + out += '>' + return out + + def get_pty(self, term='vt100', width=80, height=24): + """ + Request a pseudo-terminal from the server. This is usually used right + after creating a client channel, to ask the server to provide some + basic terminal semantics for a shell invoked with L{invoke_shell}. + It isn't necessary (or desirable) to call this method if you're going + to exectue a single command with L{exec_command}. + + @param term: the terminal type to emulate (for example, C{'vt100'}). + @type term: str + @param width: width (in characters) of the terminal screen + @type width: int + @param height: height (in characters) of the terminal screen + @type height: int + @return: C{True} if the operation succeeded; C{False} if not. + @rtype: bool + """ + if self.closed or self.eof_received or self.eof_sent or not self.active: + raise SSHException('Channel is not open') + m = Message() + m.add_byte(chr(MSG_CHANNEL_REQUEST)) + m.add_int(self.remote_chanid) + m.add_string('pty-req') + m.add_boolean(True) + m.add_string(term) + m.add_int(width) + m.add_int(height) + # pixel height, width (usually useless) + m.add_int(0).add_int(0) + m.add_string('') + self.event.clear() + self.transport._send_user_message(m) + while True: + self.event.wait(0.1) + if self.closed: + return False + if self.event.isSet(): + return True + + def invoke_shell(self): + """ + Request an interactive shell session on this channel. If the server + allows it, the channel will then be directly connected to the stdin, + stdout, and stderr of the shell. + + Normally you would call L{get_pty} before this, in which case the + shell will operate through the pty, and the channel will be connected + to the stdin and stdout of the pty. + + When the shell exits, the channel will be closed and can't be reused. + You must open a new channel if you wish to open another shell. + + @return: C{True} if the operation succeeded; C{False} if not. + @rtype: bool + """ + if self.closed or self.eof_received or self.eof_sent or not self.active: + raise SSHException('Channel is not open') + m = Message() + m.add_byte(chr(MSG_CHANNEL_REQUEST)) + m.add_int(self.remote_chanid) + m.add_string('shell') + m.add_boolean(1) + self.event.clear() + self.transport._send_user_message(m) + while True: + self.event.wait(0.1) + if self.closed: + return False + if self.event.isSet(): + return True + + def exec_command(self, command): + """ + Execute a command on the server. If the server allows it, the channel + will then be directly connected to the stdin, stdout, and stderr of + the command being executed. + + When the command finishes executing, the channel will be closed and + can't be reused. You must open a new channel if you wish to execute + another command. + + @param command: a shell command to execute. + @type command: str + @return: C{True} if the operation succeeded; C{False} if not. + @rtype: bool + """ + if self.closed or self.eof_received or self.eof_sent or not self.active: + raise SSHException('Channel is not open') + m = Message() + m.add_byte(chr(MSG_CHANNEL_REQUEST)) + m.add_int(self.remote_chanid) + m.add_string('exec') + m.add_boolean(1) + m.add_string(command) + self.event.clear() + self.transport._send_user_message(m) + while True: + self.event.wait(0.1) + if self.closed: + return False + if self.event.isSet(): + return True + + def invoke_subsystem(self, subsystem): + """ + Request a subsystem on the server (for example, C{sftp}). If the + server allows it, the channel will then be directly connected to the + requested subsystem. + + When the subsystem finishes, the channel will be closed and can't be + reused. + + @param subsystem: name of the subsystem being requested. + @type subsystem: str + @return: C{True} if the operation succeeded; C{False} if not. + @rtype: bool + """ + if self.closed or self.eof_received or self.eof_sent or not self.active: + raise SSHException('Channel is not open') + m = Message() + m.add_byte(chr(MSG_CHANNEL_REQUEST)) + m.add_int(self.remote_chanid) + m.add_string('subsystem') + m.add_boolean(1) + m.add_string(subsystem) + self.event.clear() + self.transport._send_user_message(m) + while True: + self.event.wait(0.1) + if self.closed: + return False + if self.event.isSet(): + return True + + def resize_pty(self, width=80, height=24): + """ + Resize the pseudo-terminal. This can be used to change the width and + height of the terminal emulation created in a previous L{get_pty} call. + + @param width: new width (in characters) of the terminal screen + @type width: int + @param height: new height (in characters) of the terminal screen + @type height: int + @return: C{True} if the operation succeeded; C{False} if not. + @rtype: bool + """ + if self.closed or self.eof_received or self.eof_sent or not self.active: + raise SSHException('Channel is not open') + m = Message() + m.add_byte(chr(MSG_CHANNEL_REQUEST)) + m.add_int(self.remote_chanid) + m.add_string('window-change') + m.add_boolean(1) + m.add_int(width) + m.add_int(height) + m.add_int(0).add_int(0) + self.event.clear() + self.transport._send_user_message(m) + while True: + self.event.wait(0.1) + if self.closed: + return False + if self.event.isSet(): + return True + + def recv_exit_status(self): + """ + Return the exit status from the process on the server. This is + mostly useful for retrieving the reults of an L{exec_command}. + If the command hasn't finished yet, this method will wait until + it does, or until the channel is closed. If no exit status is + provided by the server, -1 is returned. + + @return: the exit code of the process on the server. + @rtype: int + + @since: 1.2 + """ + while True: + if self.closed or self.status_event.isSet(): + return self.exit_status + self.status_event.wait(0.1) + + def send_exit_status(self, status): + """ + Send the exit status of an executed command to the client. (This + really only makes sense in server mode.) Many clients expect to + get some sort of status code back from an executed command after + it completes. + + @param status: the exit code of the process + @type status: int + + @since: 1.2 + """ + # in many cases, the channel will not still be open here. + # that's fine. + m = Message() + m.add_byte(chr(MSG_CHANNEL_REQUEST)) + m.add_int(self.remote_chanid) + m.add_string('exit-status') + m.add_boolean(0) + m.add_int(status) + self.transport._send_user_message(m) + + def get_transport(self): + """ + Return the L{Transport} associated with this channel. + + @return: the L{Transport} that was used to create this channel. + @rtype: L{Transport} + """ + return self.transport + + def set_name(self, name): + """ + Set a name for this channel. Currently it's only used to set the name + of the log level used for debugging. The name can be fetched with the + L{get_name} method. + + @param name: new channel name. + @type name: str + """ + self.name = name + self.logger = util.get_logger(self.transport.get_log_channel() + '.' + self.name) + + def get_name(self): + """ + Get the name of this channel that was previously set by L{set_name}. + + @return: the name of this channel. + @rtype: str + """ + return self.name + + def get_id(self): + """ + Return the ID # for this channel. The channel ID is unique across + a L{Transport} and usually a small number. It's also the number + passed to L{ServerInterface.check_channel_request} when determining + whether to accept a channel request in server mode. + + @return: the ID of this channel. + @rtype: int + + @since: ivysaur + """ + return self.chanid + + def set_combine_stderr(self, combine): + """ + Set whether stderr should be combined into stdout on this channel. + The default is C{False}, but in some cases it may be convenient to + have both streams combined. + + If this is C{False}, and L{exec_command} is called (or C{invoke_shell} + with no pty), output to stderr will not show up through the L{recv} + and L{recv_ready} calls. You will have to use L{recv_stderr} and + L{recv_stderr_ready} to get stderr output. + + If this is C{True}, data will never show up via L{recv_stderr} or + L{recv_stderr_ready}. + + @param combine: C{True} if stderr output should be combined into + stdout on this channel. + @type combine: bool + @return: previous setting. + @rtype: bool + + @since: 1.1 + """ + data = '' + self.lock.acquire() + try: + old = self.combine_stderr + self.combine_stderr = combine + if combine and not old: + # copy old stderr buffer into primary buffer + data = self.in_stderr_buffer + self.in_stderr_buffer = '' + finally: + self.lock.release() + if len(data) > 0: + self._feed(data) + return old + + + ### socket API + + + def settimeout(self, timeout): + """ + Set a timeout on blocking read/write operations. The C{timeout} + argument can be a nonnegative float expressing seconds, or C{None}. If + a float is given, subsequent channel read/write operations will raise + a timeout exception if the timeout period value has elapsed before the + operation has completed. Setting a timeout of C{None} disables + timeouts on socket operations. + + C{chan.settimeout(0.0)} is equivalent to C{chan.setblocking(0)}; + C{chan.settimeout(None)} is equivalent to C{chan.setblocking(1)}. + + @param timeout: seconds to wait for a pending read/write operation + before raising C{socket.timeout}, or C{None} for no timeout. + @type timeout: float + """ + self.timeout = timeout + + def gettimeout(self): + """ + Returns the timeout in seconds (as a float) associated with socket + operations, or C{None} if no timeout is set. This reflects the last + call to L{setblocking} or L{settimeout}. + + @return: timeout in seconds, or C{None}. + @rtype: float + """ + return self.timeout + + def setblocking(self, blocking): + """ + Set blocking or non-blocking mode of the channel: if C{blocking} is 0, + the channel is set to non-blocking mode; otherwise it's set to blocking + mode. Initially all channels are in blocking mode. + + In non-blocking mode, if a L{recv} call doesn't find any data, or if a + L{send} call can't immediately dispose of the data, an error exception + is raised. In blocking mode, the calls block until they can proceed. + + C{chan.setblocking(0)} is equivalent to C{chan.settimeout(0)}; + C{chan.setblocking(1)} is equivalent to C{chan.settimeout(None)}. + + @param blocking: 0 to set non-blocking mode; non-0 to set blocking + mode. + @type blocking: int + """ + if blocking: + self.settimeout(None) + else: + self.settimeout(0.0) + + def close(self): + """ + Close the channel. All future read/write operations on the channel + will fail. The remote end will receive no more data (after queued data + is flushed). Channels are automatically closed when their L{Transport} + is closed or when they are garbage collected. + """ + self.lock.acquire() + try: + if not self.active or self.closed: + return + msgs = self._close_internal() + + # only close the pipe when the user explicitly closes the channel. + # otherwise they will get unpleasant surprises. + if self.pipe is not None: + self.pipe.close() + self.pipe = None + finally: + self.lock.release() + for m in msgs: + if m is not None: + self.transport._send_user_message(m) + + def recv_ready(self): + """ + Returns true if data is buffered and ready to be read from this + channel. A C{False} result does not mean that the channel has closed; + it means you may need to wait before more data arrives. + + @return: C{True} if a L{recv} call on this channel would immediately + return at least one byte; C{False} otherwise. + @rtype: boolean + """ + self.lock.acquire() + try: + if len(self.in_buffer) == 0: + return False + return True + finally: + self.lock.release() + + def recv(self, nbytes): + """ + Receive data from the channel. The return value is a string + representing the data received. The maximum amount of data to be + received at once is specified by C{nbytes}. If a string of length zero + is returned, the channel stream has closed. + + @param nbytes: maximum number of bytes to read. + @type nbytes: int + @return: data. + @rtype: str + + @raise socket.timeout: if no data is ready before the timeout set by + L{settimeout}. + """ + out = '' + self.lock.acquire() + try: + if len(self.in_buffer) == 0: + if self.closed or self.eof_received: + return out + # should we block? + if self.timeout == 0.0: + raise socket.timeout() + # loop here in case we get woken up but a different thread has grabbed everything in the buffer + timeout = self.timeout + while (len(self.in_buffer) == 0) and not self.closed and not self.eof_received: + then = time.time() + self.in_buffer_cv.wait(timeout) + if timeout != None: + timeout -= time.time() - then + if timeout <= 0.0: + raise socket.timeout() + # something in the buffer and we have the lock + if len(self.in_buffer) <= nbytes: + out = self.in_buffer + self.in_buffer = '' + if self.pipe is not None: + # clear the pipe, since no more data is buffered + self.pipe.clear() + else: + out = self.in_buffer[:nbytes] + self.in_buffer = self.in_buffer[nbytes:] + ack = self._check_add_window(len(out)) + finally: + self.lock.release() + + # no need to hold the channel lock when sending this + if ack > 0: + m = Message() + m.add_byte(chr(MSG_CHANNEL_WINDOW_ADJUST)) + m.add_int(self.remote_chanid) + m.add_int(ack) + self.transport._send_user_message(m) + + return out + + def recv_stderr_ready(self): + """ + Returns true if data is buffered and ready to be read from this + channel's stderr stream. Only channels using L{exec_command} or + L{invoke_shell} without a pty will ever have data on the stderr + stream. + + @return: C{True} if a L{recv_stderr} call on this channel would + immediately return at least one byte; C{False} otherwise. + @rtype: boolean + + @since: 1.1 + """ + self.lock.acquire() + try: + if len(self.in_stderr_buffer) == 0: + return False + return True + finally: + self.lock.release() + + def recv_stderr(self, nbytes): + """ + Receive data from the channel's stderr stream. Only channels using + L{exec_command} or L{invoke_shell} without a pty will ever have data + on the stderr stream. The return value is a string representing the + data received. The maximum amount of data to be received at once is + specified by C{nbytes}. If a string of length zero is returned, the + channel stream has closed. + + @param nbytes: maximum number of bytes to read. + @type nbytes: int + @return: data. + @rtype: str + + @raise socket.timeout: if no data is ready before the timeout set by + L{settimeout}. + + @since: 1.1 + """ + out = '' + self.lock.acquire() + try: + if len(self.in_stderr_buffer) == 0: + if self.closed or self.eof_received: + return out + # should we block? + if self.timeout == 0.0: + raise socket.timeout() + # loop here in case we get woken up but a different thread has grabbed everything in the buffer + timeout = self.timeout + while (len(self.in_stderr_buffer) == 0) and not self.closed and not self.eof_received: + then = time.time() + self.in_stderr_buffer_cv.wait(timeout) + if timeout != None: + timeout -= time.time() - then + if timeout <= 0.0: + raise socket.timeout() + # something in the buffer and we have the lock + if len(self.in_stderr_buffer) <= nbytes: + out = self.in_stderr_buffer + self.in_stderr_buffer = '' + else: + out = self.in_stderr_buffer[:nbytes] + self.in_stderr_buffer = self.in_stderr_buffer[nbytes:] + self._check_add_window(len(out)) + finally: + self.lock.release() + return out + + def send(self, s): + """ + Send data to the channel. Returns the number of bytes sent, or 0 if + the channel stream is closed. Applications are responsible for + checking that all data has been sent: if only some of the data was + transmitted, the application needs to attempt delivery of the remaining + data. + + @param s: data to send. + @type s: str + @return: number of bytes actually sent. + @rtype: int + + @raise socket.timeout: if no data could be sent before the timeout set + by L{settimeout}. + """ + size = len(s) + self.lock.acquire() + try: + size = self._wait_for_send_window(size) + if size == 0: + # eof or similar + return 0 + m = Message() + m.add_byte(chr(MSG_CHANNEL_DATA)) + m.add_int(self.remote_chanid) + m.add_string(s[:size]) + self.transport._send_user_message(m) + finally: + self.lock.release() + return size + + def send_stderr(self, s): + """ + Send data to the channel on the "stderr" stream. This is normally + only used by servers to send output from shell commands -- clients + won't use this. Returns the number of bytes sent, or 0 if the channel + stream is closed. Applications are responsible for checking that all + data has been sent: if only some of the data was transmitted, the + application needs to attempt delivery of the remaining data. + + @param s: data to send. + @type s: str + @return: number of bytes actually sent. + @rtype: int + + @raise socket.timeout: if no data could be sent before the timeout set + by L{settimeout}. + + @since: 1.1 + """ + size = len(s) + self.lock.acquire() + try: + size = self._wait_for_send_window(size) + if size == 0: + # eof or similar + return 0 + m = Message() + m.add_byte(chr(MSG_CHANNEL_EXTENDED_DATA)) + m.add_int(self.remote_chanid) + m.add_int(1) + m.add_string(s[:size]) + self.transport._send_user_message(m) + finally: + self.lock.release() + return size + + def sendall(self, s): + """ + Send data to the channel, without allowing partial results. Unlike + L{send}, this method continues to send data from the given string until + either all data has been sent or an error occurs. Nothing is returned. + + @param s: data to send. + @type s: str + + @raise socket.timeout: if sending stalled for longer than the timeout + set by L{settimeout}. + @raise socket.error: if an error occured before the entire string was + sent. + + @note: If the channel is closed while only part of the data hase been + sent, there is no way to determine how much data (if any) was sent. + This is irritating, but identically follows python's API. + """ + while s: + if self.closed: + # this doesn't seem useful, but it is the documented behavior of Socket + raise socket.error('Socket is closed') + sent = self.send(s) + s = s[sent:] + return None + + def sendall_stderr(self, s): + """ + Send data to the channel's "stderr" stream, without allowing partial + results. Unlike L{send_stderr}, this method continues to send data + from the given string until all data has been sent or an error occurs. + Nothing is returned. + + @param s: data to send to the client as "stderr" output. + @type s: str + + @raise socket.timeout: if sending stalled for longer than the timeout + set by L{settimeout}. + @raise socket.error: if an error occured before the entire string was + sent. + + @since: 1.1 + """ + while s: + if self.closed: + raise socket.error('Socket is closed') + sent = self.send_stderr(s) + s = s[sent:] + return None + + def makefile(self, *params): + """ + Return a file-like object associated with this channel. The optional + C{mode} and C{bufsize} arguments are interpreted the same way as by + the built-in C{file()} function in python. + + @return: object which can be used for python file I/O. + @rtype: L{ChannelFile} + """ + return ChannelFile(*([self] + list(params))) + + def makefile_stderr(self, *params): + """ + Return a file-like object associated with this channel's stderr + stream. Only channels using L{exec_command} or L{invoke_shell} + without a pty will ever have data on the stderr stream. + + The optional C{mode} and C{bufsize} arguments are interpreted the + same way as by the built-in C{file()} function in python. For a + client, it only makes sense to open this file for reading. For a + server, it only makes sense to open this file for writing. + + @return: object which can be used for python file I/O. + @rtype: L{ChannelFile} + + @since: 1.1 + """ + return ChannelStderrFile(*([self] + list(params))) + + def fileno(self): + """ + Returns an OS-level file descriptor which can be used for polling, but + but I{not} for reading or writing). This is primaily to allow python's + C{select} module to work. + + The first time C{fileno} is called on a channel, a pipe is created to + simulate real OS-level file descriptor (FD) behavior. Because of this, + two OS-level FDs are created, which will use up FDs faster than normal. + You won't notice this effect unless you open hundreds or thousands of + channels simultaneously, but it's still notable. + + @return: an OS-level file descriptor + @rtype: int + + @warning: This method causes channel reads to be slightly less + efficient. + """ + self.lock.acquire() + try: + if self.pipe is not None: + return self.pipe.fileno() + # create the pipe and feed in any existing data + self.pipe = pipe.make_pipe() + if len(self.in_buffer) > 0: + self.pipe.set() + return self.pipe.fileno() + finally: + self.lock.release() + + def shutdown(self, how): + """ + Shut down one or both halves of the connection. If C{how} is 0, + further receives are disallowed. If C{how} is 1, further sends + are disallowed. If C{how} is 2, further sends and receives are + disallowed. This closes the stream in one or both directions. + + @param how: 0 (stop receiving), 1 (stop sending), or 2 (stop + receiving and sending). + @type how: int + """ + if (how == 0) or (how == 2): + # feign "read" shutdown + self.eof_received = 1 + if (how == 1) or (how == 2): + self.lock.acquire() + try: + m = self._send_eof() + finally: + self.lock.release() + if m is not None: + self.transport._send_user_message(m) + + def shutdown_read(self): + """ + Shutdown the receiving side of this socket, closing the stream in + the incoming direction. After this call, future reads on this + channel will fail instantly. This is a convenience method, equivalent + to C{shutdown(0)}, for people who don't make it a habit to + memorize unix constants from the 1970s. + + @since: 1.2 + """ + self.shutdown(0) + + def shutdown_write(self): + """ + Shutdown the sending side of this socket, closing the stream in + the outgoing direction. After this call, future writes on this + channel will fail instantly. This is a convenience method, equivalent + to C{shutdown(1)}, for people who don't make it a habit to + memorize unix constants from the 1970s. + + @since: 1.2 + """ + self.shutdown(1) + + + ### calls from Transport + + + def _set_transport(self, transport): + self.transport = transport + self.logger = util.get_logger(self.transport.get_log_channel() + '.' + self.name) + + def _set_window(self, window_size, max_packet_size): + self.in_window_size = window_size + self.in_max_packet_size = max_packet_size + # threshold of bytes we receive before we bother to send a window update + self.in_window_threshold = window_size // 10 + self.in_window_sofar = 0 + self._log(DEBUG, 'Max packet in: %d bytes' % max_packet_size) + + def _set_remote_channel(self, chanid, window_size, max_packet_size): + self.remote_chanid = chanid + self.out_window_size = window_size + self.out_max_packet_size = max(max_packet_size, self.MIN_PACKET_SIZE) + self.active = 1 + self._log(DEBUG, 'Max packet out: %d bytes' % max_packet_size) + + def _request_success(self, m): + self._log(DEBUG, 'Sesch channel %d request ok' % self.chanid) + self.event.set() + return + + def _request_failed(self, m): + self.lock.acquire() + try: + msgs = self._close_internal() + finally: + self.lock.release() + for m in msgs: + if m is not None: + self.transport._send_user_message(m) + + def _feed(self, m): + if type(m) is str: + # passed from _feed_extended + s = m + else: + s = m.get_string() + self.lock.acquire() + try: + if self.ultra_debug: + self._log(DEBUG, 'fed %d bytes' % len(s)) + if self.pipe is not None: + self.pipe.set() + self.in_buffer += s + self.in_buffer_cv.notifyAll() + finally: + self.lock.release() + + def _feed_extended(self, m): + code = m.get_int() + s = m.get_string() + if code != 1: + self._log(ERROR, 'unknown extended_data type %d; discarding' % code) + return + if self.combine_stderr: + return self._feed(s) + self.lock.acquire() + try: + if self.ultra_debug: + self._log(DEBUG, 'fed %d stderr bytes' % len(s)) + self.in_stderr_buffer += s + self.in_stderr_buffer_cv.notifyAll() + finally: + self.lock.release() + + def _window_adjust(self, m): + nbytes = m.get_int() + self.lock.acquire() + try: + if self.ultra_debug: + self._log(DEBUG, 'window up %d' % nbytes) + self.out_window_size += nbytes + self.out_buffer_cv.notifyAll() + finally: + self.lock.release() + + def _handle_request(self, m): + key = m.get_string() + want_reply = m.get_boolean() + server = self.transport.server_object + ok = False + if key == 'exit-status': + self.exit_status = m.get_int() + self.status_event.set() + ok = True + elif key == 'xon-xoff': + # ignore + ok = True + elif key == 'pty-req': + term = m.get_string() + width = m.get_int() + height = m.get_int() + pixelwidth = m.get_int() + pixelheight = m.get_int() + modes = m.get_string() + if server is None: + ok = False + else: + ok = server.check_channel_pty_request(self, term, width, height, pixelwidth, + pixelheight, modes) + elif key == 'shell': + if server is None: + ok = False + else: + ok = server.check_channel_shell_request(self) + elif key == 'exec': + cmd = m.get_string() + if server is None: + ok = False + else: + ok = server.check_channel_exec_request(self, cmd) + elif key == 'subsystem': + name = m.get_string() + if server is None: + ok = False + else: + ok = server.check_channel_subsystem_request(self, name) + elif key == 'window-change': + width = m.get_int() + height = m.get_int() + pixelwidth = m.get_int() + pixelheight = m.get_int() + if server is None: + ok = False + else: + ok = server.check_channel_window_change_request(self, width, height, pixelwidth, + pixelheight) + else: + self._log(DEBUG, 'Unhandled channel request "%s"' % key) + ok = False + if want_reply: + m = Message() + if ok: + m.add_byte(chr(MSG_CHANNEL_SUCCESS)) + else: + m.add_byte(chr(MSG_CHANNEL_FAILURE)) + m.add_int(self.remote_chanid) + self.transport._send_user_message(m) + + def _handle_eof(self, m): + self.lock.acquire() + try: + if not self.eof_received: + self.eof_received = True + self.in_buffer_cv.notifyAll() + self.in_stderr_buffer_cv.notifyAll() + if self.pipe is not None: + self.pipe.set_forever() + finally: + self.lock.release() + self._log(DEBUG, 'EOF received') + + def _handle_close(self, m): + self.lock.acquire() + try: + msgs = self._close_internal() + self.transport._unlink_channel(self.chanid) + finally: + self.lock.release() + for m in msgs: + if m is not None: + self.transport._send_user_message(m) + + + ### internals... + + + def _log(self, level, msg): + self.logger.log(level, msg) + + def _set_closed(self): + # you are holding the lock. + self.closed = True + self.in_buffer_cv.notifyAll() + self.in_stderr_buffer_cv.notifyAll() + self.out_buffer_cv.notifyAll() + if self.pipe is not None: + self.pipe.set_forever() + + def _send_eof(self): + # you are holding the lock. + if self.eof_sent: + return None + m = Message() + m.add_byte(chr(MSG_CHANNEL_EOF)) + m.add_int(self.remote_chanid) + self.eof_sent = True + self._log(DEBUG, 'EOF sent') + return m + + def _close_internal(self): + # you are holding the lock. + if not self.active or self.closed: + return None, None + m1 = self._send_eof() + m2 = Message() + m2.add_byte(chr(MSG_CHANNEL_CLOSE)) + m2.add_int(self.remote_chanid) + self._set_closed() + # can't unlink from the Transport yet -- the remote side may still + # try to send meta-data (exit-status, etc) + return m1, m2 + + def _unlink(self): + # server connection could die before we become active: still signal the close! + if self.closed: + return + self.lock.acquire() + try: + self._set_closed() + self.transport._unlink_channel(self.chanid) + finally: + self.lock.release() + + def _check_add_window(self, n): + # already holding the lock! + if self.closed or self.eof_received or not self.active: + return 0 + if self.ultra_debug: + self._log(DEBUG, 'addwindow %d' % n) + self.in_window_sofar += n + if self.in_window_sofar <= self.in_window_threshold: + return 0 + if self.ultra_debug: + self._log(DEBUG, 'addwindow send %d' % self.in_window_sofar) + out = self.in_window_sofar + self.in_window_sofar = 0 + return out + + def _wait_for_send_window(self, size): + """ + (You are already holding the lock.) + Wait for the send window to open up, and allocate up to C{size} bytes + for transmission. If no space opens up before the timeout, a timeout + exception is raised. Returns the number of bytes available to send + (may be less than requested). + """ + # you are already holding the lock + if self.closed or self.eof_sent: + return 0 + if self.out_window_size == 0: + # should we block? + if self.timeout == 0.0: + raise socket.timeout() + # loop here in case we get woken up but a different thread has filled the buffer + timeout = self.timeout + while self.out_window_size == 0: + if self.closed or self.eof_sent: + return 0 + then = time.time() + self.out_buffer_cv.wait(timeout) + if timeout != None: + timeout -= time.time() - then + if timeout <= 0.0: + raise socket.timeout() + # we have some window to squeeze into + if self.closed or self.eof_sent: + return 0 + if self.out_window_size < size: + size = self.out_window_size + if self.out_max_packet_size - 64 < size: + size = self.out_max_packet_size - 64 + self.out_window_size -= size + if self.ultra_debug: + self._log(DEBUG, 'window down to %d' % self.out_window_size) + return size + + +class ChannelFile (BufferedFile): + """ + A file-like wrapper around L{Channel}. A ChannelFile is created by calling + L{Channel.makefile}. + + @bug: To correctly emulate the file object created from a socket's + C{makefile} method, a L{Channel} and its C{ChannelFile} should be able + to be closed or garbage-collected independently. Currently, closing + the C{ChannelFile} does nothing but flush the buffer. + """ + + def __init__(self, channel, mode = 'r', bufsize = -1): + self.channel = channel + BufferedFile.__init__(self) + self._set_mode(mode, bufsize) + + def __repr__(self): + """ + Returns a string representation of this object, for debugging. + + @rtype: str + """ + return '' + + def _read(self, size): + return self.channel.recv(size) + + def _write(self, data): + self.channel.sendall(data) + return len(data) + + seek = BufferedFile.seek + + +class ChannelStderrFile (ChannelFile): + def __init__(self, channel, mode = 'r', bufsize = -1): + ChannelFile.__init__(self, channel, mode, bufsize) + + def _read(self, size): + return self.channel.recv_stderr(size) + + def _write(self, data): + self.channel.sendall_stderr(data) + return len(data) + + +# vim: set shiftwidth=4 expandtab : diff --git a/paramiko/common.py b/paramiko/common.py new file mode 100644 index 0000000..c5999e6 --- /dev/null +++ b/paramiko/common.py @@ -0,0 +1,136 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +Common constants and global variables. +""" + +MSG_DISCONNECT, MSG_IGNORE, MSG_UNIMPLEMENTED, MSG_DEBUG, MSG_SERVICE_REQUEST, \ + MSG_SERVICE_ACCEPT = range(1, 7) +MSG_KEXINIT, MSG_NEWKEYS = range(20, 22) +MSG_USERAUTH_REQUEST, MSG_USERAUTH_FAILURE, MSG_USERAUTH_SUCCESS, \ + MSG_USERAUTH_BANNER = range(50, 54) +MSG_USERAUTH_PK_OK = 60 +MSG_USERAUTH_INFO_REQUEST, MSG_USERAUTH_INFO_RESPONSE = range(60, 62) +MSG_GLOBAL_REQUEST, MSG_REQUEST_SUCCESS, MSG_REQUEST_FAILURE = range(80, 83) +MSG_CHANNEL_OPEN, MSG_CHANNEL_OPEN_SUCCESS, MSG_CHANNEL_OPEN_FAILURE, \ + MSG_CHANNEL_WINDOW_ADJUST, MSG_CHANNEL_DATA, MSG_CHANNEL_EXTENDED_DATA, \ + MSG_CHANNEL_EOF, MSG_CHANNEL_CLOSE, MSG_CHANNEL_REQUEST, \ + MSG_CHANNEL_SUCCESS, MSG_CHANNEL_FAILURE = range(90, 101) + + +# for debugging: +MSG_NAMES = { + MSG_DISCONNECT: 'disconnect', + MSG_IGNORE: 'ignore', + MSG_UNIMPLEMENTED: 'unimplemented', + MSG_DEBUG: 'debug', + MSG_SERVICE_REQUEST: 'service-request', + MSG_SERVICE_ACCEPT: 'service-accept', + MSG_KEXINIT: 'kexinit', + MSG_NEWKEYS: 'newkeys', + 30: 'kex30', + 31: 'kex31', + 32: 'kex32', + 33: 'kex33', + 34: 'kex34', + MSG_USERAUTH_REQUEST: 'userauth-request', + MSG_USERAUTH_FAILURE: 'userauth-failure', + MSG_USERAUTH_SUCCESS: 'userauth-success', + MSG_USERAUTH_BANNER: 'userauth--banner', + MSG_USERAUTH_PK_OK: 'userauth-60(pk-ok/info-request)', + MSG_USERAUTH_INFO_RESPONSE: 'userauth-info-response', + MSG_GLOBAL_REQUEST: 'global-request', + MSG_REQUEST_SUCCESS: 'request-success', + MSG_REQUEST_FAILURE: 'request-failure', + MSG_CHANNEL_OPEN: 'channel-open', + MSG_CHANNEL_OPEN_SUCCESS: 'channel-open-success', + MSG_CHANNEL_OPEN_FAILURE: 'channel-open-failure', + MSG_CHANNEL_WINDOW_ADJUST: 'channel-window-adjust', + MSG_CHANNEL_DATA: 'channel-data', + MSG_CHANNEL_EXTENDED_DATA: 'channel-extended-data', + MSG_CHANNEL_EOF: 'channel-eof', + MSG_CHANNEL_CLOSE: 'channel-close', + MSG_CHANNEL_REQUEST: 'channel-request', + MSG_CHANNEL_SUCCESS: 'channel-success', + MSG_CHANNEL_FAILURE: 'channel-failure' + } + + +# authentication request return codes: +AUTH_SUCCESSFUL, AUTH_PARTIALLY_SUCCESSFUL, AUTH_FAILED = range(3) + + +# channel request failed reasons: +(OPEN_SUCCEEDED, + OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED, + OPEN_FAILED_CONNECT_FAILED, + OPEN_FAILED_UNKNOWN_CHANNEL_TYPE, + OPEN_FAILED_RESOURCE_SHORTAGE) = range(0, 5) + + +CONNECTION_FAILED_CODE = { + 1: 'Administratively prohibited', + 2: 'Connect failed', + 3: 'Unknown channel type', + 4: 'Resource shortage' +} + + +DISCONNECT_SERVICE_NOT_AVAILABLE, DISCONNECT_AUTH_CANCELLED_BY_USER, \ + DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE = 7, 13, 14 + + +from Crypto.Util.randpool import PersistentRandomPool, RandomPool + +# keep a crypto-strong PRNG nearby +try: + randpool = PersistentRandomPool(os.path.join(os.path.expanduser('~'), '/.randpool')) +except: + # the above will likely fail on Windows - fall back to non-persistent random pool + randpool = RandomPool() + +try: + randpool.randomize() +except: + # earlier versions of pyCrypto (pre-2.0) don't have randomize() + pass + +import sys +if sys.version_info < (2, 3): + try: + import logging + except: + import logging22 as logging + import select + PY22 = True + + import socket + if not hasattr(socket, 'timeout'): + class timeout(socket.error): pass + socket.timeout = timeout + del timeout +else: + import logging + PY22 = False + +DEBUG = logging.DEBUG +INFO = logging.INFO +WARNING = logging.WARNING +ERROR = logging.ERROR +CRITICAL = logging.CRITICAL diff --git a/paramiko/compress.py b/paramiko/compress.py new file mode 100644 index 0000000..bdf4b42 --- /dev/null +++ b/paramiko/compress.py @@ -0,0 +1,39 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +Compression implementations for a Transport. +""" + +import zlib + + +class ZlibCompressor (object): + def __init__(self): + self.z = zlib.compressobj(9) + + def __call__(self, data): + return self.z.compress(data) + self.z.flush(zlib.Z_FULL_FLUSH) + + +class ZlibDecompressor (object): + def __init__(self): + self.z = zlib.decompressobj() + + def __call__(self, data): + return self.z.decompress(data) diff --git a/paramiko/dsskey.py b/paramiko/dsskey.py new file mode 100644 index 0000000..2b31372 --- /dev/null +++ b/paramiko/dsskey.py @@ -0,0 +1,176 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +L{DSSKey} +""" + +from Crypto.PublicKey import DSA +from Crypto.Hash import SHA + +from paramiko.common import * +from paramiko import util +from paramiko.ssh_exception import SSHException +from paramiko.message import Message +from paramiko.ber import BER, BERException +from paramiko.pkey import PKey + + +class DSSKey (PKey): + """ + Representation of a DSS key which can be used to sign an verify SSH2 + data. + """ + + def __init__(self, msg=None, data=None, filename=None, password=None, vals=None): + if filename is not None: + self._from_private_key_file(filename, password) + return + if (msg is None) and (data is not None): + msg = Message(data) + if vals is not None: + self.p, self.q, self.g, self.y = vals + else: + if msg is None: + raise SSHException('Key object may not be empty') + if msg.get_string() != 'ssh-dss': + raise SSHException('Invalid key') + self.p = msg.get_mpint() + self.q = msg.get_mpint() + self.g = msg.get_mpint() + self.y = msg.get_mpint() + self.size = util.bit_length(self.p) + + def __str__(self): + m = Message() + m.add_string('ssh-dss') + m.add_mpint(self.p) + m.add_mpint(self.q) + m.add_mpint(self.g) + m.add_mpint(self.y) + return str(m) + + def __hash__(self): + h = hash(self.get_name()) + h = h * 37 + hash(self.p) + h = h * 37 + hash(self.q) + h = h * 37 + hash(self.g) + h = h * 37 + hash(self.y) + # h might be a long by now... + return hash(h) + + def get_name(self): + return 'ssh-dss' + + def get_bits(self): + return self.size + + def can_sign(self): + return hasattr(self, 'x') + + def sign_ssh_data(self, rpool, data): + digest = SHA.new(data).digest() + dss = DSA.construct((long(self.y), long(self.g), long(self.p), long(self.q), long(self.x))) + # generate a suitable k + qsize = len(util.deflate_long(self.q, 0)) + while True: + k = util.inflate_long(rpool.get_bytes(qsize), 1) + if (k > 2) and (k < self.q): + break + r, s = dss.sign(util.inflate_long(digest, 1), k) + m = Message() + m.add_string('ssh-dss') + # apparently, in rare cases, r or s may be shorter than 20 bytes! + rstr = util.deflate_long(r, 0) + sstr = util.deflate_long(s, 0) + if len(rstr) < 20: + rstr = '\x00' * (20 - len(rstr)) + rstr + if len(sstr) < 20: + sstr = '\x00' * (20 - len(sstr)) + sstr + m.add_string(rstr + sstr) + return m + + def verify_ssh_sig(self, data, msg): + if len(str(msg)) == 40: + # spies.com bug: signature has no header + sig = str(msg) + else: + kind = msg.get_string() + if kind != 'ssh-dss': + return 0 + sig = msg.get_string() + + # pull out (r, s) which are NOT encoded as mpints + sigR = util.inflate_long(sig[:20], 1) + sigS = util.inflate_long(sig[20:], 1) + sigM = util.inflate_long(SHA.new(data).digest(), 1) + + dss = DSA.construct((long(self.y), long(self.g), long(self.p), long(self.q))) + return dss.verify(sigM, (sigR, sigS)) + + def write_private_key_file(self, filename, password=None): + keylist = [ 0, self.p, self.q, self.g, self.y, self.x ] + try: + b = BER() + b.encode(keylist) + except BERException: + raise SSHException('Unable to create ber encoding of key') + self._write_private_key_file('DSA', filename, str(b), password) + + def generate(bits=1024, progress_func=None): + """ + Generate a new private DSS key. This factory function can be used to + generate a new host key or authentication key. + + @param bits: number of bits the generated key should be. + @type bits: int + @param progress_func: an optional function to call at key points in + key generation (used by C{pyCrypto.PublicKey}). + @type progress_func: function + @return: new private key + @rtype: L{DSSKey} + + @since: fearow + """ + randpool.stir() + dsa = DSA.generate(bits, randpool.get_bytes, progress_func) + key = DSSKey(vals=(dsa.p, dsa.q, dsa.g, dsa.y)) + key.x = dsa.x + return key + generate = staticmethod(generate) + + + ### internals... + + + def _from_private_key_file(self, filename, password): + # private key file contains: + # DSAPrivateKey = { version = 0, p, q, g, y, x } + data = self._read_private_key_file('DSA', filename, password) + try: + keylist = BER(data).decode() + except BERException, x: + raise SSHException('Unable to parse key file: ' + str(x)) + if (type(keylist) is not list) or (len(keylist) < 6) or (keylist[0] != 0): + raise SSHException('not a valid DSA private key file (bad ber encoding)') + self.p = keylist[1] + self.q = keylist[2] + self.g = keylist[3] + self.y = keylist[4] + self.x = keylist[5] + self.size = util.bit_length(self.p) diff --git a/paramiko/file.py b/paramiko/file.py new file mode 100644 index 0000000..c29e7c4 --- /dev/null +++ b/paramiko/file.py @@ -0,0 +1,440 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +BufferedFile. +""" + +from cStringIO import StringIO + + +_FLAG_READ = 0x1 +_FLAG_WRITE = 0x2 +_FLAG_APPEND = 0x4 +_FLAG_BINARY = 0x10 +_FLAG_BUFFERED = 0x20 +_FLAG_LINE_BUFFERED = 0x40 +_FLAG_UNIVERSAL_NEWLINE = 0x80 + + +class BufferedFile (object): + """ + Reusable base class to implement python-style file buffering around a + simpler stream. + """ + + _DEFAULT_BUFSIZE = 8192 + + SEEK_SET = 0 + SEEK_CUR = 1 + SEEK_END = 2 + + def __init__(self): + self._flags = 0 + self._bufsize = self._DEFAULT_BUFSIZE + self._wbuffer = StringIO() + self._rbuffer = '' + self._at_trailing_cr = False + self._closed = False + # pos - position within the file, according to the user + # realpos - position according the OS + # (these may be different because we buffer for line reading) + self._pos = self._realpos = 0 + + def __del__(self): + self.close() + + def __iter__(self): + """ + Returns an iterator that can be used to iterate over the lines in this + file. This iterator happens to return the file itself, since a file is + its own iterator. + + @raise ValueError: if the file is closed. + + @return: an interator. + @rtype: iterator + """ + if self._closed: + raise ValueError('I/O operation on closed file') + return self + + def close(self): + """ + Close the file. Future read and write operations will fail. + """ + self.flush() + self._closed = True + + def flush(self): + """ + Write out any data in the write buffer. This may do nothing if write + buffering is not turned on. + """ + self._write_all(self._wbuffer.getvalue()) + self._wbuffer = StringIO() + return + + def next(self): + """ + Returns the next line from the input, or raises L{StopIteration} when + EOF is hit. Unlike python file objects, it's okay to mix calls to + C{next} and L{readline}. + + @raise StopIteration: when the end of the file is reached. + + @return: a line read from the file. + @rtype: str + """ + line = self.readline() + if not line: + raise StopIteration + return line + + def read(self, size=None): + """ + Read at most C{size} bytes from the file (less if we hit the end of the + file first). If the C{size} argument is negative or omitted, read all + the remaining data in the file. + + @param size: maximum number of bytes to read. + @type size: int + @return: data read from the file, or an empty string if EOF was + encountered immediately. + @rtype: str + """ + if self._closed: + raise IOError('File is closed') + if not (self._flags & _FLAG_READ): + raise IOError('File not open for reading') + if (size is None) or (size < 0): + # go for broke + result = self._rbuffer + self._rbuffer = '' + self._pos += len(result) + while True: + try: + new_data = self._read(self._DEFAULT_BUFSIZE) + except EOFError: + new_data = None + if (new_data is None) or (len(new_data) == 0): + break + result += new_data + self._realpos += len(new_data) + self._pos += len(new_data) + return result + if size <= len(self._rbuffer): + result = self._rbuffer[:size] + self._rbuffer = self._rbuffer[size:] + self._pos += len(result) + return result + while len(self._rbuffer) < size: + try: + new_data = self._read(max(self._bufsize, size - len(self._rbuffer))) + except EOFError: + new_data = None + if (new_data is None) or (len(new_data) == 0): + break + self._rbuffer += new_data + self._realpos += len(new_data) + result = self._rbuffer[:size] + self._rbuffer = self._rbuffer[size:] + self._pos += len(result) + return result + + def readline(self, size=None): + """ + Read one entire line from the file. A trailing newline character is + kept in the string (but may be absent when a file ends with an + incomplete line). If the size argument is present and non-negative, it + is a maximum byte count (including the trailing newline) and an + incomplete line may be returned. An empty string is returned only when + EOF is encountered immediately. + + @note: Unlike stdio's C{fgets()}, the returned string contains null + characters (C{'\\0'}) if they occurred in the input. + + @param size: maximum length of returned string. + @type size: int + @return: next line of the file, or an empty string if the end of the + file has been reached. + @rtype: str + """ + # it's almost silly how complex this function is. + if self._closed: + raise IOError('File is closed') + if not (self._flags & _FLAG_READ): + raise IOError('File not open for reading') + line = self._rbuffer + while True: + if self._at_trailing_cr and (self._flags & _FLAG_UNIVERSAL_NEWLINE) and (len(line) > 0): + # edge case: the newline may be '\r\n' and we may have read + # only the first '\r' last time. + if line[0] == '\n': + line = line[1:] + self._record_newline('\r\n') + else: + self._record_newline('\r') + self._at_trailing_cr = False + # check size before looking for a linefeed, in case we already have + # enough. + if (size is not None) and (size >= 0): + if len(line) >= size: + # truncate line and return + self._rbuffer = line[size:] + line = line[:size] + self._pos += len(line) + return line + n = size - len(line) + else: + n = self._DEFAULT_BUFSIZE + if ('\n' in line) or ((self._flags & _FLAG_UNIVERSAL_NEWLINE) and ('\r' in line)): + break + try: + new_data = self._read(n) + except EOFError: + new_data = None + if (new_data is None) or (len(new_data) == 0): + self._rbuffer = '' + self._pos += len(line) + return line + line += new_data + self._realpos += len(new_data) + # find the newline + pos = line.find('\n') + if self._flags & _FLAG_UNIVERSAL_NEWLINE: + rpos = line.find('\r') + if (rpos >= 0) and ((rpos < pos) or (pos < 0)): + pos = rpos + xpos = pos + 1 + if (line[pos] == '\r') and (xpos < len(line)) and (line[xpos] == '\n'): + xpos += 1 + self._rbuffer = line[xpos:] + lf = line[pos:xpos] + line = line[:pos] + '\n' + if (len(self._rbuffer) == 0) and (lf == '\r'): + # we could read the line up to a '\r' and there could still be a + # '\n' following that we read next time. note that and eat it. + self._at_trailing_cr = True + else: + self._record_newline(lf) + self._pos += len(line) + return line + + def readlines(self, sizehint=None): + """ + Read all remaining lines using L{readline} and return them as a list. + If the optional C{sizehint} argument is present, instead of reading up + to EOF, whole lines totalling approximately sizehint bytes (possibly + after rounding up to an internal buffer size) are read. + + @param sizehint: desired maximum number of bytes to read. + @type sizehint: int + @return: list of lines read from the file. + @rtype: list + """ + lines = [] + bytes = 0 + while 1: + line = self.readline() + if len(line) == 0: + break + lines.append(line) + bytes += len(line) + if (sizehint is not None) and (bytes >= sizehint): + break + return lines + + def seek(self, offset, whence=0): + """ + Set the file's current position, like stdio's C{fseek}. Not all file + objects support seeking. + + @note: If a file is opened in append mode (C{'a'} or C{'a+'}), any seek + operations will be undone at the next write (as the file position + will move back to the end of the file). + + @param offset: position to move to within the file, relative to + C{whence}. + @type offset: int + @param whence: type of movement: 0 = absolute; 1 = relative to the + current position; 2 = relative to the end of the file. + @type whence: int + + @raise IOError: if the file doesn't support random access. + """ + raise IOError('File does not support seeking.') + + def tell(self): + """ + Return the file's current position. This may not be accurate or + useful if the underlying file doesn't support random access, or was + opened in append mode. + + @return: file position (in bytes). + @rtype: int + """ + return self._pos + + def write(self, data): + """ + Write data to the file. If write buffering is on (C{bufsize} was + specified and non-zero), some or all of the data may not actually be + written yet. (Use L{flush} or L{close} to force buffered data to be + written out.) + + @param data: data to write. + @type data: str + """ + if self._closed: + raise IOError('File is closed') + if not (self._flags & _FLAG_WRITE): + raise IOError('File not open for writing') + if not (self._flags & _FLAG_BUFFERED): + self._write_all(data) + return + self._wbuffer.write(data) + if self._flags & _FLAG_LINE_BUFFERED: + # only scan the new data for linefeed, to avoid wasting time. + last_newline_pos = data.rfind('\n') + if last_newline_pos >= 0: + wbuf = self._wbuffer.getvalue() + last_newline_pos += len(wbuf) - len(data) + self._write_all(wbuf[:last_newline_pos + 1]) + self._wbuffer = StringIO() + self._wbuffer.write(wbuf[last_newline_pos + 1:]) + return + # even if we're line buffering, if the buffer has grown past the + # buffer size, force a flush. + if self._wbuffer.tell() >= self._bufsize: + self.flush() + return + + def writelines(self, sequence): + """ + Write a sequence of strings to the file. The sequence can be any + iterable object producing strings, typically a list of strings. (The + name is intended to match L{readlines}; C{writelines} does not add line + separators.) + + @param sequence: an iterable sequence of strings. + @type sequence: sequence + """ + for line in sequence: + self.write(line) + return + + def xreadlines(self): + """ + Identical to C{iter(f)}. This is a deprecated file interface that + predates python iterator support. + + @return: an iterator. + @rtype: iterator + """ + return self + + + ### overrides... + + + def _read(self, size): + """ + I{(subclass override)} + Read data from the stream. Return C{None} or raise C{EOFError} to + indicate EOF. + """ + raise EOFError() + + def _write(self, data): + """ + I{(subclass override)} + Write data into the stream. + """ + raise IOError('write not implemented') + + def _get_size(self): + """ + I{(subclass override)} + Return the size of the file. This is called from within L{_set_mode} + if the file is opened in append mode, so the file position can be + tracked and L{seek} and L{tell} will work correctly. If the file is + a stream that can't be randomly accessed, you don't need to override + this method, + """ + return 0 + + + ### internals... + + + def _set_mode(self, mode='r', bufsize=-1): + """ + Subclasses call this method to initialize the BufferedFile. + """ + if bufsize == 1: + # apparently, line buffering only affects writes. reads are only + # buffered if you call readline (directly or indirectly: iterating + # over a file will indirectly call readline). + self._flags |= _FLAG_BUFFERED | _FLAG_LINE_BUFFERED + elif bufsize > 1: + self._bufsize = bufsize + self._flags |= _FLAG_BUFFERED + if ('r' in mode) or ('+' in mode): + self._flags |= _FLAG_READ + if ('w' in mode) or ('+' in mode): + self._flags |= _FLAG_WRITE + if ('a' in mode): + self._flags |= _FLAG_WRITE | _FLAG_APPEND + self._size = self._get_size() + self._pos = self._realpos = self._size + if ('b' in mode): + self._flags |= _FLAG_BINARY + if ('U' in mode): + self._flags |= _FLAG_UNIVERSAL_NEWLINE + # built-in file objects have this attribute to store which kinds of + # line terminations they've seen: + # + self.newlines = None + + def _write_all(self, data): + # the underlying stream may be something that does partial writes (like + # a socket). + while len(data) > 0: + count = self._write(data) + data = data[count:] + if self._flags & _FLAG_APPEND: + self._size += count + self._pos = self._realpos = self._size + else: + self._pos += count + self._realpos += count + return None + + def _record_newline(self, newline): + # silliness about tracking what kinds of newlines we've seen. + # i don't understand why it can be None, a string, or a tuple, instead + # of just always being a tuple, but we'll emulate that behavior anyway. + if not (self._flags & _FLAG_UNIVERSAL_NEWLINE): + return + if self.newlines is None: + self.newlines = newline + elif (type(self.newlines) is str) and (self.newlines != newline): + self.newlines = (self.newlines, newline) + elif newline not in self.newlines: + self.newlines += (newline,) diff --git a/paramiko/kex_gex.py b/paramiko/kex_gex.py new file mode 100644 index 0000000..994d76c --- /dev/null +++ b/paramiko/kex_gex.py @@ -0,0 +1,202 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +Variant on L{KexGroup1 } where the prime "p" and +generator "g" are provided by the server. A bit more work is required on the +client side, and a B{lot} more on the server side. +""" + +from Crypto.Hash import SHA +from Crypto.Util import number + +from paramiko.common import * +from paramiko import util +from paramiko.message import Message +from paramiko.ssh_exception import SSHException + + +_MSG_KEXDH_GEX_GROUP, _MSG_KEXDH_GEX_INIT, _MSG_KEXDH_GEX_REPLY, _MSG_KEXDH_GEX_REQUEST = range(31, 35) + + +class KexGex (object): + + name = 'diffie-hellman-group-exchange-sha1' + min_bits = 1024 + max_bits = 8192 + preferred_bits = 2048 + + def __init__(self, transport): + self.transport = transport + + def start_kex(self): + if self.transport.server_mode: + self.transport._expect_packet(_MSG_KEXDH_GEX_REQUEST) + return + # request a bit range: we accept (min_bits) to (max_bits), but prefer + # (preferred_bits). according to the spec, we shouldn't pull the + # minimum up above 1024. + m = Message() + m.add_byte(chr(_MSG_KEXDH_GEX_REQUEST)) + m.add_int(self.min_bits) + m.add_int(self.preferred_bits) + m.add_int(self.max_bits) + self.transport._send_message(m) + self.transport._expect_packet(_MSG_KEXDH_GEX_GROUP) + + def parse_next(self, ptype, m): + if ptype == _MSG_KEXDH_GEX_REQUEST: + return self._parse_kexdh_gex_request(m) + elif ptype == _MSG_KEXDH_GEX_GROUP: + return self._parse_kexdh_gex_group(m) + elif ptype == _MSG_KEXDH_GEX_INIT: + return self._parse_kexdh_gex_init(m) + elif ptype == _MSG_KEXDH_GEX_REPLY: + return self._parse_kexdh_gex_reply(m) + raise SSHException('KexGex asked to handle packet type %d' % ptype) + + + ### internals... + + + def _generate_x(self): + # generate an "x" (1 < x < (p-1)/2). + q = (self.p - 1) // 2 + qnorm = util.deflate_long(q, 0) + qhbyte = ord(qnorm[0]) + bytes = len(qnorm) + qmask = 0xff + while not (qhbyte & 0x80): + qhbyte <<= 1 + qmask >>= 1 + while True: + self.transport.randpool.stir() + x_bytes = self.transport.randpool.get_bytes(bytes) + x_bytes = chr(ord(x_bytes[0]) & qmask) + x_bytes[1:] + x = util.inflate_long(x_bytes, 1) + if (x > 1) and (x < q): + break + self.x = x + + def _parse_kexdh_gex_request(self, m): + minbits = m.get_int() + preferredbits = m.get_int() + maxbits = m.get_int() + # smoosh the user's preferred size into our own limits + if preferredbits > self.max_bits: + preferredbits = self.max_bits + if preferredbits < self.min_bits: + preferredbits = self.min_bits + # fix min/max if they're inconsistent. technically, we could just pout + # and hang up, but there's no harm in giving them the benefit of the + # doubt and just picking a bitsize for them. + if minbits > preferredbits: + minbits = preferredbits + if maxbits < preferredbits: + maxbits = preferredbits + # now save a copy + self.min_bits = minbits + self.preferred_bits = preferredbits + self.max_bits = maxbits + # generate prime + pack = self.transport._get_modulus_pack() + if pack is None: + raise SSHException('Can\'t do server-side gex with no modulus pack') + self.transport._log(DEBUG, 'Picking p (%d <= %d <= %d bits)' % (minbits, preferredbits, maxbits)) + self.g, self.p = pack.get_modulus(minbits, preferredbits, maxbits) + m = Message() + m.add_byte(chr(_MSG_KEXDH_GEX_GROUP)) + m.add_mpint(self.p) + m.add_mpint(self.g) + self.transport._send_message(m) + self.transport._expect_packet(_MSG_KEXDH_GEX_INIT) + + def _parse_kexdh_gex_group(self, m): + self.p = m.get_mpint() + self.g = m.get_mpint() + # reject if p's bit length < 1024 or > 8192 + bitlen = util.bit_length(self.p) + if (bitlen < 1024) or (bitlen > 8192): + raise SSHException('Server-generated gex p (don\'t ask) is out of range (%d bits)' % bitlen) + self.transport._log(DEBUG, 'Got server p (%d bits)' % bitlen) + self._generate_x() + # now compute e = g^x mod p + self.e = pow(self.g, self.x, self.p) + m = Message() + m.add_byte(chr(_MSG_KEXDH_GEX_INIT)) + m.add_mpint(self.e) + self.transport._send_message(m) + self.transport._expect_packet(_MSG_KEXDH_GEX_REPLY) + + def _parse_kexdh_gex_init(self, m): + self.e = m.get_mpint() + if (self.e < 1) or (self.e > self.p - 1): + raise SSHException('Client kex "e" is out of range') + self._generate_x() + self.f = pow(self.g, self.x, self.p) + K = pow(self.e, self.x, self.p) + key = str(self.transport.get_server_key()) + # okay, build up the hash H of (V_C || V_S || I_C || I_S || K_S || min || n || max || p || g || e || f || K) + hm = Message() + hm.add(self.transport.remote_version, self.transport.local_version, + self.transport.remote_kex_init, self.transport.local_kex_init, + key) + hm.add_int(self.min_bits) + hm.add_int(self.preferred_bits) + hm.add_int(self.max_bits) + hm.add_mpint(self.p) + hm.add_mpint(self.g) + hm.add_mpint(self.e) + hm.add_mpint(self.f) + hm.add_mpint(K) + H = SHA.new(str(hm)).digest() + self.transport._set_K_H(K, H) + # sign it + sig = self.transport.get_server_key().sign_ssh_data(self.transport.randpool, H) + # send reply + m = Message() + m.add_byte(chr(_MSG_KEXDH_GEX_REPLY)) + m.add_string(key) + m.add_mpint(self.f) + m.add_string(str(sig)) + self.transport._send_message(m) + self.transport._activate_outbound() + + def _parse_kexdh_gex_reply(self, m): + host_key = m.get_string() + self.f = m.get_mpint() + sig = m.get_string() + if (self.f < 1) or (self.f > self.p - 1): + raise SSHException('Server kex "f" is out of range') + K = pow(self.f, self.x, self.p) + # okay, build up the hash H of (V_C || V_S || I_C || I_S || K_S || min || n || max || p || g || e || f || K) + hm = Message() + hm.add(self.transport.local_version, self.transport.remote_version, + self.transport.local_kex_init, self.transport.remote_kex_init, + host_key) + hm.add_int(self.min_bits) + hm.add_int(self.preferred_bits) + hm.add_int(self.max_bits) + hm.add_mpint(self.p) + hm.add_mpint(self.g) + hm.add_mpint(self.e) + hm.add_mpint(self.f) + hm.add_mpint(K) + self.transport._set_K_H(K, SHA.new(str(hm)).digest()) + self.transport._verify_key(host_key, sig) + self.transport._activate_outbound() diff --git a/paramiko/kex_group1.py b/paramiko/kex_group1.py new file mode 100644 index 0000000..a13cf3a --- /dev/null +++ b/paramiko/kex_group1.py @@ -0,0 +1,136 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +Standard SSH key exchange ("kex" if you wanna sound cool). Diffie-Hellman of +1024 bit key halves, using a known "p" prime and "g" generator. +""" + +from Crypto.Hash import SHA + +from paramiko.common import * +from paramiko import util +from paramiko.message import Message +from paramiko.ssh_exception import SSHException + + +_MSG_KEXDH_INIT, _MSG_KEXDH_REPLY = range(30, 32) + +# draft-ietf-secsh-transport-09.txt, page 17 +P = 0xFFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFFL +G = 2 + + +class KexGroup1(object): + + name = 'diffie-hellman-group1-sha1' + + def __init__(self, transport): + self.transport = transport + self.x = 0L + self.e = 0L + self.f = 0L + + def start_kex(self): + self._generate_x() + if self.transport.server_mode: + # compute f = g^x mod p, but don't send it yet + self.f = pow(G, self.x, P) + self.transport._expect_packet(_MSG_KEXDH_INIT) + return + # compute e = g^x mod p (where g=2), and send it + self.e = pow(G, self.x, P) + m = Message() + m.add_byte(chr(_MSG_KEXDH_INIT)) + m.add_mpint(self.e) + self.transport._send_message(m) + self.transport._expect_packet(_MSG_KEXDH_REPLY) + + def parse_next(self, ptype, m): + if self.transport.server_mode and (ptype == _MSG_KEXDH_INIT): + return self._parse_kexdh_init(m) + elif not self.transport.server_mode and (ptype == _MSG_KEXDH_REPLY): + return self._parse_kexdh_reply(m) + raise SSHException('KexGroup1 asked to handle packet type %d' % ptype) + + + ### internals... + + + def _generate_x(self): + # generate an "x" (1 < x < q), where q is (p-1)/2. + # p is a 128-byte (1024-bit) number, where the first 64 bits are 1. + # therefore q can be approximated as a 2^1023. we drop the subset of + # potential x where the first 63 bits are 1, because some of those will be + # larger than q (but this is a tiny tiny subset of potential x). + while 1: + self.transport.randpool.stir() + x_bytes = self.transport.randpool.get_bytes(128) + x_bytes = chr(ord(x_bytes[0]) & 0x7f) + x_bytes[1:] + if (x_bytes[:8] != '\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF') and \ + (x_bytes[:8] != '\x00\x00\x00\x00\x00\x00\x00\x00'): + break + self.x = util.inflate_long(x_bytes) + + def _parse_kexdh_reply(self, m): + # client mode + host_key = m.get_string() + self.f = m.get_mpint() + if (self.f < 1) or (self.f > P - 1): + raise SSHException('Server kex "f" is out of range') + sig = m.get_string() + K = pow(self.f, self.x, P) + # okay, build up the hash H of (V_C || V_S || I_C || I_S || K_S || e || f || K) + hm = Message() + hm.add(self.transport.local_version, self.transport.remote_version, + self.transport.local_kex_init, self.transport.remote_kex_init) + hm.add_string(host_key) + hm.add_mpint(self.e) + hm.add_mpint(self.f) + hm.add_mpint(K) + self.transport._set_K_H(K, SHA.new(str(hm)).digest()) + self.transport._verify_key(host_key, sig) + self.transport._activate_outbound() + + def _parse_kexdh_init(self, m): + # server mode + self.e = m.get_mpint() + if (self.e < 1) or (self.e > P - 1): + raise SSHException('Client kex "e" is out of range') + K = pow(self.e, self.x, P) + key = str(self.transport.get_server_key()) + # okay, build up the hash H of (V_C || V_S || I_C || I_S || K_S || e || f || K) + hm = Message() + hm.add(self.transport.remote_version, self.transport.local_version, + self.transport.remote_kex_init, self.transport.local_kex_init) + hm.add_string(key) + hm.add_mpint(self.e) + hm.add_mpint(self.f) + hm.add_mpint(K) + H = SHA.new(str(hm)).digest() + self.transport._set_K_H(K, H) + # sign it + sig = self.transport.get_server_key().sign_ssh_data(self.transport.randpool, H) + # send reply + m = Message() + m.add_byte(chr(_MSG_KEXDH_REPLY)) + m.add_string(key) + m.add_mpint(self.f) + m.add_string(str(sig)) + self.transport._send_message(m) + self.transport._activate_outbound() diff --git a/paramiko/logging22.py b/paramiko/logging22.py new file mode 100644 index 0000000..ac11a73 --- /dev/null +++ b/paramiko/logging22.py @@ -0,0 +1,66 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +Stub out logging on python < 2.3. +""" + + +DEBUG = 10 +INFO = 20 +WARNING = 30 +ERROR = 40 +CRITICAL = 50 + + +def getLogger(name): + return _logger + + +class logger (object): + def __init__(self): + self.handlers = [ ] + self.level = ERROR + + def setLevel(self, level): + self.level = level + + def addHandler(self, h): + self.handlers.append(h) + + def addFilter(self, filter): + pass + + def log(self, level, text): + if level >= self.level: + for h in self.handlers: + h.f.write(text + '\n') + h.f.flush() + +class StreamHandler (object): + def __init__(self, f): + self.f = f + + def setFormatter(self, f): + pass + +class Formatter (object): + def __init__(self, x, y): + pass + +_logger = logger() diff --git a/paramiko/message.py b/paramiko/message.py new file mode 100644 index 0000000..1d75a01 --- /dev/null +++ b/paramiko/message.py @@ -0,0 +1,301 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +Implementation of an SSH2 "message". +""" + +import struct +import cStringIO + +from paramiko import util + + +class Message (object): + """ + An SSH2 I{Message} is a stream of bytes that encodes some combination of + strings, integers, bools, and infinite-precision integers (known in python + as I{long}s). This class builds or breaks down such a byte stream. + + Normally you don't need to deal with anything this low-level, but it's + exposed for people implementing custom extensions, or features that + paramiko doesn't support yet. + """ + + def __init__(self, content=None): + """ + Create a new SSH2 Message. + + @param content: the byte stream to use as the Message content (passed + in only when decomposing a Message). + @type content: string + """ + if content != None: + self.packet = cStringIO.StringIO(content) + else: + self.packet = cStringIO.StringIO() + + def __str__(self): + """ + Return the byte stream content of this Message, as a string. + + @return: the contents of this Message. + @rtype: string + """ + return self.packet.getvalue() + + def __repr__(self): + """ + Returns a string representation of this object, for debugging. + + @rtype: string + """ + return 'paramiko.Message(' + repr(self.packet.getvalue()) + ')' + + def rewind(self): + """ + Rewind the message to the beginning as if no items had been parsed + out of it yet. + """ + self.packet.seek(0) + + def get_remainder(self): + """ + Return the bytes of this Message that haven't already been parsed and + returned. + + @return: a string of the bytes not parsed yet. + @rtype: string + """ + position = self.packet.tell() + remainder = self.packet.read() + self.packet.seek(position) + return remainder + + def get_so_far(self): + """ + Returns the bytes of this Message that have been parsed and returned. + The string passed into a Message's constructor can be regenerated by + concatenating C{get_so_far} and L{get_remainder}. + + @return: a string of the bytes parsed so far. + @rtype: string + """ + position = self.packet.tell() + self.rewind() + return self.packet.read(position) + + def get_bytes(self, n): + """ + Return the next C{n} bytes of the Message, without decomposing into + an int, string, etc. Just the raw bytes are returned. + + @return: a string of the next C{n} bytes of the Message, or a string + of C{n} zero bytes, if there aren't C{n} bytes remaining. + @rtype: string + """ + b = self.packet.read(n) + if len(b) < n: + return '\x00'*n + return b + + def get_byte(self): + """ + Return the next byte of the Message, without decomposing it. This + is equivalent to L{get_bytes(1)}. + + @return: the next byte of the Message, or C{'\000'} if there aren't + any bytes remaining. + @rtype: string + """ + return self.get_bytes(1) + + def get_boolean(self): + """ + Fetch a boolean from the stream. + + @return: C{True} or C{False} (from the Message). + @rtype: bool + """ + b = self.get_bytes(1) + return b != '\x00' + + def get_int(self): + """ + Fetch an int from the stream. + + @return: a 32-bit unsigned integer. + @rtype: int + """ + return struct.unpack('>I', self.get_bytes(4))[0] + + def get_int64(self): + """ + Fetch a 64-bit int from the stream. + + @return: a 64-bit unsigned integer. + @rtype: long + """ + return struct.unpack('>Q', self.get_bytes(8))[0] + + def get_mpint(self): + """ + Fetch a long int (mpint) from the stream. + + @return: an arbitrary-length integer. + @rtype: long + """ + return util.inflate_long(self.get_string()) + + def get_string(self): + """ + Fetch a string from the stream. This could be a byte string and may + contain unprintable characters. (It's not unheard of for a string to + contain another byte-stream Message.) + + @return: a string. + @rtype: string + """ + return self.get_bytes(self.get_int()) + + def get_list(self): + """ + Fetch a list of strings from the stream. These are trivially encoded + as comma-separated values in a string. + + @return: a list of strings. + @rtype: list of strings + """ + return self.get_string().split(',') + + def add_bytes(self, b): + """ + Write bytes to the stream, without any formatting. + + @param b: bytes to add + @type b: str + """ + self.packet.write(b) + return self + + def add_byte(self, b): + """ + Write a single byte to the stream, without any formatting. + + @param b: byte to add + @type b: str + """ + self.packet.write(b) + return self + + def add_boolean(self, b): + """ + Add a boolean value to the stream. + + @param b: boolean value to add + @type b: bool + """ + if b: + self.add_byte('\x01') + else: + self.add_byte('\x00') + return self + + def add_int(self, n): + """ + Add an integer to the stream. + + @param n: integer to add + @type n: int + """ + self.packet.write(struct.pack('>I', n)) + return self + + def add_int64(self, n): + """ + Add a 64-bit int to the stream. + + @param n: long int to add + @type n: long + """ + self.packet.write(struct.pack('>Q', n)) + return self + + def add_mpint(self, z): + """ + Add a long int to the stream, encoded as an infinite-precision + integer. This method only works on positive numbers. + + @param z: long int to add + @type z: long + """ + self.add_string(util.deflate_long(z)) + return self + + def add_string(self, s): + """ + Add a string to the stream. + + @param s: string to add + @type s: str + """ + self.add_int(len(s)) + self.packet.write(s) + return self + + def add_list(self, l): + """ + Add a list of strings to the stream. They are encoded identically to + a single string of values separated by commas. (Yes, really, that's + how SSH2 does it.) + + @param l: list of strings to add + @type l: list(str) + """ + self.add_string(','.join(l)) + return self + + def _add(self, i): + if type(i) is str: + return self.add_string(i) + elif type(i) is int: + return self.add_int(i) + elif type(i) is long: + if i > 0xffffffffL: + return self.add_mpint(i) + else: + return self.add_int(i) + elif type(i) is bool: + return self.add_boolean(i) + elif type(i) is list: + return self.add_list(i) + else: + raise exception('Unknown type') + + def add(self, *seq): + """ + Add a sequence of items to the stream. The values are encoded based + on their type: str, int, bool, list, or long. + + @param seq: the sequence of items + @type seq: sequence + + @bug: longs are encoded non-deterministically. Don't use this method. + """ + for item in seq: + self._add(item) diff --git a/paramiko/packet.py b/paramiko/packet.py new file mode 100644 index 0000000..277d68e --- /dev/null +++ b/paramiko/packet.py @@ -0,0 +1,442 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +Packetizer. +""" + +import select +import socket +import struct +import threading +import time +from Crypto.Hash import HMAC + +from paramiko.common import * +from paramiko import util +from paramiko.ssh_exception import SSHException +from paramiko.message import Message + + +class NeedRekeyException (Exception): + pass + + +class Packetizer (object): + """ + Implementation of the base SSH packet protocol. + """ + + # READ the secsh RFC's before raising these values. if anything, + # they should probably be lower. + REKEY_PACKETS = pow(2, 30) + REKEY_BYTES = pow(2, 30) + + def __init__(self, socket): + self.__socket = socket + self.__logger = None + self.__closed = False + self.__dump_packets = False + self.__need_rekey = False + self.__init_count = 0 + + # used for noticing when to re-key: + self.__sent_bytes = 0 + self.__sent_packets = 0 + self.__received_bytes = 0 + self.__received_packets = 0 + self.__received_packets_overflow = 0 + + # current inbound/outbound ciphering: + self.__block_size_out = 8 + self.__block_size_in = 8 + self.__mac_size_out = 0 + self.__mac_size_in = 0 + self.__block_engine_out = None + self.__block_engine_in = None + self.__mac_engine_out = None + self.__mac_engine_in = None + self.__mac_key_out = '' + self.__mac_key_in = '' + self.__compress_engine_out = None + self.__compress_engine_in = None + self.__sequence_number_out = 0L + self.__sequence_number_in = 0L + + # lock around outbound writes (packet computation) + self.__write_lock = threading.RLock() + + # keepalives: + self.__keepalive_interval = 0 + self.__keepalive_last = time.time() + self.__keepalive_callback = None + + def __del__(self): + # this is not guaranteed to be called, but we should try. + try: + self.__socket.close() + except: + pass + + def set_log(self, log): + """ + Set the python log object to use for logging. + """ + self.__logger = log + + def set_outbound_cipher(self, block_engine, block_size, mac_engine, mac_size, mac_key): + """ + Switch outbound data cipher. + """ + self.__block_engine_out = block_engine + self.__block_size_out = block_size + self.__mac_engine_out = mac_engine + self.__mac_size_out = mac_size + self.__mac_key_out = mac_key + self.__sent_bytes = 0 + self.__sent_packets = 0 + # wait until the reset happens in both directions before clearing rekey flag + self.__init_count |= 1 + if self.__init_count == 3: + self.__init_count = 0 + self.__need_rekey = False + + def set_inbound_cipher(self, block_engine, block_size, mac_engine, mac_size, mac_key): + """ + Switch inbound data cipher. + """ + self.__block_engine_in = block_engine + self.__block_size_in = block_size + self.__mac_engine_in = mac_engine + self.__mac_size_in = mac_size + self.__mac_key_in = mac_key + self.__received_bytes = 0 + self.__received_packets = 0 + self.__received_packets_overflow = 0 + # wait until the reset happens in both directions before clearing rekey flag + self.__init_count |= 2 + if self.__init_count == 3: + self.__init_count = 0 + self.__need_rekey = False + + def set_outbound_compressor(self, compressor): + self.__compress_engine_out = compressor + + def set_inbound_compressor(self, compressor): + self.__compress_engine_in = compressor + + def close(self): + self.__closed = True + + def set_hexdump(self, hexdump): + self.__dump_packets = hexdump + + def get_hexdump(self): + return self.__dump_packets + + def get_mac_size_in(self): + return self.__mac_size_in + + def get_mac_size_out(self): + return self.__mac_size_out + + def need_rekey(self): + """ + Returns C{True} if a new set of keys needs to be negotiated. This + will be triggered during a packet read or write, so it should be + checked after every read or write, or at least after every few. + + @return: C{True} if a new set of keys needs to be negotiated + """ + return self.__need_rekey + + def set_keepalive(self, interval, callback): + """ + Turn on/off the callback keepalive. If C{interval} seconds pass with + no data read from or written to the socket, the callback will be + executed and the timer will be reset. + """ + self.__keepalive_interval = interval + self.__keepalive_callback = callback + self.__keepalive_last = time.time() + + def read_all(self, n, check_rekey=False): + """ + Read as close to N bytes as possible, blocking as long as necessary. + + @param n: number of bytes to read + @type n: int + @return: the data read + @rtype: str + @raise EOFError: if the socket was closed before all the bytes could + be read + """ + if PY22: + return self._py22_read_all(n) + out = '' + while n > 0: + try: + x = self.__socket.recv(n) + if len(x) == 0: + raise EOFError() + out += x + n -= len(x) + except socket.timeout: + if self.__closed: + raise EOFError() + if check_rekey and (len(out) == 0) and self.__need_rekey: + raise NeedRekeyException() + self._check_keepalive() + return out + + def write_all(self, out): + self.__keepalive_last = time.time() + while len(out) > 0: + try: + n = self.__socket.send(out) + except socket.timeout: + n = 0 + if self.__closed: + n = -1 + except Exception: + # could be: (32, 'Broken pipe') + n = -1 + if n < 0: + raise EOFError() + if n == len(out): + return + out = out[n:] + return + + def readline(self, timeout): + """ + Read a line from the socket. This is done in a fairly inefficient + way, but is only used for initial banner negotiation so it's not worth + optimising. + """ + buf = '' + while not '\n' in buf: + buf += self._read_timeout(timeout) + buf = buf[:-1] + if (len(buf) > 0) and (buf[-1] == '\r'): + buf = buf[:-1] + return buf + + def send_message(self, data): + """ + Write a block of data using the current cipher, as an SSH block. + """ + # encrypt this sucka + randpool.stir() + data = str(data) + cmd = ord(data[0]) + if cmd in MSG_NAMES: + cmd_name = MSG_NAMES[cmd] + else: + cmd_name = '$%x' % cmd + self._log(DEBUG, 'Write packet <%s>, length %d' % (cmd_name, len(data))) + if self.__compress_engine_out is not None: + data = self.__compress_engine_out(data) + packet = self._build_packet(data) + if self.__dump_packets: + self._log(DEBUG, util.format_binary(packet, 'OUT: ')) + self.__write_lock.acquire() + try: + if self.__block_engine_out != None: + out = self.__block_engine_out.encrypt(packet) + else: + out = packet + # + mac + if self.__block_engine_out != None: + payload = struct.pack('>I', self.__sequence_number_out) + packet + out += HMAC.HMAC(self.__mac_key_out, payload, self.__mac_engine_out).digest()[:self.__mac_size_out] + self.__sequence_number_out = (self.__sequence_number_out + 1) & 0xffffffffL + self.write_all(out) + + self.__sent_bytes += len(out) + self.__sent_packets += 1 + if ((self.__sent_packets >= self.REKEY_PACKETS) or (self.__sent_bytes >= self.REKEY_BYTES)) \ + and not self.__need_rekey: + # only ask once for rekeying + self._log(DEBUG, 'Rekeying (hit %d packets, %d bytes sent)' % + (self.__sent_packets, self.__sent_bytes)) + self.__received_packets_overflow = 0 + self._trigger_rekey() + finally: + self.__write_lock.release() + + def read_message(self): + """ + Only one thread should ever be in this function (no other locking is + done). + + @raise SSHException: if the packet is mangled + @raise NeedRekeyException: if the transport should rekey + """ + header = self.read_all(self.__block_size_in, check_rekey=True) + if self.__block_engine_in != None: + header = self.__block_engine_in.decrypt(header) + if self.__dump_packets: + self._log(DEBUG, util.format_binary(header, 'IN: ')); + packet_size = struct.unpack('>I', header[:4])[0] + # leftover contains decrypted bytes from the first block (after the length field) + leftover = header[4:] + if (packet_size - len(leftover)) % self.__block_size_in != 0: + raise SSHException('Invalid packet blocking') + buf = self.read_all(packet_size + self.__mac_size_in - len(leftover)) + packet = buf[:packet_size - len(leftover)] + post_packet = buf[packet_size - len(leftover):] + if self.__block_engine_in != None: + packet = self.__block_engine_in.decrypt(packet) + if self.__dump_packets: + self._log(DEBUG, util.format_binary(packet, 'IN: ')); + packet = leftover + packet + + if self.__mac_size_in > 0: + mac = post_packet[:self.__mac_size_in] + mac_payload = struct.pack('>II', self.__sequence_number_in, packet_size) + packet + my_mac = HMAC.HMAC(self.__mac_key_in, mac_payload, self.__mac_engine_in).digest()[:self.__mac_size_in] + if my_mac != mac: + raise SSHException('Mismatched MAC') + padding = ord(packet[0]) + payload = packet[1:packet_size - padding] + randpool.add_event(packet[packet_size - padding]) + if self.__dump_packets: + self._log(DEBUG, 'Got payload (%d bytes, %d padding)' % (packet_size, padding)) + + if self.__compress_engine_in is not None: + payload = self.__compress_engine_in(payload) + + msg = Message(payload[1:]) + msg.seqno = self.__sequence_number_in + self.__sequence_number_in = (self.__sequence_number_in + 1) & 0xffffffffL + + # check for rekey + self.__received_bytes += packet_size + self.__mac_size_in + 4 + self.__received_packets += 1 + if self.__need_rekey: + # we've asked to rekey -- give them 20 packets to comply before + # dropping the connection + self.__received_packets_overflow += 1 + if self.__received_packets_overflow >= 20: + raise SSHException('Remote transport is ignoring rekey requests') + elif (self.__received_packets >= self.REKEY_PACKETS) or \ + (self.__received_bytes >= self.REKEY_BYTES): + # only ask once for rekeying + self._log(DEBUG, 'Rekeying (hit %d packets, %d bytes received)' % + (self.__received_packets, self.__received_bytes)) + self.__received_packets_overflow = 0 + self._trigger_rekey() + + cmd = ord(payload[0]) + if cmd in MSG_NAMES: + cmd_name = MSG_NAMES[cmd] + else: + cmd_name = '$%x' % cmd + self._log(DEBUG, 'Read packet <%s>, length %d' % (cmd_name, len(payload))) + return cmd, msg + + + ########## protected + + + def _log(self, level, msg): + if self.__logger is None: + return + if issubclass(type(msg), list): + for m in msg: + self.__logger.log(level, m) + else: + self.__logger.log(level, msg) + + def _check_keepalive(self): + if (not self.__keepalive_interval) or (not self.__block_engine_out) or \ + self.__need_rekey: + # wait till we're encrypting, and not in the middle of rekeying + return + now = time.time() + if now > self.__keepalive_last + self.__keepalive_interval: + self.__keepalive_callback() + self.__keepalive_last = now + + def _py22_read_all(self, n): + out = '' + while n > 0: + r, w, e = select.select([self.__socket], [], [], 0.1) + if self.__socket not in r: + if self.__closed: + raise EOFError() + self._check_keepalive() + else: + x = self.__socket.recv(n) + if len(x) == 0: + raise EOFError() + out += x + n -= len(x) + return out + + def _py22_read_timeout(self, timeout): + start = time.time() + while True: + r, w, e = select.select([self.__socket], [], [], 0.1) + if self.__socket in r: + x = self.__socket.recv(1) + if len(x) == 0: + raise EOFError() + return x + if self.__closed: + raise EOFError() + now = time.time() + if now - start >= timeout: + raise socket.timeout() + + def _read_timeout(self, timeout): + if PY22: + return self._py22_read_timeout(n) + start = time.time() + while True: + try: + x = self.__socket.recv(1) + if len(x) == 0: + raise EOFError() + return x + except socket.timeout: + pass + if self.__closed: + raise EOFError() + now = time.time() + if now - start >= timeout: + raise socket.timeout() + + def _build_packet(self, payload): + # pad up at least 4 bytes, to nearest block-size (usually 8) + bsize = self.__block_size_out + padding = 3 + bsize - ((len(payload) + 8) % bsize) + packet = struct.pack('>IB', len(payload) + padding + 1, padding) + packet += payload + if self.__block_engine_out is not None: + packet += randpool.get_bytes(padding) + else: + # cute trick i caught openssh doing: if we're not encrypting, + # don't waste random bytes for the padding + packet += (chr(0) * padding) + return packet + + def _trigger_rekey(self): + # outside code should check for this flag + self.__need_rekey = True diff --git a/paramiko/pipe.py b/paramiko/pipe.py new file mode 100644 index 0000000..cc28f43 --- /dev/null +++ b/paramiko/pipe.py @@ -0,0 +1,105 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +Abstraction of a one-way pipe where the read end can be used in select(). +Normally this is trivial, but Windows makes it nearly impossible. +""" + +import sys +import os +import socket + + +def make_pipe (): + if sys.platform[:3] != 'win': + return PosixPipe() + return WindowsPipe() + + +class PosixPipe (object): + def __init__ (self): + self._rfd, self._wfd = os.pipe() + self._set = False + self._forever = False + + def close (self): + os.close(self._rfd) + os.close(self._wfd) + + def fileno (self): + return self._rfd + + def clear (self): + if not self._set or self._forever: + return + os.read(self._rfd, 1) + self._set = False + + def set (self): + if self._set: + return + self._set = True + os.write(self._wfd, '*') + + def set_forever (self): + self._forever = True + self.set() + + +class WindowsPipe (object): + """ + On Windows, only an OS-level "WinSock" may be used in select(), but reads + and writes must be to the actual socket object. + """ + def __init__ (self): + serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + serv.bind(('127.0.0.1', 0)) + serv.listen(1) + + # need to save sockets in _rsock/_wsock so they don't get closed + self._rsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self._rsock.connect(('127.0.0.1', serv.getsockname()[1])) + + self._wsock, addr = serv.accept() + serv.close() + self._set = False + self._forever = False + + def close (self): + self._rsock.close() + self._wsock.close() + + def fileno (self): + return self._rsock.fileno() + + def clear (self): + if not self._set or self._forever: + return + self._rsock.recv(1) + self._set = False + + def set (self): + if self._set: + return + self._set = True + self._wsock.send('*') + + def set_forever (self): + self._forever = True + self.set() diff --git a/paramiko/pkey.py b/paramiko/pkey.py new file mode 100644 index 0000000..75db8e5 --- /dev/null +++ b/paramiko/pkey.py @@ -0,0 +1,339 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +Common API for all public keys. +""" + +import base64 +import os + +from Crypto.Hash import MD5 +from Crypto.Cipher import DES3 + +from paramiko.common import * +from paramiko import util +from paramiko.message import Message +from paramiko.ssh_exception import SSHException, PasswordRequiredException + + +class PKey (object): + """ + Base class for public keys. + """ + + # known encryption types for private key files: + _CIPHER_TABLE = { + 'DES-EDE3-CBC': { 'cipher': DES3, 'keysize': 24, 'blocksize': 8, 'mode': DES3.MODE_CBC } + } + + + def __init__(self, msg=None, data=None): + """ + Create a new instance of this public key type. If C{msg} is given, + the key's public part(s) will be filled in from the message. If + C{data} is given, the key's public part(s) will be filled in from + the string. + + @param msg: an optional SSH L{Message} containing a public key of this + type. + @type msg: L{Message} + @param data: an optional string containing a public key of this type + @type data: str + + @raise SSHException: if a key cannot be created from the C{data} or + C{msg} given, or no key was passed in. + """ + pass + + def __str__(self): + """ + Return a string of an SSH L{Message} made up of the public part(s) of + this key. This string is suitable for passing to L{__init__} to + re-create the key object later. + + @return: string representation of an SSH key message. + @rtype: str + """ + return '' + + def __cmp__(self, other): + """ + Compare this key to another. Returns 0 if this key is equivalent to + the given key, or non-0 if they are different. Only the public parts + of the key are compared, so a public key will compare equal to its + corresponding private key. + + @param other: key to compare to. + @type other: L{PKey} + @return: 0 if the two keys are equivalent, non-0 otherwise. + @rtype: int + """ + hs = hash(self) + ho = hash(other) + if hs != ho: + return cmp(hs, ho) + return cmp(str(self), str(other)) + + def get_name(self): + """ + Return the name of this private key implementation. + + @return: name of this private key type, in SSH terminology (for + example, C{"ssh-rsa"}). + @rtype: str + """ + return '' + + def get_bits(self): + """ + Return the number of significant bits in this key. This is useful + for judging the relative security of a key. + + @return: bits in the key. + @rtype: int + """ + return 0 + + def can_sign(self): + """ + Return C{True} if this key has the private part necessary for signing + data. + + @return: C{True} if this is a private key. + @rtype: bool + """ + return False + + def get_fingerprint(self): + """ + Return an MD5 fingerprint of the public part of this key. Nothing + secret is revealed. + + @return: a 16-byte string (binary) of the MD5 fingerprint, in SSH + format. + @rtype: str + """ + return MD5.new(str(self)).digest() + + def get_base64(self): + """ + Return a base64 string containing the public part of this key. Nothing + secret is revealed. This format is compatible with that used to store + public key files or recognized host keys. + + @return: a base64 string containing the public part of the key. + @rtype: str + + @since: fearow + """ + return base64.encodestring(str(self)).replace('\n', '') + + def sign_ssh_data(self, randpool, data): + """ + Sign a blob of data with this private key, and return a L{Message} + representing an SSH signature message. + + @param randpool: a secure random number generator. + @type randpool: L{Crypto.Util.randpool.RandomPool} + @param data: the data to sign. + @type data: str + @return: an SSH signature message. + @rtype: L{Message} + """ + return '' + + def verify_ssh_sig(self, data, msg): + """ + Given a blob of data, and an SSH message representing a signature of + that data, verify that it was signed with this key. + + @param data: the data that was signed. + @type data: str + @param msg: an SSH signature message + @type msg: L{Message} + @return: C{True} if the signature verifies correctly; C{False} + otherwise. + @rtype: boolean + """ + return False + + def from_private_key_file(cl, filename, password=None): + """ + Create a key object by reading a private key file. If the private + key is encrypted and C{password} is not C{None}, the given password + will be used to decrypt the key (otherwise L{PasswordRequiredException} + is thrown). Through the magic of python, this factory method will + exist in all subclasses of PKey (such as L{RSAKey} or L{DSSKey}), but + is useless on the abstract PKey class. + + @param filename: name of the file to read. + @type filename: str + @param password: an optional password to use to decrypt the key file, + if it's encrypted + @type password: str + @return: a new key object based on the given private key. + @rtype: L{PKey} + + @raise IOError: if there was an error reading the file. + @raise PasswordRequiredException: if the private key file is + encrypted, and C{password} is C{None}. + @raise SSHException: if the key file is invalid. + + @since: fearow + """ + key = cl(filename=filename, password=password) + return key + from_private_key_file = classmethod(from_private_key_file) + + def write_private_key_file(self, filename, password=None): + """ + Write private key contents into a file. If the password is not + C{None}, the key is encrypted before writing. + + @param filename: name of the file to write. + @type filename: str + @param password: an optional password to use to encrypt the key file. + @type password: str + + @raise IOError: if there was an error writing the file. + @raise SSHException: if the key is invalid. + + @since: fearow + """ + raise exception('Not implemented in PKey') + + def _read_private_key_file(self, tag, filename, password=None): + """ + Read an SSH2-format private key file, looking for a string of the type + C{"BEGIN xxx PRIVATE KEY"} for some C{xxx}, base64-decode the text we + find, and return it as a string. If the private key is encrypted and + C{password} is not C{None}, the given password will be used to decrypt + the key (otherwise L{PasswordRequiredException} is thrown). + + @param tag: C{"RSA"} or C{"DSA"}, the tag used to mark the data block. + @type tag: str + @param filename: name of the file to read. + @type filename: str + @param password: an optional password to use to decrypt the key file, + if it's encrypted. + @type password: str + @return: data blob that makes up the private key. + @rtype: str + + @raise IOError: if there was an error reading the file. + @raise PasswordRequiredException: if the private key file is + encrypted, and C{password} is C{None}. + @raise SSHException: if the key file is invalid. + """ + f = open(filename, 'r') + lines = f.readlines() + f.close() + start = 0 + while (start < len(lines)) and (lines[start].strip() != '-----BEGIN ' + tag + ' PRIVATE KEY-----'): + start += 1 + if start >= len(lines): + raise SSHException('not a valid ' + tag + ' private key file') + # parse any headers first + headers = {} + start += 1 + while start < len(lines): + l = lines[start].split(': ') + if len(l) == 1: + break + headers[l[0].lower()] = l[1].strip() + start += 1 + # find end + end = start + while (lines[end].strip() != '-----END ' + tag + ' PRIVATE KEY-----') and (end < len(lines)): + end += 1 + # if we trudged to the end of the file, just try to cope. + try: + data = base64.decodestring(''.join(lines[start:end])) + except binascii.Error, e: + raise SSHException('base64 decoding error: ' + str(e)) + if not headers.has_key('proc-type'): + # unencryped: done + return data + # encrypted keyfile: will need a password + if headers['proc-type'] != '4,ENCRYPTED': + raise SSHException('Unknown private key structure "%s"' % headers['proc-type']) + try: + encryption_type, saltstr = headers['dek-info'].split(',') + except: + raise SSHException('Can\'t parse DEK-info in private key file') + if not self._CIPHER_TABLE.has_key(encryption_type): + raise SSHException('Unknown private key cipher "%s"' % encryption_type) + # if no password was passed in, raise an exception pointing out that we need one + if password is None: + raise PasswordRequiredException('Private key file is encrypted') + cipher = self._CIPHER_TABLE[encryption_type]['cipher'] + keysize = self._CIPHER_TABLE[encryption_type]['keysize'] + mode = self._CIPHER_TABLE[encryption_type]['mode'] + salt = util.unhexify(saltstr) + key = util.generate_key_bytes(MD5, salt, password, keysize) + return cipher.new(key, mode, salt).decrypt(data) + + def _write_private_key_file(self, tag, filename, data, password=None): + """ + Write an SSH2-format private key file in a form that can be read by + paramiko or openssh. If no password is given, the key is written in + a trivially-encoded format (base64) which is completely insecure. If + a password is given, DES-EDE3-CBC is used. + + @param tag: C{"RSA"} or C{"DSA"}, the tag used to mark the data block. + @type tag: str + @param filename: name of the file to write. + @type filename: str + @param data: data blob that makes up the private key. + @type data: str + @param password: an optional password to use to encrypt the file. + @type password: str + + @raise IOError: if there was an error writing the file. + """ + f = open(filename, 'w', 0600) + # grrr... the mode doesn't always take hold + os.chmod(filename, 0600) + f.write('-----BEGIN %s PRIVATE KEY-----\n' % tag) + if password is not None: + # since we only support one cipher here, use it + cipher_name = self._CIPHER_TABLE.keys()[0] + cipher = self._CIPHER_TABLE[cipher_name]['cipher'] + keysize = self._CIPHER_TABLE[cipher_name]['keysize'] + blocksize = self._CIPHER_TABLE[cipher_name]['blocksize'] + mode = self._CIPHER_TABLE[cipher_name]['mode'] + salt = randpool.get_bytes(8) + key = util.generate_key_bytes(MD5, salt, password, keysize) + if len(data) % blocksize != 0: + n = blocksize - len(data) % blocksize + #data += randpool.get_bytes(n) + # that would make more sense ^, but it confuses openssh. + data += '\0' * n + data = cipher.new(key, mode, salt).encrypt(data) + f.write('Proc-Type: 4,ENCRYPTED\n') + f.write('DEK-Info: %s,%s\n' % (cipher_name, util.hexify(salt))) + f.write('\n') + s = base64.encodestring(data) + # re-wrap to 64-char lines + s = ''.join(s.split('\n')) + s = '\n'.join([s[i : i+64] for i in range(0, len(s), 64)]) + f.write(s) + f.write('\n') + f.write('-----END %s PRIVATE KEY-----\n' % tag) + f.close() diff --git a/paramiko/primes.py b/paramiko/primes.py new file mode 100644 index 0000000..3677394 --- /dev/null +++ b/paramiko/primes.py @@ -0,0 +1,148 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +Utility functions for dealing with primes. +""" + +from Crypto.Util import number + +from paramiko import util + + +def _generate_prime(bits, randpool): + "primtive attempt at prime generation" + hbyte_mask = pow(2, bits % 8) - 1 + while True: + # loop catches the case where we increment n into a higher bit-range + x = randpool.get_bytes((bits+7) // 8) + if hbyte_mask > 0: + x = chr(ord(x[0]) & hbyte_mask) + x[1:] + n = util.inflate_long(x, 1) + n |= 1 + n |= (1 << (bits - 1)) + while not number.isPrime(n): + n += 2 + if util.bit_length(n) == bits: + return n + +def _roll_random(rpool, n): + "returns a random # from 0 to N-1" + bits = util.bit_length(n-1) + bytes = (bits + 7) // 8 + hbyte_mask = pow(2, bits % 8) - 1 + + # so here's the plan: + # we fetch as many random bits as we'd need to fit N-1, and if the + # generated number is >= N, we try again. in the worst case (N-1 is a + # power of 2), we have slightly better than 50% odds of getting one that + # fits, so i can't guarantee that this loop will ever finish, but the odds + # of it looping forever should be infinitesimal. + while True: + x = rpool.get_bytes(bytes) + if hbyte_mask > 0: + x = chr(ord(x[0]) & hbyte_mask) + x[1:] + num = util.inflate_long(x, 1) + if num < n: + return num + + +class ModulusPack (object): + """ + convenience object for holding the contents of the /etc/ssh/moduli file, + on systems that have such a file. + """ + + def __init__(self, rpool): + # pack is a hash of: bits -> [ (generator, modulus) ... ] + self.pack = {} + self.discarded = [] + self.randpool = rpool + + def _parse_modulus(self, line): + timestamp, type, tests, tries, size, generator, modulus = line.split() + type = int(type) + tests = int(tests) + tries = int(tries) + size = int(size) + generator = int(generator) + modulus = long(modulus, 16) + + # weed out primes that aren't at least: + # type 2 (meets basic structural requirements) + # test 4 (more than just a small-prime sieve) + # tries < 100 if test & 4 (at least 100 tries of miller-rabin) + if (type < 2) or (tests < 4) or ((tests & 4) and (tests < 8) and (tries < 100)): + self.discarded.append((modulus, 'does not meet basic requirements')) + return + if generator == 0: + generator = 2 + + # there's a bug in the ssh "moduli" file (yeah, i know: shock! dismay! + # call cnn!) where it understates the bit lengths of these primes by 1. + # this is okay. + bl = util.bit_length(modulus) + if (bl != size) and (bl != size + 1): + self.discarded.append((modulus, 'incorrectly reported bit length %d' % size)) + return + if not self.pack.has_key(bl): + self.pack[bl] = [] + self.pack[bl].append((generator, modulus)) + + def read_file(self, filename): + """ + @raise IOError: passed from any file operations that fail. + """ + self.pack = {} + f = open(filename, 'r') + for line in f: + line = line.strip() + if (len(line) == 0) or (line[0] == '#'): + continue + try: + self._parse_modulus(line) + except: + continue + f.close() + + def get_modulus(self, min, prefer, max): + bitsizes = self.pack.keys() + bitsizes.sort() + if len(bitsizes) == 0: + raise SSHException('no moduli available') + good = -1 + # find nearest bitsize >= preferred + for b in bitsizes: + if (b >= prefer) and (b < max) and ((b < good) or (good == -1)): + good = b + # if that failed, find greatest bitsize >= min + if good == -1: + for b in bitsizes: + if (b >= min) and (b < max) and (b > good): + good = b + if good == -1: + # their entire (min, max) range has no intersection with our range. + # if their range is below ours, pick the smallest. otherwise pick + # the largest. it'll be out of their range requirement either way, + # but we'll be sending them the closest one we have. + good = bitsizes[0] + if min > good: + good = bitsizes[-1] + # now pick a random modulus of this bitsize + n = _roll_random(self.randpool, len(self.pack[good])) + return self.pack[good][n] diff --git a/paramiko/rsakey.py b/paramiko/rsakey.py new file mode 100644 index 0000000..780ea1b --- /dev/null +++ b/paramiko/rsakey.py @@ -0,0 +1,165 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +L{RSAKey} +""" + +from Crypto.PublicKey import RSA +from Crypto.Hash import SHA, MD5 +from Crypto.Cipher import DES3 + +from paramiko.common import * +from paramiko import util +from paramiko.message import Message +from paramiko.ber import BER, BERException +from paramiko.pkey import PKey +from paramiko.ssh_exception import SSHException + + +class RSAKey (PKey): + """ + Representation of an RSA key which can be used to sign and verify SSH2 + data. + """ + + def __init__(self, msg=None, data=None, filename=None, password=None, vals=None): + if filename is not None: + self._from_private_key_file(filename, password) + return + if (msg is None) and (data is not None): + msg = Message(data) + if vals is not None: + self.e, self.n = vals + else: + if msg is None: + raise SSHException('Key object may not be empty') + if msg.get_string() != 'ssh-rsa': + raise SSHException('Invalid key') + self.e = msg.get_mpint() + self.n = msg.get_mpint() + self.size = util.bit_length(self.n) + + def __str__(self): + m = Message() + m.add_string('ssh-rsa') + m.add_mpint(self.e) + m.add_mpint(self.n) + return str(m) + + def __hash__(self): + h = hash(self.get_name()) + h = h * 37 + hash(self.e) + h = h * 37 + hash(self.n) + return hash(h) + + def get_name(self): + return 'ssh-rsa' + + def get_bits(self): + return self.size + + def can_sign(self): + return hasattr(self, 'd') + + def sign_ssh_data(self, rpool, data): + digest = SHA.new(data).digest() + rsa = RSA.construct((long(self.n), long(self.e), long(self.d))) + sig = util.deflate_long(rsa.sign(self._pkcs1imify(digest), '')[0], 0) + m = Message() + m.add_string('ssh-rsa') + m.add_string(sig) + return m + + def verify_ssh_sig(self, data, msg): + if msg.get_string() != 'ssh-rsa': + return False + sig = util.inflate_long(msg.get_string(), True) + # verify the signature by SHA'ing the data and encrypting it using the + # public key. some wackiness ensues where we "pkcs1imify" the 20-byte + # hash into a string as long as the RSA key. + hash = util.inflate_long(self._pkcs1imify(SHA.new(data).digest()), True) + rsa = RSA.construct((long(self.n), long(self.e))) + return rsa.verify(hash, (sig,)) + + def write_private_key_file(self, filename, password=None): + keylist = [ 0, self.n, self.e, self.d, self.p, self.q, + self.d % (self.p - 1), self.d % (self.q - 1), + util.mod_inverse(self.q, self.p) ] + try: + b = BER() + b.encode(keylist) + except BERException: + raise SSHException('Unable to create ber encoding of key') + self._write_private_key_file('RSA', filename, str(b), password) + + def generate(bits, progress_func=None): + """ + Generate a new private RSA key. This factory function can be used to + generate a new host key or authentication key. + + @param bits: number of bits the generated key should be. + @type bits: int + @param progress_func: an optional function to call at key points in + key generation (used by C{pyCrypto.PublicKey}). + @type progress_func: function + @return: new private key + @rtype: L{RSAKey} + + @since: fearow + """ + randpool.stir() + rsa = RSA.generate(bits, randpool.get_bytes, progress_func) + key = RSAKey(vals=(rsa.e, rsa.n)) + key.d = rsa.d + key.p = rsa.p + key.q = rsa.q + return key + generate = staticmethod(generate) + + + ### internals... + + + def _pkcs1imify(self, data): + """ + turn a 20-byte SHA1 hash into a blob of data as large as the key's N, + using PKCS1's \"emsa-pkcs1-v1_5\" encoding. totally bizarre. + """ + SHA1_DIGESTINFO = '\x30\x21\x30\x09\x06\x05\x2b\x0e\x03\x02\x1a\x05\x00\x04\x14' + size = len(util.deflate_long(self.n, 0)) + filler = '\xff' * (size - len(SHA1_DIGESTINFO) - len(data) - 3) + return '\x00\x01' + filler + '\x00' + SHA1_DIGESTINFO + data + + def _from_private_key_file(self, filename, password): + # private key file contains: + # RSAPrivateKey = { version = 0, n, e, d, p, q, d mod p-1, d mod q-1, q**-1 mod p } + data = self._read_private_key_file('RSA', filename, password) + try: + keylist = BER(data).decode() + except BERException: + raise SSHException('Unable to parse key file') + if (type(keylist) is not list) or (len(keylist) < 4) or (keylist[0] != 0): + raise SSHException('Not a valid RSA private key file (bad ber encoding)') + self.n = keylist[1] + self.e = keylist[2] + self.d = keylist[3] + # not really needed + self.p = keylist[4] + self.q = keylist[5] + self.size = util.bit_length(self.n) diff --git a/paramiko/server.py b/paramiko/server.py new file mode 100644 index 0000000..a0e3988 --- /dev/null +++ b/paramiko/server.py @@ -0,0 +1,527 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +L{ServerInterface} is an interface to override for server support. +""" + +import threading +from paramiko.common import * +from paramiko import util + + +class InteractiveQuery (object): + """ + A query (set of prompts) for a user during interactive authentication. + """ + + def __init__(self, name='', instructions='', *prompts): + """ + Create a new interactive query to send to the client. The name and + instructions are optional, but are generally displayed to the end + user. A list of prompts may be included, or they may be added via + the L{add_prompt} method. + + @param name: name of this query + @type name: str + @param instructions: user instructions (usually short) about this query + @type instructions: str + """ + self.name = name + self.instructions = instructions + self.prompts = [] + for x in prompts: + if (type(x) is str) or (type(x) is unicode): + self.add_prompt(x) + else: + self.add_prompt(x[0], x[1]) + + def add_prompt(self, prompt, echo=True): + """ + Add a prompt to this query. The prompt should be a (reasonably short) + string. Multiple prompts can be added to the same query. + + @param prompt: the user prompt + @type prompt: str + @param echo: C{True} (default) if the user's response should be echoed; + C{False} if not (for a password or similar) + @type echo: bool + """ + self.prompts.append((prompt, echo)) + + +class ServerInterface (object): + """ + This class defines an interface for controlling the behavior of paramiko + in server mode. + + Methods on this class are called from paramiko's primary thread, so you + shouldn't do too much work in them. (Certainly nothing that blocks or + sleeps.) + """ + + def check_channel_request(self, kind, chanid): + """ + Determine if a channel request of a given type will be granted, and + return C{OPEN_SUCCEEDED} or an error code. This method is + called in server mode when the client requests a channel, after + authentication is complete. + + If you allow channel requests (and an ssh server that didn't would be + useless), you should also override some of the channel request methods + below, which are used to determine which services will be allowed on + a given channel: + - L{check_channel_pty_request} + - L{check_channel_shell_request} + - L{check_channel_subsystem_request} + - L{check_channel_window_change_request} + + The C{chanid} parameter is a small number that uniquely identifies the + channel within a L{Transport}. A L{Channel} object is not created + unless this method returns C{OPEN_SUCCEEDED} -- once a + L{Channel} object is created, you can call L{Channel.get_id} to + retrieve the channel ID. + + The return value should either be C{OPEN_SUCCEEDED} (or + C{0}) to allow the channel request, or one of the following error + codes to reject it: + - C{OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED} + - C{OPEN_FAILED_CONNECT_FAILED} + - C{OPEN_FAILED_UNKNOWN_CHANNEL_TYPE} + - C{OPEN_FAILED_RESOURCE_SHORTAGE} + + The default implementation always returns + C{OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED}. + + @param kind: the kind of channel the client would like to open + (usually C{"session"}). + @type kind: str + @param chanid: ID of the channel + @type chanid: int + @return: a success or failure code (listed above) + @rtype: int + """ + return OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED + + def get_allowed_auths(self, username): + """ + Return a list of authentication methods supported by the server. + This list is sent to clients attempting to authenticate, to inform them + of authentication methods that might be successful. + + The "list" is actually a string of comma-separated names of types of + authentication. Possible values are C{"password"}, C{"publickey"}, + and C{"none"}. + + The default implementation always returns C{"password"}. + + @param username: the username requesting authentication. + @type username: str + @return: a comma-separated list of authentication types + @rtype: str + """ + return 'password' + + def check_auth_none(self, username): + """ + Determine if a client may open channels with no (further) + authentication. + + Return L{AUTH_FAILED} if the client must authenticate, or + L{AUTH_SUCCESSFUL} if it's okay for the client to not + authenticate. + + The default implementation always returns L{AUTH_FAILED}. + + @param username: the username of the client. + @type username: str + @return: L{AUTH_FAILED} if the authentication fails; + L{AUTH_SUCCESSFUL} if it succeeds. + @rtype: int + """ + return AUTH_FAILED + + def check_auth_password(self, username, password): + """ + Determine if a given username and password supplied by the client is + acceptable for use in authentication. + + Return L{AUTH_FAILED} if the password is not accepted, + L{AUTH_SUCCESSFUL} if the password is accepted and completes + the authentication, or L{AUTH_PARTIALLY_SUCCESSFUL} if your + authentication is stateful, and this key is accepted for + authentication, but more authentication is required. (In this latter + case, L{get_allowed_auths} will be called to report to the client what + options it has for continuing the authentication.) + + The default implementation always returns L{AUTH_FAILED}. + + @param username: the username of the authenticating client. + @type username: str + @param password: the password given by the client. + @type password: str + @return: L{AUTH_FAILED} if the authentication fails; + L{AUTH_SUCCESSFUL} if it succeeds; + L{AUTH_PARTIALLY_SUCCESSFUL} if the password auth is + successful, but authentication must continue. + @rtype: int + """ + return AUTH_FAILED + + def check_auth_publickey(self, username, key): + """ + Determine if a given key supplied by the client is acceptable for use + in authentication. You should override this method in server mode to + check the username and key and decide if you would accept a signature + made using this key. + + Return L{AUTH_FAILED} if the key is not accepted, + L{AUTH_SUCCESSFUL} if the key is accepted and completes the + authentication, or L{AUTH_PARTIALLY_SUCCESSFUL} if your + authentication is stateful, and this password is accepted for + authentication, but more authentication is required. (In this latter + case, L{get_allowed_auths} will be called to report to the client what + options it has for continuing the authentication.) + + Note that you don't have to actually verify any key signtature here. + If you're willing to accept the key, paramiko will do the work of + verifying the client's signature. + + The default implementation always returns L{AUTH_FAILED}. + + @param username: the username of the authenticating client + @type username: str + @param key: the key object provided by the client + @type key: L{PKey } + @return: L{AUTH_FAILED} if the client can't authenticate + with this key; L{AUTH_SUCCESSFUL} if it can; + L{AUTH_PARTIALLY_SUCCESSFUL} if it can authenticate with + this key but must continue with authentication + @rtype: int + """ + return AUTH_FAILED + + def check_auth_interactive(self, username, submethods): + """ + Begin an interactive authentication challenge, if supported. You + should override this method in server mode if you want to support the + C{"keyboard-interactive"} auth type, which requires you to send a + series of questions for the client to answer. + + Return L{AUTH_FAILED} if this auth method isn't supported. Otherwise, + you should return an L{InteractiveQuery} object containing the prompts + and instructions for the user. The response will be sent via a call + to L{check_auth_interactive_response}. + + The default implementation always returns L{AUTH_FAILED}. + + @param username: the username of the authenticating client + @type username: str + @param submethods: a comma-separated list of methods preferred by the + client (usually empty) + @type submethods: str + @return: L{AUTH_FAILED} if this auth method isn't supported; otherwise + an object containing queries for the user + @rtype: int or L{InteractiveQuery} + """ + return AUTH_FAILED + + def check_auth_interactive_response(self, responses): + """ + Continue or finish an interactive authentication challenge, if + supported. You should override this method in server mode if you want + to support the C{"keyboard-interactive"} auth type. + + Return L{AUTH_FAILED} if the responses are not accepted, + L{AUTH_SUCCESSFUL} if the responses are accepted and complete + the authentication, or L{AUTH_PARTIALLY_SUCCESSFUL} if your + authentication is stateful, and this set of responses is accepted for + authentication, but more authentication is required. (In this latter + case, L{get_allowed_auths} will be called to report to the client what + options it has for continuing the authentication.) + + If you wish to continue interactive authentication with more questions, + you may return an L{InteractiveQuery} object, which should cause the + client to respond with more answers, calling this method again. This + cycle can continue indefinitely. + + The default implementation always returns L{AUTH_FAILED}. + + @param responses: list of responses from the client + @type responses: list(str) + @return: L{AUTH_FAILED} if the authentication fails; + L{AUTH_SUCCESSFUL} if it succeeds; + L{AUTH_PARTIALLY_SUCCESSFUL} if the interactive auth is + successful, but authentication must continue; otherwise an object + containing queries for the user + @rtype: int or L{InteractiveQuery} + """ + return AUTH_FAILED + + def check_global_request(self, kind, msg): + """ + Handle a global request of the given C{kind}. This method is called + in server mode and client mode, whenever the remote host makes a global + request. If there are any arguments to the request, they will be in + C{msg}. + + There aren't any useful global requests defined, aside from port + forwarding, so usually this type of request is an extension to the + protocol. + + If the request was successful and you would like to return contextual + data to the remote host, return a tuple. Items in the tuple will be + sent back with the successful result. (Note that the items in the + tuple can only be strings, ints, longs, or bools.) + + The default implementation always returns C{False}, indicating that it + does not support any global requests. + + @param kind: the kind of global request being made. + @type kind: str + @param msg: any extra arguments to the request. + @type msg: L{Message} + @return: C{True} or a tuple of data if the request was granted; + C{False} otherwise. + @rtype: bool + """ + return False + + + ### Channel requests + + + def check_channel_pty_request(self, channel, term, width, height, pixelwidth, pixelheight, + modes): + """ + Determine if a pseudo-terminal of the given dimensions (usually + requested for shell access) can be provided on the given channel. + + The default implementation always returns C{False}. + + @param channel: the L{Channel} the pty request arrived on. + @type channel: L{Channel} + @param term: type of terminal requested (for example, C{"vt100"}). + @type term: str + @param width: width of screen in characters. + @type width: int + @param height: height of screen in characters. + @type height: int + @param pixelwidth: width of screen in pixels, if known (may be C{0} if + unknown). + @type pixelwidth: int + @param pixelheight: height of screen in pixels, if known (may be C{0} + if unknown). + @type pixelheight: int + @return: C{True} if the psuedo-terminal has been allocated; C{False} + otherwise. + @rtype: bool + """ + return False + + def check_channel_shell_request(self, channel): + """ + Determine if a shell will be provided to the client on the given + channel. If this method returns C{True}, the channel should be + connected to the stdin/stdout of a shell (or something that acts like + a shell). + + The default implementation always returns C{False}. + + @param channel: the L{Channel} the request arrived on. + @type channel: L{Channel} + @return: C{True} if this channel is now hooked up to a shell; C{False} + if a shell can't or won't be provided. + @rtype: bool + """ + return False + + def check_channel_exec_request(self, channel, command): + """ + Determine if a shell command will be executed for the client. If this + method returns C{True}, the channel should be connected to the stdin, + stdout, and stderr of the shell command. + + The default implementation always returns C{False}. + + @param channel: the L{Channel} the request arrived on. + @type channel: L{Channel} + @param command: the command to execute. + @type command: str + @return: C{True} if this channel is now hooked up to the stdin, + stdout, and stderr of the executing command; C{False} if the + command will not be executed. + @rtype: bool + + @since: 1.1 + """ + return False + + def check_channel_subsystem_request(self, channel, name): + """ + Determine if a requested subsystem will be provided to the client on + the given channel. If this method returns C{True}, all future I/O + through this channel will be assumed to be connected to the requested + subsystem. An example of a subsystem is C{sftp}. + + The default implementation checks for a subsystem handler assigned via + L{Transport.set_subsystem_handler}. + If one has been set, the handler is invoked and this method returns + C{True}. Otherwise it returns C{False}. + + @note: Because the default implementation uses the L{Transport} to + identify valid subsystems, you probably won't need to override this + method. + + @param channel: the L{Channel} the pty request arrived on. + @type channel: L{Channel} + @param name: name of the requested subsystem. + @type name: str + @return: C{True} if this channel is now hooked up to the requested + subsystem; C{False} if that subsystem can't or won't be provided. + @rtype: bool + """ + handler_class, larg, kwarg = channel.get_transport()._get_subsystem_handler(name) + if handler_class is None: + return False + handler = handler_class(channel, name, self, *larg, **kwarg) + handler.start() + return True + + def check_channel_window_change_request(self, channel, width, height, pixelwidth, pixelheight): + """ + Determine if the pseudo-terminal on the given channel can be resized. + This only makes sense if a pty was previously allocated on it. + + The default implementation always returns C{False}. + + @param channel: the L{Channel} the pty request arrived on. + @type channel: L{Channel} + @param width: width of screen in characters. + @type width: int + @param height: height of screen in characters. + @type height: int + @param pixelwidth: width of screen in pixels, if known (may be C{0} if + unknown). + @type pixelwidth: int + @param pixelheight: height of screen in pixels, if known (may be C{0} + if unknown). + @type pixelheight: int + @return: C{True} if the terminal was resized; C{False} if not. + @rtype: bool + """ + return False + + +class SubsystemHandler (threading.Thread): + """ + Handler for a subsytem in server mode. If you create a subclass of this + class and pass it to + L{Transport.set_subsystem_handler}, + an object of this + class will be created for each request for this subsystem. Each new object + will be executed within its own new thread by calling L{start_subsystem}. + When that method completes, the channel is closed. + + For example, if you made a subclass C{MP3Handler} and registered it as the + handler for subsystem C{"mp3"}, then whenever a client has successfully + authenticated and requests subsytem C{"mp3"}, an object of class + C{MP3Handler} will be created, and L{start_subsystem} will be called on + it from a new thread. + + @since: ivysaur + """ + def __init__(self, channel, name, server): + """ + Create a new handler for a channel. This is used by L{ServerInterface} + to start up a new handler when a channel requests this subsystem. You + don't need to override this method, but if you do, be sure to pass the + C{channel} and C{name} parameters through to the original C{__init__} + method here. + + @param channel: the channel associated with this subsystem request. + @type channel: L{Channel} + @param name: name of the requested subsystem. + @type name: str + @param server: the server object for the session that started this + subsystem + @type server: L{ServerInterface} + """ + threading.Thread.__init__(self, target=self._run) + self.__channel = channel + self.__transport = channel.get_transport() + self.__name = name + self.__server = server + + def get_server(self): + """ + Return the L{ServerInterface} object associated with this channel and + subsystem. + + @rtype: L{ServerInterface} + """ + return self.__server + + def _run(self): + try: + self.__transport._log(DEBUG, 'Starting handler for subsystem %s' % self.__name) + self.start_subsystem(self.__name, self.__transport, self.__channel) + except Exception, e: + self.__transport._log(ERROR, 'Exception in subsystem handler for "%s": %s' % + (self.__name, str(e))) + self.__transport._log(ERROR, util.tb_strings()) + try: + self.finish_subsystem() + except: + pass + + def start_subsystem(self, name, transport, channel): + """ + Process an ssh subsystem in server mode. This method is called on a + new object (and in a new thread) for each subsystem request. It is + assumed that all subsystem logic will take place here, and when the + subsystem is finished, this method will return. After this method + returns, the channel is closed. + + The combination of C{transport} and C{channel} are unique; this handler + corresponds to exactly one L{Channel} on one L{Transport}. + + @note: It is the responsibility of this method to exit if the + underlying L{Transport} is closed. This can be done by checking + L{Transport.is_active} or noticing an EOF + on the L{Channel}. If this method loops forever without checking + for this case, your python interpreter may refuse to exit because + this thread will still be running. + + @param name: name of the requested subsystem. + @type name: str + @param transport: the server-mode L{Transport}. + @type transport: L{Transport} + @param channel: the channel associated with this subsystem request. + @type channel: L{Channel} + """ + pass + + def finish_subsystem(self): + """ + Perform any cleanup at the end of a subsystem. The default + implementation just closes the channel. + + @since: 1.1 + """ + self.__channel.close() diff --git a/paramiko/sftp.py b/paramiko/sftp.py new file mode 100644 index 0000000..58d7103 --- /dev/null +++ b/paramiko/sftp.py @@ -0,0 +1,168 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +import socket +import struct + +from paramiko.common import * +from paramiko import util +from paramiko.channel import Channel +from paramiko.message import Message + + +CMD_INIT, CMD_VERSION, CMD_OPEN, CMD_CLOSE, CMD_READ, CMD_WRITE, CMD_LSTAT, CMD_FSTAT, \ + CMD_SETSTAT, CMD_FSETSTAT, CMD_OPENDIR, CMD_READDIR, CMD_REMOVE, CMD_MKDIR, \ + CMD_RMDIR, CMD_REALPATH, CMD_STAT, CMD_RENAME, CMD_READLINK, CMD_SYMLINK \ + = range(1, 21) +CMD_STATUS, CMD_HANDLE, CMD_DATA, CMD_NAME, CMD_ATTRS = range(101, 106) +CMD_EXTENDED, CMD_EXTENDED_REPLY = range(200, 202) + +SFTP_OK = 0 +SFTP_EOF, SFTP_NO_SUCH_FILE, SFTP_PERMISSION_DENIED, SFTP_FAILURE, SFTP_BAD_MESSAGE, \ + SFTP_NO_CONNECTION, SFTP_CONNECTION_LOST, SFTP_OP_UNSUPPORTED = range(1, 9) + +SFTP_DESC = [ 'Success', + 'End of file', + 'No such file', + 'Permission denied', + 'Failure', + 'Bad message', + 'No connection', + 'Connection lost', + 'Operation unsupported' ] + +SFTP_FLAG_READ = 0x1 +SFTP_FLAG_WRITE = 0x2 +SFTP_FLAG_APPEND = 0x4 +SFTP_FLAG_CREATE = 0x8 +SFTP_FLAG_TRUNC = 0x10 +SFTP_FLAG_EXCL = 0x20 + +_VERSION = 3 + + +# for debugging +CMD_NAMES = { + CMD_INIT: 'init', + CMD_VERSION: 'version', + CMD_OPEN: 'open', + CMD_CLOSE: 'close', + CMD_READ: 'read', + CMD_WRITE: 'write', + CMD_LSTAT: 'lstat', + CMD_FSTAT: 'fstat', + CMD_SETSTAT: 'setstat', + CMD_FSETSTAT: 'fsetstat', + CMD_OPENDIR: 'opendir', + CMD_READDIR: 'readdir', + CMD_REMOVE: 'remove', + CMD_MKDIR: 'mkdir', + CMD_RMDIR: 'rmdir', + CMD_REALPATH: 'realpath', + CMD_STAT: 'stat', + CMD_RENAME: 'rename', + CMD_READLINK: 'readlink', + CMD_SYMLINK: 'symlink', + CMD_STATUS: 'status', + CMD_HANDLE: 'handle', + CMD_DATA: 'data', + CMD_NAME: 'name', + CMD_ATTRS: 'attrs', + CMD_EXTENDED: 'extended', + CMD_EXTENDED_REPLY: 'extended_reply' + } + + +class SFTPError (Exception): + pass + + +class BaseSFTP (object): + def __init__(self): + self.logger = util.get_logger('paramiko.sftp') + self.sock = None + self.ultra_debug = False + + + ### internals... + + + def _send_version(self): + self._send_packet(CMD_INIT, struct.pack('>I', _VERSION)) + t, data = self._read_packet() + if t != CMD_VERSION: + raise SFTPError('Incompatible sftp protocol') + version = struct.unpack('>I', data[:4])[0] + # if version != _VERSION: + # raise SFTPError('Incompatible sftp protocol') + return version + + def _send_server_version(self): + # advertise that we support "check-file" + extension_pairs = [ 'check-file', 'md5,sha1' ] + msg = Message() + msg.add_int(_VERSION) + msg.add(*extension_pairs) + self._send_packet(CMD_VERSION, str(msg)) + t, data = self._read_packet() + if t != CMD_INIT: + raise SFTPError('Incompatible sftp protocol') + version = struct.unpack('>I', data[:4])[0] + return version + + def _log(self, level, msg): + if issubclass(type(msg), list): + for m in msg: + self.logger.log(level, m) + else: + self.logger.log(level, msg) + + def _write_all(self, out): + while len(out) > 0: + n = self.sock.send(out) + if n <= 0: + raise EOFError() + if n == len(out): + return + out = out[n:] + return + + def _read_all(self, n): + out = '' + while n > 0: + x = self.sock.recv(n) + if len(x) == 0: + raise EOFError() + out += x + n -= len(x) + return out + + def _send_packet(self, t, packet): + out = struct.pack('>I', len(packet) + 1) + chr(t) + packet + if self.ultra_debug: + self._log(DEBUG, util.format_binary(out, 'OUT: ')) + self._write_all(out) + + def _read_packet(self): + size = struct.unpack('>I', self._read_all(4))[0] + data = self._read_all(size) + if self.ultra_debug: + self._log(DEBUG, util.format_binary(data, 'IN: ')); + if size > 0: + return ord(data[0]), data[1:] + return 0, '' diff --git a/paramiko/sftp_attr.py b/paramiko/sftp_attr.py new file mode 100644 index 0000000..eae7c99 --- /dev/null +++ b/paramiko/sftp_attr.py @@ -0,0 +1,208 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +import stat +import time +from paramiko.common import * +from paramiko.sftp import * + + +class SFTPAttributes (object): + """ + Representation of the attributes of a file (or proxied file) for SFTP in + client or server mode. It attemps to mirror the object returned by + C{os.stat} as closely as possible, so it may have the following fields, + with the same meanings as those returned by an C{os.stat} object: + - st_size + - st_uid + - st_gid + - st_mode + - st_atime + - st_mtime + + Because SFTP allows flags to have other arbitrary named attributes, these + are stored in a dict named C{attr}. Occasionally, the filename is also + stored, in C{filename}. + """ + + FLAG_SIZE = 1 + FLAG_UIDGID = 2 + FLAG_PERMISSIONS = 4 + FLAG_AMTIME = 8 + FLAG_EXTENDED = 0x80000000L + + def __init__(self): + """ + Create a new (empty) SFTPAttributes object. All fields will be empty. + """ + self._flags = 0 + self.attr = {} + + def from_stat(cls, obj, filename=None): + """ + Create an SFTPAttributes object from an existing C{stat} object (an + object returned by C{os.stat}). + + @param obj: an object returned by C{os.stat} (or equivalent). + @type obj: object + @param filename: the filename associated with this file. + @type filename: str + @return: new L{SFTPAttributes} object with the same attribute fields. + @rtype: L{SFTPAttributes} + """ + attr = cls() + attr.st_size = obj.st_size + attr.st_uid = obj.st_uid + attr.st_gid = obj.st_gid + attr.st_mode = obj.st_mode + attr.st_atime = obj.st_atime + attr.st_mtime = obj.st_mtime + if filename is not None: + attr.filename = filename + return attr + from_stat = classmethod(from_stat) + + def __repr__(self): + return '' % self._debug_str() + + def __str__(self): + return self._debug_str() + + + ### internals... + + + def _from_msg(cls, msg, filename=None): + attr = cls() + attr._unpack(msg) + if filename is not None: + attr.filename = filename + return attr + _from_msg = classmethod(_from_msg) + + def _unpack(self, msg): + self._flags = msg.get_int() + if self._flags & self.FLAG_SIZE: + self.st_size = msg.get_int64() + if self._flags & self.FLAG_UIDGID: + self.st_uid = msg.get_int() + self.st_gid = msg.get_int() + if self._flags & self.FLAG_PERMISSIONS: + self.st_mode = msg.get_int() + if self._flags & self.FLAG_AMTIME: + self.st_atime = msg.get_int() + self.st_mtime = msg.get_int() + if self._flags & self.FLAG_EXTENDED: + count = msg.get_int() + for i in range(count): + self.attr[msg.get_string()] = msg.get_string() + + def _pack(self, msg): + self._flags = 0 + if hasattr(self, 'st_size'): + self._flags |= self.FLAG_SIZE + if hasattr(self, 'st_uid') or hasattr(self, 'st_gid'): + self._flags |= self.FLAG_UIDGID + if hasattr(self, 'st_mode'): + self._flags |= self.FLAG_PERMISSIONS + if hasattr(self, 'st_atime') or hasattr(self, 'st_mtime'): + self._flags |= self.FLAG_AMTIME + if len(self.attr) > 0: + self._flags |= self.FLAG_EXTENDED + msg.add_int(self._flags) + if self._flags & self.FLAG_SIZE: + msg.add_int64(self.st_size) + if self._flags & self.FLAG_UIDGID: + msg.add_int(getattr(self, 'st_uid', 0)) + msg.add_int(getattr(self, 'st_gid', 0)) + if self._flags & self.FLAG_PERMISSIONS: + msg.add_int(self.st_mode) + if self._flags & self.FLAG_AMTIME: + msg.add_int(getattr(self, 'st_atime', 0)) + msg.add_int(getattr(self, 'st_mtime', 0)) + if self._flags & self.FLAG_EXTENDED: + msg.add_int(len(self.attr)) + for key, val in self.attr.iteritems(): + msg.add_string(key) + msg.add_string(val) + return + + def _debug_str(self): + out = '[ ' + if hasattr(self, 'st_size'): + out += 'size=%d ' % self.st_size + if hasattr(self, 'st_uid') or hasattr(self, 'st_gid'): + out += 'uid=%d gid=%d ' % (getattr(self, 'st_uid', 0), getattr(self, 'st_gid', 0)) + if hasattr(self, 'st_mode'): + out += 'mode=' + oct(self.st_mode) + ' ' + if hasattr(self, 'st_atime') or hasattr(self, 'st_mtime'): + out += 'atime=%d mtime=%d ' % (getattr(self, 'st_atime', 0), + getattr(self, 'st_mtime', 0)) + for k, v in self.attr.iteritems(): + out += '"%s"=%r ' % (str(k), v) + out += ']' + return out + + def _rwx(n, suid, sticky=False): + if suid: + suid = 2 + out = '-r'[n >> 2] + '-w'[(n >> 1) & 1] + if sticky: + out += '-xTt'[suid + (n & 1)] + else: + out += '-xSs'[suid + (n & 1)] + return out + _rwx = staticmethod(_rwx) + + def __str__(self): + "create a unix-style long description of the file (like ls -l)" + if hasattr(self, 'st_mode'): + kind = stat.S_IFMT(self.st_mode) + if kind == stat.S_IFIFO: + ks = 'p' + elif kind == stat.S_IFCHR: + ks = 'c' + elif kind == stat.S_IFDIR: + ks = 'd' + elif kind == stat.S_IFBLK: + ks = 'b' + elif kind == stat.S_IFREG: + ks = '-' + elif kind == stat.S_IFLNK: + ks = 'l' + elif kind == stat.S_IFSOCK: + ks = 's' + else: + ks = '?' + ks += self._rwx((self.st_mode & 0700) >> 6, self.st_mode & stat.S_ISUID) + ks += self._rwx((self.st_mode & 070) >> 3, self.st_mode & stat.S_ISGID) + ks += self._rwx(self.st_mode & 7, self.st_mode & stat.S_ISVTX, True) + else: + ks = '?---------' + uid = getattr(self, 'st_uid', -1) + gid = getattr(self, 'st_gid', -1) + size = getattr(self, 'st_size', -1) + mtime = getattr(self, 'st_mtime', 0) + # compute display date + if abs(time.time() - mtime) > 15552000: + # (15552000 = 6 months) + datestr = time.strftime('%d %b %Y', time.localtime(mtime)) + else: + datestr = time.strftime('%d %b %H:%M', time.localtime(mtime)) + filename = getattr(self, 'filename', '?') + return '%s 1 %-8d %-8d %8d %-12s %s' % (ks, uid, gid, size, datestr, filename) diff --git a/paramiko/sftp_client.py b/paramiko/sftp_client.py new file mode 100644 index 0000000..2fe89e9 --- /dev/null +++ b/paramiko/sftp_client.py @@ -0,0 +1,618 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +Client-mode SFTP support. +""" + +import errno +import os +import threading +import weakref +from paramiko.sftp import * +from paramiko.sftp_attr import SFTPAttributes +from paramiko.sftp_file import SFTPFile + + +def _to_unicode(s): + "if a str is not ascii, decode its utf8 into unicode" + try: + return s.encode('ascii') + except: + return s.decode('utf-8') + + +class SFTPClient (BaseSFTP): + """ + SFTP client object. C{SFTPClient} is used to open an sftp session across + an open ssh L{Transport} and do remote file operations. + """ + + def __init__(self, sock): + """ + Create an SFTP client from an existing L{Channel}. The channel + should already have requested the C{"sftp"} subsystem. + + An alternate way to create an SFTP client context is by using + L{from_transport}. + + @param sock: an open L{Channel} using the C{"sftp"} subsystem. + @type sock: L{Channel} + """ + BaseSFTP.__init__(self) + self.sock = sock + self.ultra_debug = False + self.request_number = 1 + # lock for request_number + self._lock = threading.Lock() + self._cwd = None + # request # -> SFTPFile + self._expecting = weakref.WeakValueDictionary() + if type(sock) is Channel: + # override default logger + transport = self.sock.get_transport() + self.logger = util.get_logger(transport.get_log_channel() + '.' + + self.sock.get_name() + '.sftp') + self.ultra_debug = transport.get_hexdump() + self._send_version() + + def __del__(self): + self.close() + + def from_transport(selfclass, t): + """ + Create an SFTP client channel from an open L{Transport}. + + @param t: an open L{Transport} which is already authenticated. + @type t: L{Transport} + @return: a new L{SFTPClient} object, referring to an sftp session + (channel) across the transport. + @rtype: L{SFTPClient} + """ + chan = t.open_session() + if chan is None: + return None + if not chan.invoke_subsystem('sftp'): + raise SFTPError('Failed to invoke sftp subsystem') + return selfclass(chan) + from_transport = classmethod(from_transport) + + def close(self): + """ + Close the SFTP session and its underlying channel. + + @since: 1.4 + """ + self.sock.close() + + def listdir(self, path='.'): + """ + Return a list containing the names of the entries in the given C{path}. + The list is in arbitrary order. It does not include the special + entries C{'.'} and C{'..'} even if they are present in the folder. + This method is meant to mirror C{os.listdir} as closely as possible. + For a list of full L{SFTPAttributes} objects, see L{listdir_attr}. + + @param path: path to list (defaults to C{'.'}) + @type path: str + @return: list of filenames + @rtype: list of str + """ + return [f.filename for f in self.listdir_attr(path)] + + def listdir_attr(self, path='.'): + """ + Return a list containing L{SFTPAttributes} objects corresponding to + files in the given C{path}. The list is in arbitrary order. It does + not include the special entries C{'.'} and C{'..'} even if they are + present in the folder. + + @param path: path to list (defaults to C{'.'}) + @type path: str + @return: list of attributes + @rtype: list of L{SFTPAttributes} + + @since: 1.2 + """ + path = self._adjust_cwd(path) + t, msg = self._request(CMD_OPENDIR, path) + if t != CMD_HANDLE: + raise SFTPError('Expected handle') + handle = msg.get_string() + filelist = [] + while True: + try: + t, msg = self._request(CMD_READDIR, handle) + except EOFError, e: + # done with handle + break + if t != CMD_NAME: + raise SFTPError('Expected name response') + count = msg.get_int() + for i in range(count): + filename = _to_unicode(msg.get_string()) + longname = _to_unicode(msg.get_string()) + attr = SFTPAttributes._from_msg(msg, filename) + if (filename != '.') and (filename != '..'): + filelist.append(attr) + self._request(CMD_CLOSE, handle) + return filelist + + def file(self, filename, mode='r', bufsize=-1): + """ + Open a file on the remote server. The arguments are the same as for + python's built-in C{file} (aka C{open}). A file-like object is + returned, which closely mimics the behavior of a normal python file + object. + + The mode indicates how the file is to be opened: C{'r'} for reading, + C{'w'} for writing (truncating an existing file), C{'a'} for appending, + C{'r+'} for reading/writing, C{'w+'} for reading/writing (truncating an + existing file), C{'a+'} for reading/appending. The python C{'b'} flag + is ignored, since SSH treats all files as binary. The C{'U'} flag is + supported in a compatible way. + + Since 1.5.2, an C{'x'} flag indicates that the operation should only + succeed if the file was created and did not previously exist. This has + no direct mapping to python's file flags, but is commonly known as the + C{O_EXCL} flag in posix. + + The file will be buffered in standard python style by default, but + can be altered with the C{bufsize} parameter. C{0} turns off + buffering, C{1} uses line buffering, and any number greater than 1 + (C{>1}) uses that specific buffer size. + + @param filename: name of the file to open. + @type filename: string + @param mode: mode (python-style) to open in. + @type mode: string + @param bufsize: desired buffering (-1 = default buffer size) + @type bufsize: int + @return: a file object representing the open file. + @rtype: SFTPFile + + @raise IOError: if the file could not be opened. + """ + filename = self._adjust_cwd(filename) + imode = 0 + if ('r' in mode) or ('+' in mode): + imode |= SFTP_FLAG_READ + if ('w' in mode) or ('+' in mode) or ('a' in mode): + imode |= SFTP_FLAG_WRITE + if ('w' in mode): + imode |= SFTP_FLAG_CREATE | SFTP_FLAG_TRUNC + if ('a' in mode): + imode |= SFTP_FLAG_CREATE | SFTP_FLAG_APPEND + if ('x' in mode): + imode |= SFTP_FLAG_CREATE | SFTP_FLAG_EXCL + attrblock = SFTPAttributes() + t, msg = self._request(CMD_OPEN, filename, imode, attrblock) + if t != CMD_HANDLE: + raise SFTPError('Expected handle') + handle = msg.get_string() + return SFTPFile(self, handle, mode, bufsize) + + # python has migrated toward file() instead of open(). + # and really, that's more easily identifiable. + open = file + + def remove(self, path): + """ + Remove the file at the given path. + + @param path: path (absolute or relative) of the file to remove. + @type path: string + + @raise IOError: if the path refers to a folder (directory). Use + L{rmdir} to remove a folder. + """ + path = self._adjust_cwd(path) + self._request(CMD_REMOVE, path) + + unlink = remove + + def rename(self, oldpath, newpath): + """ + Rename a file or folder from C{oldpath} to C{newpath}. + + @param oldpath: existing name of the file or folder. + @type oldpath: string + @param newpath: new name for the file or folder. + @type newpath: string + + @raise IOError: if C{newpath} is a folder, or something else goes + wrong. + """ + oldpath = self._adjust_cwd(oldpath) + newpath = self._adjust_cwd(newpath) + self._request(CMD_RENAME, oldpath, newpath) + + def mkdir(self, path, mode=0777): + """ + Create a folder (directory) named C{path} with numeric mode C{mode}. + The default mode is 0777 (octal). On some systems, mode is ignored. + Where it is used, the current umask value is first masked out. + + @param path: name of the folder to create. + @type path: string + @param mode: permissions (posix-style) for the newly-created folder. + @type mode: int + """ + path = self._adjust_cwd(path) + attr = SFTPAttributes() + attr.st_mode = mode + self._request(CMD_MKDIR, path, attr) + + def rmdir(self, path): + """ + Remove the folder named C{path}. + + @param path: name of the folder to remove. + @type path: string + """ + path = self._adjust_cwd(path) + self._request(CMD_RMDIR, path) + + def stat(self, path): + """ + Retrieve information about a file on the remote system. The return + value is an object whose attributes correspond to the attributes of + python's C{stat} structure as returned by C{os.stat}, except that it + contains fewer fields. An SFTP server may return as much or as little + info as it wants, so the results may vary from server to server. + + Unlike a python C{stat} object, the result may not be accessed as a + tuple. This is mostly due to the author's slack factor. + + The fields supported are: C{st_mode}, C{st_size}, C{st_uid}, C{st_gid}, + C{st_atime}, and C{st_mtime}. + + @param path: the filename to stat. + @type path: string + @return: an object containing attributes about the given file. + @rtype: SFTPAttributes + """ + path = self._adjust_cwd(path) + t, msg = self._request(CMD_STAT, path) + if t != CMD_ATTRS: + raise SFTPError('Expected attributes') + return SFTPAttributes._from_msg(msg) + + def lstat(self, path): + """ + Retrieve information about a file on the remote system, without + following symbolic links (shortcuts). This otherwise behaves exactly + the same as L{stat}. + + @param path: the filename to stat. + @type path: string + @return: an object containing attributes about the given file. + @rtype: SFTPAttributes + """ + path = self._adjust_cwd(path) + t, msg = self._request(CMD_LSTAT, path) + if t != CMD_ATTRS: + raise SFTPError('Expected attributes') + return SFTPAttributes._from_msg(msg) + + def symlink(self, source, dest): + """ + Create a symbolic link (shortcut) of the C{source} path at + C{destination}. + + @param source: path of the original file. + @type source: string + @param dest: path of the newly created symlink. + @type dest: string + """ + dest = self._adjust_cwd(dest) + if type(source) is unicode: + source = source.encode('utf-8') + self._request(CMD_SYMLINK, source, dest) + + def chmod(self, path, mode): + """ + Change the mode (permissions) of a file. The permissions are + unix-style and identical to those used by python's C{os.chmod} + function. + + @param path: path of the file to change the permissions of. + @type path: string + @param mode: new permissions. + @type mode: int + """ + path = self._adjust_cwd(path) + attr = SFTPAttributes() + attr.st_mode = mode + self._request(CMD_SETSTAT, path, attr) + + def chown(self, path, uid, gid): + """ + Change the owner (C{uid}) and group (C{gid}) of a file. As with + python's C{os.chown} function, you must pass both arguments, so if you + only want to change one, use L{stat} first to retrieve the current + owner and group. + + @param path: path of the file to change the owner and group of. + @type path: string + @param uid: new owner's uid + @type uid: int + @param gid: new group id + @type gid: int + """ + path = self._adjust_cwd(path) + attr = SFTPAttributes() + attr.st_uid, attr.st_gid = uid, gid + self._request(CMD_SETSTAT, path, attr) + + def utime(self, path, times): + """ + Set the access and modified times of the file specified by C{path}. If + C{times} is C{None}, then the file's access and modified times are set + to the current time. Otherwise, C{times} must be a 2-tuple of numbers, + of the form C{(atime, mtime)}, which is used to set the access and + modified times, respectively. This bizarre API is mimicked from python + for the sake of consistency -- I apologize. + + @param path: path of the file to modify. + @type path: string + @param times: C{None} or a tuple of (access time, modified time) in + standard internet epoch time (seconds since 01 January 1970 GMT). + @type times: tuple of int + """ + path = self._adjust_cwd(path) + if times is None: + times = (time.time(), time.time()) + attr = SFTPAttributes() + attr.st_atime, attr.st_mtime = times + self._request(CMD_SETSTAT, path, attr) + + def readlink(self, path): + """ + Return the target of a symbolic link (shortcut). You can use + L{symlink} to create these. The result may be either an absolute or + relative pathname. + + @param path: path of the symbolic link file. + @type path: str + @return: target path. + @rtype: str + """ + path = self._adjust_cwd(path) + t, msg = self._request(CMD_READLINK, path) + if t != CMD_NAME: + raise SFTPError('Expected name response') + count = msg.get_int() + if count == 0: + return None + if count != 1: + raise SFTPError('Readlink returned %d results' % count) + return _to_unicode(msg.get_string()) + + def normalize(self, path): + """ + Return the normalized path (on the server) of a given path. This + can be used to quickly resolve symbolic links or determine what the + server is considering to be the "current folder" (by passing C{'.'} + as C{path}). + + @param path: path to be normalized. + @type path: str + @return: normalized form of the given path. + @rtype: str + + @raise IOError: if the path can't be resolved on the server + """ + path = self._adjust_cwd(path) + t, msg = self._request(CMD_REALPATH, path) + if t != CMD_NAME: + raise SFTPError('Expected name response') + count = msg.get_int() + if count != 1: + raise SFTPError('Realpath returned %d results' % count) + return _to_unicode(msg.get_string()) + + def chdir(self, path): + """ + Change the "current directory" of this SFTP session. Since SFTP + doesn't really have the concept of a current working directory, this + is emulated by paramiko. Once you use this method to set a working + directory, all operations on this SFTPClient object will be relative + to that path. + + @param path: new current working directory + @type path: str + + @raise IOError: if the requested path doesn't exist on the server + + @since: 1.4 + """ + self._cwd = self.normalize(path) + + def getcwd(self): + """ + Return the "current working directory" for this SFTP session, as + emulated by paramiko. If no directory has been set with L{chdir}, + this method will return C{None}. + + @return: the current working directory on the server, or C{None} + @rtype: str + + @since: 1.4 + """ + return self._cwd + + def put(self, localpath, remotepath): + """ + Copy a local file (C{localpath}) to the SFTP server as C{remotepath}. + Any exception raised by operations will be passed through. This + method is primarily provided as a convenience. + + The SFTP operations use pipelining for speed. + + @param localpath: the local file to copy + @type localpath: str + @param remotepath: the destination path on the SFTP server + @type remotepath: str + + @since: 1.4 + """ + fl = file(localpath, 'rb') + fr = self.file(remotepath, 'wb') + fr.set_pipelined(True) + size = 0 + while True: + data = fl.read(32768) + if len(data) == 0: + break + fr.write(data) + size += len(data) + fl.close() + fr.close() + s = self.stat(remotepath) + if s.st_size != size: + raise IOError('size mismatch in put! %d != %d' % (s.st_size, size)) + + def get(self, remotepath, localpath): + """ + Copy a remote file (C{remotepath}) from the SFTP server to the local + host as C{localpath}. Any exception raised by operations will be + passed through. This method is primarily provided as a convenience. + + @param remotepath: the remote file to copy + @type remotepath: str + @param localpath: the destination path on the local host + @type localpath: str + + @since: 1.4 + """ + fr = self.file(remotepath, 'rb') + fr.prefetch() + fl = file(localpath, 'wb') + size = 0 + while True: + data = fr.read(32768) + if len(data) == 0: + break + fl.write(data) + size += len(data) + fl.close() + fr.close() + s = os.stat(localpath) + if s.st_size != size: + raise IOError('size mismatch in get! %d != %d' % (s.st_size, size)) + + + ### internals... + + + def _request(self, t, *arg): + num = self._async_request(type(None), t, *arg) + return self._read_response(num) + + def _async_request(self, fileobj, t, *arg): + # this method may be called from other threads (prefetch) + self._lock.acquire() + try: + msg = Message() + msg.add_int(self.request_number) + for item in arg: + if type(item) is int: + msg.add_int(item) + elif type(item) is long: + msg.add_int64(item) + elif type(item) is str: + msg.add_string(item) + elif type(item) is SFTPAttributes: + item._pack(msg) + else: + raise Exception('unknown type for %r type %r' % (item, type(item))) + num = self.request_number + self._expecting[num] = fileobj + self._send_packet(t, str(msg)) + self.request_number += 1 + finally: + self._lock.release() + return num + + def _read_response(self, waitfor=None): + while True: + t, data = self._read_packet() + msg = Message(data) + num = msg.get_int() + if num not in self._expecting: + # might be response for a file that was closed before responses came back + self._log(DEBUG, 'Unexpected response #%d' % (num,)) + if waitfor is None: + # just doing a single check + return + continue + fileobj = self._expecting[num] + del self._expecting[num] + if num == waitfor: + # synchronous + if t == CMD_STATUS: + self._convert_status(msg) + return t, msg + if fileobj is not type(None): + fileobj._async_response(t, msg) + if waitfor is None: + # just doing a single check + return + + def _finish_responses(self, fileobj): + while fileobj in self._expecting.values(): + self._read_response() + fileobj._check_exception() + + def _convert_status(self, msg): + """ + Raises EOFError or IOError on error status; otherwise does nothing. + """ + code = msg.get_int() + text = msg.get_string() + if code == SFTP_OK: + return + elif code == SFTP_EOF: + raise EOFError(text) + elif code == SFTP_NO_SUCH_FILE: + # clever idea from john a. meinel: map the error codes to errno + raise IOError(errno.ENOENT, text) + elif code == SFTP_PERMISSION_DENIED: + raise IOError(errno.EACCES, text) + else: + raise IOError(text) + + def _adjust_cwd(self, path): + """ + Return an adjusted path if we're emulating a "current working + directory" for the server. + """ + if type(path) is unicode: + path = path.encode('utf-8') + if self._cwd is None: + return path + if (len(path) > 0) and (path[0] == '/'): + # absolute path + return path + return self._cwd + '/' + path + + +class SFTP (SFTPClient): + "an alias for L{SFTPClient} for backwards compatability" + pass diff --git a/paramiko/sftp_file.py b/paramiko/sftp_file.py new file mode 100644 index 0000000..f224f02 --- /dev/null +++ b/paramiko/sftp_file.py @@ -0,0 +1,307 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +L{SFTPFile} +""" + +import threading +from paramiko.common import * +from paramiko.sftp import * +from paramiko.file import BufferedFile +from paramiko.sftp_attr import SFTPAttributes + + +class SFTPFile (BufferedFile): + """ + Proxy object for a file on the remote server, in client mode SFTP. + """ + + # Some sftp servers will choke if you send read/write requests larger than + # this size. + MAX_REQUEST_SIZE = 32768 + + def __init__(self, sftp, handle, mode='r', bufsize=-1): + BufferedFile.__init__(self) + self.sftp = sftp + self.handle = handle + BufferedFile._set_mode(self, mode, bufsize) + self.pipelined = False + self._prefetching = False + self._saved_exception = None + + def __del__(self): + self.close(_async=True) + + def close(self, _async=False): + # We allow double-close without signaling an error, because real + # Python file objects do. However, we must protect against actually + # sending multiple CMD_CLOSE packets, because after we close our + # handle, the same handle may be re-allocated by the server, and we + # may end up mysteriously closing some random other file. (This is + # especially important because we unconditionally call close() from + # __del__.) + if self._closed: + return + if self.pipelined: + self.sftp._finish_responses(self) + BufferedFile.close(self) + try: + if _async: + # GC'd file handle could be called from an arbitrary thread -- don't wait for a response + self.sftp._async_request(type(None), CMD_CLOSE, self.handle) + else: + self.sftp._request(CMD_CLOSE, self.handle) + except EOFError: + # may have outlived the Transport connection + pass + except IOError: + # may have outlived the Transport connection + pass + + def _read_prefetch(self, size): + # while not closed, and haven't fetched past the current position, and haven't reached EOF... + while (self._prefetch_so_far <= self._realpos) and \ + (self._prefetch_so_far < self._prefetch_size) and not self._closed: + self.sftp._read_response() + self._check_exception() + k = self._prefetch_data.keys() + k.sort() + while (len(k) > 0) and (k[0] + len(self._prefetch_data[k[0]]) <= self._realpos): + # done with that block + del self._prefetch_data[k[0]] + k.pop(0) + if len(k) == 0: + self._prefetching = False + return '' + assert k[0] <= self._realpos + buf_offset = self._realpos - k[0] + buf_length = len(self._prefetch_data[k[0]]) - buf_offset + return self._prefetch_data[k[0]][buf_offset : buf_offset + buf_length] + + def _read(self, size): + size = min(size, self.MAX_REQUEST_SIZE) + if self._prefetching: + return self._read_prefetch(size) + t, msg = self.sftp._request(CMD_READ, self.handle, long(self._realpos), int(size)) + if t != CMD_DATA: + raise SFTPError('Expected data') + return msg.get_string() + + def _write(self, data): + # may write less than requested if it would exceed max packet size + chunk = min(len(data), self.MAX_REQUEST_SIZE) + req = self.sftp._async_request(type(None), CMD_WRITE, self.handle, long(self._realpos), + str(data[:chunk])) + if not self.pipelined or self.sftp.sock.recv_ready(): + t, msg = self.sftp._read_response(req) + if t != CMD_STATUS: + raise SFTPError('Expected status') + # convert_status already called + return chunk + + def settimeout(self, timeout): + """ + Set a timeout on read/write operations on the underlying socket or + ssh L{Channel}. + + @see: L{Channel.settimeout} + @param timeout: seconds to wait for a pending read/write operation + before raising C{socket.timeout}, or C{None} for no timeout + @type timeout: float + """ + self.sftp.sock.settimeout(timeout) + + def gettimeout(self): + """ + Returns the timeout in seconds (as a float) associated with the socket + or ssh L{Channel} used for this file. + + @see: L{Channel.gettimeout} + @rtype: float + """ + return self.sftp.sock.gettimeout() + + def setblocking(self, blocking): + """ + Set blocking or non-blocking mode on the underiying socket or ssh + L{Channel}. + + @see: L{Channel.setblocking} + @param blocking: 0 to set non-blocking mode; non-0 to set blocking + mode. + @type blocking: int + """ + self.sftp.sock.setblocking(blocking) + + def seek(self, offset, whence=0): + self.flush() + if whence == self.SEEK_SET: + self._realpos = self._pos = offset + elif whence == self.SEEK_CUR: + self._pos += offset + self._realpos = self._pos + else: + self._realpos = self._pos = self._get_size() + offset + self._rbuffer = '' + + def stat(self): + """ + Retrieve information about this file from the remote system. This is + exactly like L{SFTP.stat}, except that it operates on an already-open + file. + + @return: an object containing attributes about this file. + @rtype: SFTPAttributes + """ + t, msg = self.sftp._request(CMD_FSTAT, self.handle) + if t != CMD_ATTRS: + raise SFTPError('Expected attributes') + return SFTPAttributes._from_msg(msg) + + def check(self, hash_algorithm, offset=0, length=0, block_size=0): + """ + Ask the server for a hash of a section of this file. This can be used + to verify a successful upload or download, or for various rsync-like + operations. + + The file is hashed from C{offset}, for C{length} bytes. If C{length} + is 0, the remainder of the file is hashed. Thus, if both C{offset} + and C{length} are zero, the entire file is hashed. + + Normally, C{block_size} will be 0 (the default), and this method will + return a byte string representing the requested hash (for example, a + string of length 16 for MD5, or 20 for SHA-1). If a non-zero + C{block_size} is given, each chunk of the file (from C{offset} to + C{offset + length}) of C{block_size} bytes is computed as a separate + hash. The hash results are all concatenated and returned as a single + string. + + For example, C{check('sha1', 0, 1024, 512)} will return a string of + length 40. The first 20 bytes will be the SHA-1 of the first 512 bytes + of the file, and the last 20 bytes will be the SHA-1 of the next 512 + bytes. + + @param hash_algorithm: the name of the hash algorithm to use (normally + C{"sha1"} or C{"md5"}) + @type hash_algorithm: str + @param offset: offset into the file to begin hashing (0 means to start + from the beginning) + @type offset: int or long + @param length: number of bytes to hash (0 means continue to the end of + the file) + @type length: int or long + @param block_size: number of bytes to hash per result (must not be less + than 256; 0 means to compute only one hash of the entire segment) + @type block_size: int + @return: string of bytes representing the hash of each block, + concatenated together + @rtype: str + + @note: Many (most?) servers don't support this extension yet. + + @raise IOError: if the server doesn't support the "check-file" + extension, or possibly doesn't support the hash algorithm + requested + + @since: 1.4 + """ + t, msg = self.sftp._request(CMD_EXTENDED, 'check-file', self.handle, + hash_algorithm, long(offset), long(length), block_size) + ext = msg.get_string() + alg = msg.get_string() + data = msg.get_remainder() + return data + + def set_pipelined(self, pipelined=True): + """ + Turn on/off the pipelining of write operations to this file. When + pipelining is on, paramiko won't wait for the server response after + each write operation. Instead, they're collected as they come in. + At the first non-write operation (including L{close}), all remaining + server responses are collected. This means that if there was an error + with one of your later writes, an exception might be thrown from + within L{close} instead of L{write}. + + By default, files are I{not} pipelined. + + @param pipelined: C{True} if pipelining should be turned on for this + file; C{False} otherwise + @type pipelined: bool + + @since: 1.5 + """ + self.pipelined = pipelined + + def prefetch(self): + """ + Pre-fetch the remaining contents of this file in anticipation of + future L{read} calls. If reading the entire file, pre-fetching can + dramatically improve the download speed by avoiding roundtrip latency. + The file's contents are incrementally buffered in a background thread. + + @since: 1.5.1 + """ + size = self.stat().st_size + # queue up async reads for the rest of the file + self._prefetching = True + self._prefetch_so_far = self._realpos + self._prefetch_size = size + self._prefetch_data = {} + t = threading.Thread(target=self._prefetch) + t.setDaemon(True) + t.start() + + def _prefetch(self): + n = self._realpos + size = self._prefetch_size + while n < size: + chunk = min(self.MAX_REQUEST_SIZE, size - n) + self.sftp._async_request(self, CMD_READ, self.handle, long(n), int(chunk)) + n += chunk + + + ### internals... + + + def _get_size(self): + try: + return self.stat().st_size + except: + return 0 + + def _async_response(self, t, msg): + if t == CMD_STATUS: + # save exception and re-raise it on next file operation + try: + self.sftp._convert_status(msg) + except Exception, x: + self._saved_exception = x + return + if t != CMD_DATA: + raise SFTPError('Expected data') + data = msg.get_string() + self._prefetch_data[self._prefetch_so_far] = data + self._prefetch_so_far += len(data) + + def _check_exception(self): + "if there's a saved exception, raise & clear it" + if self._saved_exception is not None: + x = self._saved_exception + self._saved_exception = None + raise x diff --git a/paramiko/sftp_handle.py b/paramiko/sftp_handle.py new file mode 100644 index 0000000..e1d93e9 --- /dev/null +++ b/paramiko/sftp_handle.py @@ -0,0 +1,188 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +Abstraction of an SFTP file handle (for server mode). +""" + +import os + +from paramiko.common import * +from paramiko.sftp import * + + +class SFTPHandle (object): + """ + Abstract object representing a handle to an open file (or folder) in an + SFTP server implementation. Each handle has a string representation used + by the client to refer to the underlying file. + + Server implementations can (and should) subclass SFTPHandle to implement + features of a file handle, like L{stat} or L{chattr}. + """ + def __init__(self): + self.__name = None + # only for handles to folders: + self.__files = { } + self.__tell = None + + def close(self): + """ + When a client closes a file, this method is called on the handle. + Normally you would use this method to close the underlying OS level + file object(s). + + The default implementation checks for attributes on C{self} named + C{readfile} and/or C{writefile}, and if either or both are present, + their C{close()} methods are called. This means that if you are + using the default implementations of L{read} and L{write}, this + method's default implementation should be fine also. + """ + readfile = getattr(self, 'readfile', None) + if readfile is not None: + readfile.close() + writefile = getattr(self, 'writefile', None) + if writefile is not None: + writefile.close() + + def read(self, offset, length): + """ + Read up to C{length} bytes from this file, starting at position + C{offset}. The offset may be a python long, since SFTP allows it + to be 64 bits. + + If the end of the file has been reached, this method may return an + empty string to signify EOF, or it may also return L{SFTP_EOF}. + + The default implementation checks for an attribute on C{self} named + C{readfile}, and if present, performs the read operation on the python + file-like object found there. (This is meant as a time saver for the + common case where you are wrapping a python file object.) + + @param offset: position in the file to start reading from. + @type offset: int or long + @param length: number of bytes to attempt to read. + @type length: int + @return: data read from the file, or an SFTP error code. + @rtype: str + """ + if not hasattr(self, 'readfile') or (self.readfile is None): + return SFTP_OP_UNSUPPORTED + try: + if self.__tell is None: + self.__tell = self.readfile.tell() + if offset != self.__tell: + self.readfile.seek(offset) + self.__tell = offset + data = self.readfile.read(length) + except IOError, e: + self.__tell = None + return SFTPServer.convert_errno(e.errno) + self.__tell += len(data) + return data + + def write(self, offset, data): + """ + Write C{data} into this file at position C{offset}. Extending the + file past its original end is expected. Unlike python's normal + C{write()} methods, this method cannot do a partial write: it must + write all of C{data} or else return an error. + + The default implementation checks for an attribute on C{self} named + C{writefile}, and if present, performs the write operation on the + python file-like object found there. The attribute is named + differently from C{readfile} to make it easy to implement read-only + (or write-only) files, but if both attributes are present, they should + refer to the same file. + + @param offset: position in the file to start reading from. + @type offset: int or long + @param data: data to write into the file. + @type data: str + @return: an SFTP error code like L{SFTP_OK}. + """ + if not hasattr(self, 'writefile') or (self.writefile is None): + return SFTP_OP_UNSUPPORTED + try: + if self.__tell is None: + self.__tell = self.writefile.tell() + if offset != self.__tell: + self.writefile.seek(offset) + self.__tell = offset + self.writefile.write(data) + self.writefile.flush() + except IOError, e: + self.__tell = None + return SFTPServer.convert_errno(e.errno) + self.__tell += len(data) + return SFTP_OK + + def stat(self): + """ + Return an L{SFTPAttributes} object referring to this open file, or an + error code. This is equivalent to L{SFTPServerInterface.stat}, except + it's called on an open file instead of a path. + + @return: an attributes object for the given file, or an SFTP error + code (like L{SFTP_PERMISSION_DENIED}). + @rtype: L{SFTPAttributes} I{or error code} + """ + return SFTP_OP_UNSUPPORTED + + def chattr(self, attr): + """ + Change the attributes of this file. The C{attr} object will contain + only those fields provided by the client in its request, so you should + check for the presence of fields before using them. + + @param attr: the attributes to change on this file. + @type attr: L{SFTPAttributes} + @return: an error code like L{SFTP_OK}. + @rtype: int + """ + return SFTP_OP_UNSUPPORTED + + + ### internals... + + + def _set_files(self, files): + """ + Used by the SFTP server code to cache a directory listing. (In + the SFTP protocol, listing a directory is a multi-stage process + requiring a temporary handle.) + """ + self.__files = files + + def _get_next_files(self): + """ + Used by the SFTP server code to retreive a cached directory + listing. + """ + fnlist = self.__files[:16] + self.__files = self.__files[16:] + return fnlist + + def _get_name(self): + return self.__name + + def _set_name(self, name): + self.__name = name + + +from paramiko.sftp_server import SFTPServer diff --git a/paramiko/sftp_server.py b/paramiko/sftp_server.py new file mode 100644 index 0000000..5905843 --- /dev/null +++ b/paramiko/sftp_server.py @@ -0,0 +1,420 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +Server-mode SFTP support. +""" + +import os +import errno + +from Crypto.Hash import MD5, SHA +from paramiko.common import * +from paramiko.server import SubsystemHandler +from paramiko.sftp import * +from paramiko.sftp_si import * +from paramiko.sftp_attr import * + + +# known hash algorithms for the "check-file" extension +_hash_class = { + 'sha1': SHA, + 'md5': MD5, +} + + +class SFTPServer (BaseSFTP, SubsystemHandler): + """ + Server-side SFTP subsystem support. Since this is a L{SubsystemHandler}, + it can be (and is meant to be) set as the handler for C{"sftp"} requests. + Use L{Transport.set_subsystem_handler} to activate this class. + """ + + def __init__(self, channel, name, server, sftp_si=SFTPServerInterface, *largs, **kwargs): + """ + The constructor for SFTPServer is meant to be called from within the + L{Transport} as a subsystem handler. C{server} and any additional + parameters or keyword parameters are passed from the original call to + L{Transport.set_subsystem_handler}. + + @param channel: channel passed from the L{Transport}. + @type channel: L{Channel} + @param name: name of the requested subsystem. + @type name: str + @param server: the server object associated with this channel and + subsystem + @type server: L{ServerInterface} + @param sftp_si: a subclass of L{SFTPServerInterface} to use for handling + individual requests. + @type sftp_si: class + """ + BaseSFTP.__init__(self) + SubsystemHandler.__init__(self, channel, name, server) + transport = channel.get_transport() + self.logger = util.get_logger(transport.get_log_channel() + '.' + + channel.get_name() + '.sftp') + self.ultra_debug = transport.get_hexdump() + self.next_handle = 1 + # map of handle-string to SFTPHandle for files & folders: + self.file_table = { } + self.folder_table = { } + self.server = sftp_si(server, *largs, **kwargs) + + def start_subsystem(self, name, transport, channel): + self.sock = channel + self._log(DEBUG, 'Started sftp server on channel %s' % repr(channel)) + self._send_server_version() + self.server.session_started() + while True: + try: + t, data = self._read_packet() + except EOFError: + self._log(DEBUG, 'EOF -- end of session') + return + except Exception, e: + self._log(DEBUG, 'Exception on channel: ' + str(e)) + self._log(DEBUG, util.tb_strings()) + return + msg = Message(data) + request_number = msg.get_int() + self._process(t, request_number, msg) + + def finish_subsystem(self): + self.server.session_ended() + # close any file handles that were left open (so we can return them to the OS quickly) + for f in self.file_table.itervalues(): + f.close() + for f in self.folder_table.itervalues(): + f.close() + self.file_table = {} + self.folder_table = {} + + def convert_errno(e): + """ + Convert an errno value (as from an C{OSError} or C{IOError}) into a + standard SFTP result code. This is a convenience function for trapping + exceptions in server code and returning an appropriate result. + + @param e: an errno code, as from C{OSError.errno}. + @type e: int + @return: an SFTP error code like L{SFTP_NO_SUCH_FILE}. + @rtype: int + """ + if e == errno.EACCES: + # permission denied + return SFTP_PERMISSION_DENIED + elif e == errno.ENOENT: + # no such file + return SFTP_NO_SUCH_FILE + else: + return SFTP_FAILURE + convert_errno = staticmethod(convert_errno) + + def set_file_attr(filename, attr): + """ + Change a file's attributes on the local filesystem. The contents of + C{attr} are used to change the permissions, owner, group ownership, + and/or modification & access time of the file, depending on which + attributes are present in C{attr}. + + This is meant to be a handy helper function for translating SFTP file + requests into local file operations. + + @param filename: name of the file to alter (should usually be an + absolute path). + @type filename: str + @param attr: attributes to change. + @type attr: L{SFTPAttributes} + """ + if attr._flags & attr.FLAG_PERMISSIONS: + os.chmod(filename, attr.st_mode) + if attr._flags & attr.FLAG_UIDGID: + os.chown(filename, attr.st_uid, attr.st_gid) + if attr._flags & attr.FLAG_AMTIME: + os.utime(filename, (attr.st_atime, attr.st_mtime)) + set_file_attr = staticmethod(set_file_attr) + + + ### internals... + + + def _response(self, request_number, t, *arg): + msg = Message() + msg.add_int(request_number) + for item in arg: + if type(item) is int: + msg.add_int(item) + elif type(item) is long: + msg.add_int64(item) + elif type(item) is str: + msg.add_string(item) + elif type(item) is SFTPAttributes: + item._pack(msg) + else: + raise Exception('unknown type for ' + repr(item) + ' type ' + repr(type(item))) + self._send_packet(t, str(msg)) + + def _send_handle_response(self, request_number, handle, folder=False): + if not issubclass(type(handle), SFTPHandle): + # must be error code + self._send_status(request_number, handle) + return + handle._set_name('hx%d' % self.next_handle) + self.next_handle += 1 + if folder: + self.folder_table[handle._get_name()] = handle + else: + self.file_table[handle._get_name()] = handle + self._response(request_number, CMD_HANDLE, handle._get_name()) + + def _send_status(self, request_number, code, desc=None): + if desc is None: + desc = SFTP_DESC[code] + self._response(request_number, CMD_STATUS, code, desc) + + def _open_folder(self, request_number, path): + resp = self.server.list_folder(path) + if issubclass(type(resp), list): + # got an actual list of filenames in the folder + folder = SFTPHandle() + folder._set_files(resp) + self._send_handle_response(request_number, folder, True) + return + # must be an error code + self._send_status(request_number, resp) + + def _read_folder(self, request_number, folder): + flist = folder._get_next_files() + if len(flist) == 0: + self._send_status(request_number, SFTP_EOF) + return + msg = Message() + msg.add_int(request_number) + msg.add_int(len(flist)) + for attr in flist: + msg.add_string(attr.filename) + msg.add_string(str(attr)) + attr._pack(msg) + self._send_packet(CMD_NAME, str(msg)) + + def _check_file(self, request_number, msg): + # this extension actually comes from v6 protocol, but since it's an + # extension, i feel like we can reasonably support it backported. + # it's very useful for verifying uploaded files or checking for + # rsync-like differences between local and remote files. + handle = msg.get_string() + alg_list = msg.get_list() + start = msg.get_int64() + length = msg.get_int64() + block_size = msg.get_int() + if not self.file_table.has_key(handle): + self._send_status(request_number, SFTP_BAD_MESSAGE, 'Invalid handle') + return + f = self.file_table[handle] + for x in alg_list: + if x in _hash_class: + algname = x + alg = _hash_class[x] + break + else: + self._send_status(request_number, SFTP_FAILURE, 'No supported hash types found') + return + if length == 0: + st = f.stat() + if not issubclass(type(st), SFTPAttributes): + self._send_status(request_number, st, 'Unable to stat file') + return + length = st.st_size - start + if block_size == 0: + block_size = length + if block_size < 256: + self._send_status(request_number, SFTP_FAILURE, 'Block size too small') + return + + sum = '' + offset = start + while offset < start + length: + blocklen = min(block_size, start + length - offset) + # don't try to read more than about 64KB at a time + chunklen = min(blocklen, 65536) + count = 0 + hash = alg.new() + while count < blocklen: + data = f.read(offset, chunklen) + if not type(data) is str: + self._send_status(request_number, data, 'Unable to hash file') + return + hash.update(data) + count += len(data) + offset += count + sum += hash.digest() + + msg = Message() + msg.add_int(request_number) + msg.add_string('check-file') + msg.add_string(algname) + msg.add_bytes(sum) + self._send_packet(CMD_EXTENDED_REPLY, str(msg)) + + def _convert_pflags(self, pflags): + "convert SFTP-style open() flags to python's os.open() flags" + if (pflags & SFTP_FLAG_READ) and (pflags & SFTP_FLAG_WRITE): + flags = os.O_RDWR + elif pflags & SFTP_FLAG_WRITE: + flags = os.O_WRONLY + else: + flags = os.O_RDONLY + if pflags & SFTP_FLAG_APPEND: + flags |= os.O_APPEND + if pflags & SFTP_FLAG_CREATE: + flags |= os.O_CREAT + if pflags & SFTP_FLAG_TRUNC: + flags |= os.O_TRUNC + if pflags & SFTP_FLAG_EXCL: + flags |= os.O_EXCL + return flags + + def _process(self, t, request_number, msg): + self._log(DEBUG, 'Request: %s' % CMD_NAMES[t]) + if t == CMD_OPEN: + path = msg.get_string() + flags = self._convert_pflags(msg.get_int()) + attr = SFTPAttributes._from_msg(msg) + self._send_handle_response(request_number, self.server.open(path, flags, attr)) + elif t == CMD_CLOSE: + handle = msg.get_string() + if self.folder_table.has_key(handle): + del self.folder_table[handle] + self._send_status(request_number, SFTP_OK) + return + if self.file_table.has_key(handle): + self.file_table[handle].close() + del self.file_table[handle] + self._send_status(request_number, SFTP_OK) + return + self._send_status(request_number, SFTP_BAD_MESSAGE, 'Invalid handle') + elif t == CMD_READ: + handle = msg.get_string() + offset = msg.get_int64() + length = msg.get_int() + if not self.file_table.has_key(handle): + self._send_status(request_number, SFTP_BAD_MESSAGE, 'Invalid handle') + return + data = self.file_table[handle].read(offset, length) + if type(data) is str: + if len(data) == 0: + self._send_status(request_number, SFTP_EOF) + else: + self._response(request_number, CMD_DATA, data) + else: + self._send_status(request_number, data) + elif t == CMD_WRITE: + handle = msg.get_string() + offset = msg.get_int64() + data = msg.get_string() + if not self.file_table.has_key(handle): + self._send_status(request_number, SFTP_BAD_MESSAGE, 'Invalid handle') + return + self._send_status(request_number, self.file_table[handle].write(offset, data)) + elif t == CMD_REMOVE: + path = msg.get_string() + self._send_status(request_number, self.server.remove(path)) + elif t == CMD_RENAME: + oldpath = msg.get_string() + newpath = msg.get_string() + self._send_status(request_number, self.server.rename(oldpath, newpath)) + elif t == CMD_MKDIR: + path = msg.get_string() + attr = SFTPAttributes._from_msg(msg) + self._send_status(request_number, self.server.mkdir(path, attr)) + elif t == CMD_RMDIR: + path = msg.get_string() + self._send_status(request_number, self.server.rmdir(path)) + elif t == CMD_OPENDIR: + path = msg.get_string() + self._open_folder(request_number, path) + return + elif t == CMD_READDIR: + handle = msg.get_string() + if not self.folder_table.has_key(handle): + self._send_status(request_number, SFTP_BAD_MESSAGE, 'Invalid handle') + return + folder = self.folder_table[handle] + self._read_folder(request_number, folder) + elif t == CMD_STAT: + path = msg.get_string() + resp = self.server.stat(path) + if issubclass(type(resp), SFTPAttributes): + self._response(request_number, CMD_ATTRS, resp) + else: + self._send_status(request_number, resp) + elif t == CMD_LSTAT: + path = msg.get_string() + resp = self.server.lstat(path) + if issubclass(type(resp), SFTPAttributes): + self._response(request_number, CMD_ATTRS, resp) + else: + self._send_status(request_number, resp) + elif t == CMD_FSTAT: + handle = msg.get_string() + if not self.file_table.has_key(handle): + self._send_status(request_number, SFTP_BAD_MESSAGE, 'Invalid handle') + return + resp = self.file_table[handle].stat() + if issubclass(type(resp), SFTPAttributes): + self._response(request_number, CMD_ATTRS, resp) + else: + self._send_status(request_number, resp) + elif t == CMD_SETSTAT: + path = msg.get_string() + attr = SFTPAttributes._from_msg(msg) + self._send_status(request_number, self.server.chattr(path, attr)) + elif t == CMD_FSETSTAT: + handle = msg.get_string() + attr = SFTPAttributes._from_msg(msg) + if not self.file_table.has_key(handle): + self._response(request_number, SFTP_BAD_MESSAGE, 'Invalid handle') + return + self._send_status(request_number, self.file_table[handle].chattr(attr)) + elif t == CMD_READLINK: + path = msg.get_string() + resp = self.server.readlink(path) + if type(resp) is str: + self._response(request_number, CMD_NAME, 1, resp, '', SFTPAttributes()) + else: + self._send_status(request_number, resp) + elif t == CMD_SYMLINK: + # the sftp 2 draft is incorrect here! path always follows target_path + target_path = msg.get_string() + path = msg.get_string() + self._send_status(request_number, self.server.symlink(target_path, path)) + elif t == CMD_REALPATH: + path = msg.get_string() + rpath = self.server.canonicalize(path) + self._response(request_number, CMD_NAME, 1, rpath, '', SFTPAttributes()) + elif t == CMD_EXTENDED: + tag = msg.get_string() + if tag == 'check-file': + self._check_file(request_number, msg) + else: + send._send_status(request_number, SFTP_OP_UNSUPPORTED) + else: + self._send_status(request_number, SFTP_OP_UNSUPPORTED) + + +from paramiko.sftp_handle import SFTPHandle diff --git a/paramiko/sftp_si.py b/paramiko/sftp_si.py new file mode 100644 index 0000000..16005d4 --- /dev/null +++ b/paramiko/sftp_si.py @@ -0,0 +1,303 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +L{SFTPServerInterface} is an interface to override for SFTP server support. +""" + +import os + +from paramiko.common import * +from paramiko.sftp import * + + +class SFTPServerInterface (object): + """ + This class defines an interface for controlling the behavior of paramiko + when using the L{SFTPServer} subsystem to provide an SFTP server. + + Methods on this class are called from the SFTP session's thread, so you can + block as long as necessary without affecting other sessions (even other + SFTP sessions). However, raising an exception will usually cause the SFTP + session to abruptly end, so you will usually want to catch exceptions and + return an appropriate error code. + """ + + def __init__ (self, server, *largs, **kwargs): + """ + Create a new SFTPServerInterface object. This method does nothing by + default and is meant to be overridden by subclasses. + + @param server: the server object associated with this channel and + SFTP subsystem + @type server: L{ServerInterface} + """ + super(SFTPServerInterface, self).__init__(*largs, **kwargs) + + def session_started(self): + """ + The SFTP server session has just started. This method is meant to be + overridden to perform any necessary setup before handling callbacks + from SFTP operations. + """ + pass + + def session_ended(self): + """ + The SFTP server session has just ended, either cleanly or via an + exception. This method is meant to be overridden to perform any + necessary cleanup before this C{SFTPServerInterface} object is + destroyed. + """ + pass + + def open(self, path, flags, attr): + """ + Open a file on the server and create a handle for future operations + on that file. On success, a new object subclassed from L{SFTPHandle} + should be returned. This handle will be used for future operations + on the file (read, write, etc). On failure, an error code such as + L{SFTP_PERMISSION_DENIED} should be returned. + + C{flags} contains the requested mode for opening (read-only, + write-append, etc) as a bitset of flags from the C{os} module: + - C{os.O_RDONLY} + - C{os.O_WRONLY} + - C{os.O_RDWR} + - C{os.O_APPEND} + - C{os.O_CREAT} + - C{os.O_TRUNC} + - C{os.O_EXCL} + (One of C{os.O_RDONLY}, C{os.O_WRONLY}, or C{os.O_RDWR} will always + be set.) + + The C{attr} object contains requested attributes of the file if it + has to be created. Some or all attribute fields may be missing if + the client didn't specify them. + + @note: The SFTP protocol defines all files to be in "binary" mode. + There is no equivalent to python's "text" mode. + + @param path: the requested path (relative or absolute) of the file + to be opened. + @type path: str + @param flags: flags or'd together from the C{os} module indicating the + requested mode for opening the file. + @type flags: int + @param attr: requested attributes of the file if it is newly created. + @type attr: L{SFTPAttributes} + @return: a new L{SFTPHandle} I{or error code}. + @rtype L{SFTPHandle} + """ + return SFTP_OP_UNSUPPORTED + + def list_folder(self, path): + """ + Return a list of files within a given folder. The C{path} will use + posix notation (C{"/"} separates folder names) and may be an absolute + or relative path. + + The list of files is expected to be a list of L{SFTPAttributes} + objects, which are similar in structure to the objects returned by + C{os.stat}. In addition, each object should have its C{filename} + field filled in, since this is important to a directory listing and + not normally present in C{os.stat} results. The method + L{SFTPAttributes.from_stat} will usually do what you want. + + In case of an error, you should return one of the C{SFTP_*} error + codes, such as L{SFTP_PERMISSION_DENIED}. + + @param path: the requested path (relative or absolute) to be listed. + @type path: str + @return: a list of the files in the given folder, using + L{SFTPAttributes} objects. + @rtype: list of L{SFTPAttributes} I{or error code} + + @note: You should normalize the given C{path} first (see the + C{os.path} module) and check appropriate permissions before returning + the list of files. Be careful of malicious clients attempting to use + relative paths to escape restricted folders, if you're doing a direct + translation from the SFTP server path to your local filesystem. + """ + return SFTP_OP_UNSUPPORTED + + def stat(self, path): + """ + Return an L{SFTPAttributes} object for a path on the server, or an + error code. If your server supports symbolic links (also known as + "aliases"), you should follow them. (L{lstat} is the corresponding + call that doesn't follow symlinks/aliases.) + + @param path: the requested path (relative or absolute) to fetch + file statistics for. + @type path: str + @return: an attributes object for the given file, or an SFTP error + code (like L{SFTP_PERMISSION_DENIED}). + @rtype: L{SFTPAttributes} I{or error code} + """ + return SFTP_OP_UNSUPPORTED + + def lstat(self, path): + """ + Return an L{SFTPAttributes} object for a path on the server, or an + error code. If your server supports symbolic links (also known as + "aliases"), you should I{not} follow them -- instead, you should + return data on the symlink or alias itself. (L{stat} is the + corresponding call that follows symlinks/aliases.) + + @param path: the requested path (relative or absolute) to fetch + file statistics for. + @type path: str + @return: an attributes object for the given file, or an SFTP error + code (like L{SFTP_PERMISSION_DENIED}). + @rtype: L{SFTPAttributes} I{or error code} + """ + return SFTP_OP_UNSUPPORTED + + def remove(self, path): + """ + Delete a file, if possible. + + @param path: the requested path (relative or absolute) of the file + to delete. + @type path: str + @return: an SFTP error code like L{SFTP_OK}. + @rtype: int + """ + return SFTP_OP_UNSUPPORTED + + def rename(self, oldpath, newpath): + """ + Rename (or move) a file. The SFTP specification implies that this + method can be used to move an existing file into a different folder, + and since there's no other (easy) way to move files via SFTP, it's + probably a good idea to implement "move" in this method too, even for + files that cross disk partition boundaries, if at all possible. + + @note: You should return an error if a file with the same name as + C{newpath} already exists. (The rename operation should be + non-desctructive.) + + @param oldpath: the requested path (relative or absolute) of the + existing file. + @type oldpath: str + @param newpath: the requested new path of the file. + @type newpath: str + @return: an SFTP error code like L{SFTP_OK}. + @rtype: int + """ + return SFTP_OP_UNSUPPORTED + + def mkdir(self, path, attr): + """ + Create a new directory with the given attributes. The C{attr} + object may be considered a "hint" and ignored. + + The C{attr} object will contain only those fields provided by the + client in its request, so you should use C{hasattr} to check for + the presense of fields before using them. In some cases, the C{attr} + object may be completely empty. + + @param path: requested path (relative or absolute) of the new + folder. + @type path: str + @param attr: requested attributes of the new folder. + @type attr: L{SFTPAttributes} + @return: an SFTP error code like L{SFTP_OK}. + @rtype: int + """ + return SFTP_OP_UNSUPPORTED + + def rmdir(self, path): + """ + Remove a directory if it exists. The C{path} should refer to an + existing, empty folder -- otherwise this method should return an + error. + + @param path: requested path (relative or absolute) of the folder + to remove. + @type path: str + @return: an SFTP error code like L{SFTP_OK}. + @rtype: int + """ + return SFTP_OP_UNSUPPORTED + + def chattr(self, path, attr): + """ + Change the attributes of a file. The C{attr} object will contain + only those fields provided by the client in its request, so you + should check for the presence of fields before using them. + + @param path: requested path (relative or absolute) of the file to + change. + @type path: str + @param attr: requested attributes to change on the file. + @type attr: L{SFTPAttributes} + @return: an error code like L{SFTP_OK}. + @rtype: int + """ + return SFTP_OP_UNSUPPORTED + + def canonicalize(self, path): + """ + Return the canonical form of a path on the server. For example, + if the server's home folder is C{/home/foo}, the path + C{"../betty"} would be canonicalized to C{"/home/betty"}. Note + the obvious security issues: if you're serving files only from a + specific folder, you probably don't want this method to reveal path + names outside that folder. + + You may find the python methods in C{os.path} useful, especially + C{os.path.normpath} and C{os.path.realpath}. + + The default implementation returns C{os.path.normpath('/' + path)}. + """ + if os.path.isabs(path): + return os.path.normpath(path) + else: + return os.path.normpath('/' + path) + + def readlink(self, path): + """ + Return the target of a symbolic link (or shortcut) on the server. + If the specified path doesn't refer to a symbolic link, an error + should be returned. + + @param path: path (relative or absolute) of the symbolic link. + @type path: str + @return: the target path of the symbolic link, or an error code like + L{SFTP_NO_SUCH_FILE}. + @rtype: str I{or error code} + """ + return SFTP_OP_UNSUPPORTED + + def symlink(self, target_path, path): + """ + Create a symbolic link on the server, as new pathname C{path}, + with C{target_path} as the target of the link. + + @param target_path: path (relative or absolute) of the target for + this new symbolic link. + @type target_path: str + @param path: path (relative or absolute) of the symbolic link to + create. + @type path: str + @return: an error code like C{SFTP_OK}. + @rtype: int + """ + return SFTP_OP_UNSUPPORTED diff --git a/paramiko/ssh_exception.py b/paramiko/ssh_exception.py new file mode 100644 index 0000000..900d4a0 --- /dev/null +++ b/paramiko/ssh_exception.py @@ -0,0 +1,69 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +Exceptions defined by paramiko. +""" + + +class SSHException (Exception): + """ + Exception raised by failures in SSH2 protocol negotiation or logic errors. + """ + pass + + +class PasswordRequiredException (SSHException): + """ + Exception raised when a password is needed to unlock a private key file. + """ + pass + + +class BadAuthenticationType (SSHException): + """ + Exception raised when an authentication type (like password) is used, but + the server isn't allowing that type. (It may only allow public-key, for + example.) + + @ivar allowed_types: list of allowed authentication types provided by the + server (possible values are: C{"none"}, C{"password"}, and + C{"publickey"}). + @type allowed_types: list + + @since: 1.1 + """ + allowed_types = [] + + def __init__(self, explanation, types): + SSHException.__init__(self, explanation) + self.allowed_types = types + + def __str__(self): + return SSHException.__str__(self) + ' (allowed_types=%r)' % self.allowed_types + + +class PartialAuthentication (SSHException): + """ + An internal exception thrown in the case of partial authentication. + """ + allowed_types = [] + + def __init__(self, types): + SSHException.__init__(self, 'partial authentication') + self.allowed_types = types diff --git a/paramiko/transport.py b/paramiko/transport.py new file mode 100644 index 0000000..8714a96 --- /dev/null +++ b/paramiko/transport.py @@ -0,0 +1,1824 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +L{Transport} handles the core SSH2 protocol. +""" + +import os +import socket +import string +import struct +import sys +import threading +import time +import weakref + +from paramiko import util +from paramiko.common import * +from paramiko.compress import ZlibCompressor, ZlibDecompressor +from paramiko.ssh_exception import SSHException, BadAuthenticationType +from paramiko.message import Message +from paramiko.channel import Channel +from paramiko.sftp_client import SFTPClient +from paramiko.packet import Packetizer, NeedRekeyException +from paramiko.rsakey import RSAKey +from paramiko.dsskey import DSSKey +from paramiko.kex_group1 import KexGroup1 +from paramiko.kex_gex import KexGex +from paramiko.primes import ModulusPack +from paramiko.auth_handler import AuthHandler + +# these come from PyCrypt +# http://www.amk.ca/python/writing/pycrypt/ +# i believe this on the standards track. +# PyCrypt compiled for Win32 can be downloaded from the HashTar homepage: +# http://nitace.bsd.uchicago.edu:8080/hashtar +from Crypto.Cipher import Blowfish, AES, DES3 +from Crypto.Hash import SHA, MD5, HMAC + + +# for thread cleanup +_active_threads = [] +def _join_lingering_threads(): + for thr in _active_threads: + thr.stop_thread() +import atexit +atexit.register(_join_lingering_threads) + + +class SecurityOptions (object): + """ + Simple object containing the security preferences of an ssh transport. + These are tuples of acceptable ciphers, digests, key types, and key + exchange algorithms, listed in order of preference. + + Changing the contents and/or order of these fields affects the underlying + L{Transport} (but only if you change them before starting the session). + If you try to add an algorithm that paramiko doesn't recognize, + C{ValueError} will be raised. If you try to assign something besides a + tuple to one of the fields, C{TypeError} will be raised. + + @since: ivysaur + """ + __slots__ = [ 'ciphers', 'digests', 'key_types', 'kex', 'compression', '_transport' ] + + def __init__(self, transport): + self._transport = transport + + def __repr__(self): + """ + Returns a string representation of this object, for debugging. + + @rtype: str + """ + return '' % repr(self._transport) + + def _get_ciphers(self): + return self._transport._preferred_ciphers + + def _get_digests(self): + return self._transport._preferred_macs + + def _get_key_types(self): + return self._transport._preferred_keys + + def _get_kex(self): + return self._transport._preferred_kex + + def _get_compression(self): + return self._transport._preferred_compression + + def _set(self, name, orig, x): + if type(x) is list: + x = tuple(x) + if type(x) is not tuple: + raise TypeError('expected tuple or list') + possible = getattr(self._transport, orig).keys() + if len(filter(lambda n: n not in possible, x)) > 0: + raise ValueError('unknown cipher') + setattr(self._transport, name, x) + + def _set_ciphers(self, x): + self._set('_preferred_ciphers', '_cipher_info', x) + + def _set_digests(self, x): + self._set('_preferred_macs', '_mac_info', x) + + def _set_key_types(self, x): + self._set('_preferred_keys', '_key_info', x) + + def _set_kex(self, x): + self._set('_preferred_kex', '_kex_info', x) + + def _set_compression(self, x): + self._set('_preferred_compression', '_compression_info', x) + + ciphers = property(_get_ciphers, _set_ciphers, None, + "Symmetric encryption ciphers") + digests = property(_get_digests, _set_digests, None, + "Digest (one-way hash) algorithms") + key_types = property(_get_key_types, _set_key_types, None, + "Public-key algorithms") + kex = property(_get_kex, _set_kex, None, "Key exchange algorithms") + compression = property(_get_compression, _set_compression, None, + "Compression algorithms") + + +class Transport (threading.Thread): + """ + An SSH Transport attaches to a stream (usually a socket), negotiates an + encrypted session, authenticates, and then creates stream tunnels, called + L{Channel}s, across the session. Multiple channels can be multiplexed + across a single session (and often are, in the case of port forwardings). + """ + + _PROTO_ID = '2.0' + _CLIENT_ID = 'paramiko_1.5.2' + + _preferred_ciphers = ( 'aes128-cbc', 'blowfish-cbc', 'aes256-cbc', '3des-cbc' ) + _preferred_macs = ( 'hmac-sha1', 'hmac-md5', 'hmac-sha1-96', 'hmac-md5-96' ) + _preferred_keys = ( 'ssh-rsa', 'ssh-dss' ) + _preferred_kex = ( 'diffie-hellman-group1-sha1', 'diffie-hellman-group-exchange-sha1' ) + _preferred_compression = ( 'none', ) + + _cipher_info = { + 'blowfish-cbc': { 'class': Blowfish, 'mode': Blowfish.MODE_CBC, 'block-size': 8, 'key-size': 16 }, + 'aes128-cbc': { 'class': AES, 'mode': AES.MODE_CBC, 'block-size': 16, 'key-size': 16 }, + 'aes256-cbc': { 'class': AES, 'mode': AES.MODE_CBC, 'block-size': 16, 'key-size': 32 }, + '3des-cbc': { 'class': DES3, 'mode': DES3.MODE_CBC, 'block-size': 8, 'key-size': 24 }, + } + + _mac_info = { + 'hmac-sha1': { 'class': SHA, 'size': 20 }, + 'hmac-sha1-96': { 'class': SHA, 'size': 12 }, + 'hmac-md5': { 'class': MD5, 'size': 16 }, + 'hmac-md5-96': { 'class': MD5, 'size': 12 }, + } + + _key_info = { + 'ssh-rsa': RSAKey, + 'ssh-dss': DSSKey, + } + + _kex_info = { + 'diffie-hellman-group1-sha1': KexGroup1, + 'diffie-hellman-group-exchange-sha1': KexGex, + } + + _compression_info = { + # zlib@openssh.com is just zlib, but only turned on after a successful + # authentication. openssh servers may only offer this type because + # they've had troubles with security holes in zlib in the past. + 'zlib@openssh.com': ( ZlibCompressor, ZlibDecompressor ), + 'zlib': ( ZlibCompressor, ZlibDecompressor ), + 'none': ( None, None ), + } + + + _modulus_pack = None + + def __init__(self, sock): + """ + Create a new SSH session over an existing socket, or socket-like + object. This only creates the Transport object; it doesn't begin the + SSH session yet. Use L{connect} or L{start_client} to begin a client + session, or L{start_server} to begin a server session. + + If the object is not actually a socket, it must have the following + methods: + - C{send(str)}: Writes from 1 to C{len(str)} bytes, and + returns an int representing the number of bytes written. Returns + 0 or raises C{EOFError} if the stream has been closed. + - C{recv(int)}: Reads from 1 to C{int} bytes and returns them as a + string. Returns 0 or raises C{EOFError} if the stream has been + closed. + - C{close()}: Closes the socket. + - C{settimeout(n)}: Sets a (float) timeout on I/O operations. + + For ease of use, you may also pass in an address (as a tuple) or a host + string as the C{sock} argument. (A host string is a hostname with an + optional port (separated by C{":"}) which will be converted into a + tuple of C{(hostname, port)}.) A socket will be connected to this + address and used for communication. Exceptions from the C{socket} call + may be thrown in this case. + + @param sock: a socket or socket-like object to create the session over. + @type sock: socket + """ + if type(sock) is str: + # convert "host:port" into (host, port) + hl = sock.split(':', 1) + if len(hl) == 1: + sock = (hl[0], 22) + else: + sock = (hl[0], int(hl[1])) + if type(sock) is tuple: + # connect to the given (host, port) + hostname, port = sock + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.connect((hostname, port)) + # okay, normal socket-ish flow here... + threading.Thread.__init__(self) + self.randpool = randpool + self.sock = sock + # Python < 2.3 doesn't have the settimeout method - RogerB + try: + # we set the timeout so we can check self.active periodically to + # see if we should bail. socket.timeout exception is never + # propagated. + self.sock.settimeout(0.1) + except AttributeError: + pass + # negotiated crypto parameters + self.packetizer = Packetizer(sock) + self.local_version = 'SSH-' + self._PROTO_ID + '-' + self._CLIENT_ID + self.remote_version = '' + self.local_cipher = self.remote_cipher = '' + self.local_kex_init = self.remote_kex_init = None + self.session_id = None + # /negotiated crypto parameters + self.expected_packet = 0 + self.active = False + self.initial_kex_done = False + self.in_kex = False + self.lock = threading.Lock() # synchronization (always higher level than write_lock) + self.channels = weakref.WeakValueDictionary() # (id -> Channel) + self.channel_events = { } # (id -> Event) + self.channels_seen = { } # (id -> True) + self.channel_counter = 1 + self.window_size = 65536 + self.max_packet_size = 34816 + self.saved_exception = None + self.clear_to_send = threading.Event() + self.clear_to_send_lock = threading.Lock() + self.log_name = 'paramiko.transport' + self.logger = util.get_logger(self.log_name) + self.packetizer.set_log(self.logger) + self.auth_handler = None + self.authenticated = False + # user-defined event callbacks: + self.completion_event = None + # server mode: + self.server_mode = False + self.server_object = None + self.server_key_dict = { } + self.server_accepts = [ ] + self.server_accept_cv = threading.Condition(self.lock) + self.subsystem_table = { } + + def __del__(self): + self.close() + + def __repr__(self): + """ + Returns a string representation of this object, for debugging. + + @rtype: str + """ + out = '} or + L{auth_publickey }. + + @note: L{connect} is a simpler method for connecting as a client. + + @note: After calling this method (or L{start_server} or L{connect}), + you should no longer directly read from or write to the original + socket object. + + @param event: an event to trigger when negotiation is complete + (optional) + @type event: threading.Event + + @raise SSHException: if negotiation fails (and no C{event} was passed + in) + """ + self.active = True + if event is not None: + # async, return immediately and let the app poll for completion + self.completion_event = event + self.start() + return + + # synchronous, wait for a result + self.completion_event = event = threading.Event() + self.start() + while True: + event.wait(0.1) + if not self.active: + e = self.get_exception() + if e is not None: + raise e + raise SSHException('Negotiation failed.') + if event.isSet(): + break + + def start_server(self, event=None, server=None): + """ + Negotiate a new SSH2 session as a server. This is the first step after + creating a new L{Transport} and setting up your server host key(s). A + separate thread is created for protocol negotiation. + + If an event is passed in, this method returns immediately. When + negotiation is done (successful or not), the given C{Event} will + be triggered. On failure, L{is_active} will return C{False}. + + (Since 1.4) If C{event} is C{None}, this method will not return until + negotation is done. On success, the method returns normally. + Otherwise an SSHException is raised. + + After a successful negotiation, the client will need to authenticate. + Override the methods + L{get_allowed_auths }, + L{check_auth_none }, + L{check_auth_password }, and + L{check_auth_publickey } in the + given C{server} object to control the authentication process. + + After a successful authentication, the client should request to open + a channel. Override + L{check_channel_request } in the + given C{server} object to allow channels to be opened. + + @note: After calling this method (or L{start_client} or L{connect}), + you should no longer directly read from or write to the original + socket object. + + @param event: an event to trigger when negotiation is complete. + @type event: threading.Event + @param server: an object used to perform authentication and create + L{Channel}s. + @type server: L{server.ServerInterface} + + @raise SSHException: if negotiation fails (and no C{event} was passed + in) + """ + if server is None: + server = ServerInterface() + self.server_mode = True + self.server_object = server + self.active = True + if event is not None: + # async, return immediately and let the app poll for completion + self.completion_event = event + self.start() + return + + # synchronous, wait for a result + self.completion_event = event = threading.Event() + self.start() + while True: + event.wait(0.1) + if not self.active: + e = self.get_exception() + if e is not None: + raise e + raise SSHException('Negotiation failed.') + if event.isSet(): + break + + def add_server_key(self, key): + """ + Add a host key to the list of keys used for server mode. When behaving + as a server, the host key is used to sign certain packets during the + SSH2 negotiation, so that the client can trust that we are who we say + we are. Because this is used for signing, the key must contain private + key info, not just the public half. Only one key of each type (RSA or + DSS) is kept. + + @param key: the host key to add, usually an L{RSAKey } or + L{DSSKey }. + @type key: L{PKey } + """ + self.server_key_dict[key.get_name()] = key + + def get_server_key(self): + """ + Return the active host key, in server mode. After negotiating with the + client, this method will return the negotiated host key. If only one + type of host key was set with L{add_server_key}, that's the only key + that will ever be returned. But in cases where you have set more than + one type of host key (for example, an RSA key and a DSS key), the key + type will be negotiated by the client, and this method will return the + key of the type agreed on. If the host key has not been negotiated + yet, C{None} is returned. In client mode, the behavior is undefined. + + @return: host key of the type negotiated by the client, or C{None}. + @rtype: L{PKey } + """ + try: + return self.server_key_dict[self.host_key_type] + except KeyError: + return None + + def load_server_moduli(filename=None): + """ + I{(optional)} + Load a file of prime moduli for use in doing group-exchange key + negotiation in server mode. It's a rather obscure option and can be + safely ignored. + + In server mode, the remote client may request "group-exchange" key + negotiation, which asks the server to send a random prime number that + fits certain criteria. These primes are pretty difficult to compute, + so they can't be generated on demand. But many systems contain a file + of suitable primes (usually named something like C{/etc/ssh/moduli}). + If you call C{load_server_moduli} and it returns C{True}, then this + file of primes has been loaded and we will support "group-exchange" in + server mode. Otherwise server mode will just claim that it doesn't + support that method of key negotiation. + + @param filename: optional path to the moduli file, if you happen to + know that it's not in a standard location. + @type filename: str + @return: True if a moduli file was successfully loaded; False + otherwise. + @rtype: bool + + @since: doduo + + @note: This has no effect when used in client mode. + """ + Transport._modulus_pack = ModulusPack(randpool) + # places to look for the openssh "moduli" file + file_list = [ '/etc/ssh/moduli', '/usr/local/etc/moduli' ] + if filename is not None: + file_list.insert(0, filename) + for fn in file_list: + try: + Transport._modulus_pack.read_file(fn) + return True + except IOError: + pass + # none succeeded + Transport._modulus_pack = None + return False + load_server_moduli = staticmethod(load_server_moduli) + + def close(self): + """ + Close this session, and any open channels that are tied to it. + """ + self.active = False + # since this may be called from __del__, can't assume any attributes exist + try: + self.packetizer.close() + for chan in self.channels.values(): + chan._unlink() + except AttributeError: + pass + + def get_remote_server_key(self): + """ + Return the host key of the server (in client mode). + + @note: Previously this call returned a tuple of (key type, key string). + You can get the same effect by calling + L{PKey.get_name } for the key type, and + C{str(key)} for the key string. + + @raise SSHException: if no session is currently active. + + @return: public key of the remote server. + @rtype: L{PKey } + """ + if (not self.active) or (not self.initial_kex_done): + raise SSHException('No existing session') + return self.host_key + + def is_active(self): + """ + Return true if this session is active (open). + + @return: True if the session is still active (open); False if the + session is closed. + @rtype: bool + """ + return self.active + + def open_session(self): + """ + Request a new channel to the server, of type C{"session"}. This + is just an alias for C{open_channel('session')}. + + @return: a new L{Channel} on success, or C{None} if the request is + rejected or the session ends prematurely. + @rtype: L{Channel} + """ + return self.open_channel('session') + + def open_channel(self, kind, dest_addr=None, src_addr=None): + """ + Request a new channel to the server. L{Channel}s are socket-like + objects used for the actual transfer of data across the session. + You may only request a channel after negotiating encryption (using + L{connect} or L{start_client}) and authenticating. + + @param kind: the kind of channel requested (usually C{"session"}, + C{"forwarded-tcpip"} or C{"direct-tcpip"}). + @type kind: str + @param dest_addr: the destination address of this port forwarding, + if C{kind} is C{"forwarded-tcpip"} or C{"direct-tcpip"} (ignored + for other channel types). + @type dest_addr: (str, int) + @param src_addr: the source address of this port forwarding, if + C{kind} is C{"forwarded-tcpip"} or C{"direct-tcpip"}. + @type src_addr: (str, int) + @return: a new L{Channel} on success, or C{None} if the request is + rejected or the session ends prematurely. + @rtype: L{Channel} + """ + chan = None + if not self.active: + # don't bother trying to allocate a channel + return None + self.lock.acquire() + try: + chanid = self.channel_counter + while self.channels.has_key(chanid): + self.channel_counter = (self.channel_counter + 1) & 0xffffff + chanid = self.channel_counter + self.channel_counter = (self.channel_counter + 1) & 0xffffff + m = Message() + m.add_byte(chr(MSG_CHANNEL_OPEN)) + m.add_string(kind) + m.add_int(chanid) + m.add_int(self.window_size) + m.add_int(self.max_packet_size) + if (kind == 'forwarded-tcpip') or (kind == 'direct-tcpip'): + m.add_string(dest_addr[0]) + m.add_int(dest_addr[1]) + m.add_string(src_addr[0]) + m.add_int(src_addr[1]) + self.channels[chanid] = chan = Channel(chanid) + self.channel_events[chanid] = event = threading.Event() + self.channels_seen[chanid] = True + chan._set_transport(self) + chan._set_window(self.window_size, self.max_packet_size) + finally: + self.lock.release() + self._send_user_message(m) + while 1: + event.wait(0.1); + if not self.active: + return None + if event.isSet(): + break + try: + self.lock.acquire() + if not self.channels.has_key(chanid): + chan = None + finally: + self.lock.release() + return chan + + def open_sftp_client(self): + """ + Create an SFTP client channel from an open transport. On success, + an SFTP session will be opened with the remote host, and a new + SFTPClient object will be returned. + + @return: a new L{SFTPClient} object, referring to an sftp session + (channel) across this transport + @rtype: L{SFTPClient} + """ + return SFTPClient.from_transport(self) + + def send_ignore(self, bytes=None): + """ + Send a junk packet across the encrypted link. This is sometimes used + to add "noise" to a connection to confuse would-be attackers. It can + also be used as a keep-alive for long lived connections traversing + firewalls. + + @param bytes: the number of random bytes to send in the payload of the + ignored packet -- defaults to a random number from 10 to 41. + @type bytes: int + + @since: fearow + """ + m = Message() + m.add_byte(chr(MSG_IGNORE)) + randpool.stir() + if bytes is None: + bytes = (ord(randpool.get_bytes(1)) % 32) + 10 + m.add_bytes(randpool.get_bytes(bytes)) + self._send_user_message(m) + + def renegotiate_keys(self): + """ + Force this session to switch to new keys. Normally this is done + automatically after the session hits a certain number of packets or + bytes sent or received, but this method gives you the option of forcing + new keys whenever you want. Negotiating new keys causes a pause in + traffic both ways as the two sides swap keys and do computations. This + method returns when the session has switched to new keys, or the + session has died mid-negotiation. + + @return: True if the renegotiation was successful, and the link is + using new keys; False if the session dropped during renegotiation. + @rtype: bool + """ + self.completion_event = threading.Event() + self._send_kex_init() + while 1: + self.completion_event.wait(0.1); + if not self.active: + return False + if self.completion_event.isSet(): + break + return True + + def set_keepalive(self, interval): + """ + Turn on/off keepalive packets (default is off). If this is set, after + C{interval} seconds without sending any data over the connection, a + "keepalive" packet will be sent (and ignored by the remote host). This + can be useful to keep connections alive over a NAT, for example. + + @param interval: seconds to wait before sending a keepalive packet (or + 0 to disable keepalives). + @type interval: int + + @since: fearow + """ + self.packetizer.set_keepalive(interval, + lambda x=self: x.global_request('keepalive@lag.net', wait=False)) + + def global_request(self, kind, data=None, wait=True): + """ + Make a global request to the remote host. These are normally + extensions to the SSH2 protocol. + + @param kind: name of the request. + @type kind: str + @param data: an optional tuple containing additional data to attach + to the request. + @type data: tuple + @param wait: C{True} if this method should not return until a response + is received; C{False} otherwise. + @type wait: bool + @return: a L{Message} containing possible additional data if the + request was successful (or an empty L{Message} if C{wait} was + C{False}); C{None} if the request was denied. + @rtype: L{Message} + + @since: fearow + """ + if wait: + self.completion_event = threading.Event() + m = Message() + m.add_byte(chr(MSG_GLOBAL_REQUEST)) + m.add_string(kind) + m.add_boolean(wait) + if data is not None: + m.add(*data) + self._log(DEBUG, 'Sending global request "%s"' % kind) + self._send_user_message(m) + if not wait: + return None + while True: + self.completion_event.wait(0.1) + if not self.active: + return None + if self.completion_event.isSet(): + break + return self.global_response + + def accept(self, timeout=None): + """ + Return the next channel opened by the client over this transport, in + server mode. If no channel is opened before the given timeout, C{None} + is returned. + + @param timeout: seconds to wait for a channel, or C{None} to wait + forever + @type timeout: int + @return: a new Channel opened by the client + @rtype: L{Channel} + """ + self.lock.acquire() + try: + if len(self.server_accepts) > 0: + chan = self.server_accepts.pop(0) + else: + self.server_accept_cv.wait(timeout) + if len(self.server_accepts) > 0: + chan = self.server_accepts.pop(0) + else: + # timeout + chan = None + finally: + self.lock.release() + return chan + + def connect(self, hostkey=None, username='', password=None, pkey=None): + """ + Negotiate an SSH2 session, and optionally verify the server's host key + and authenticate using a password or private key. This is a shortcut + for L{start_client}, L{get_remote_server_key}, and + L{Transport.auth_password} or L{Transport.auth_publickey}. Use those + methods if you want more control. + + You can use this method immediately after creating a Transport to + negotiate encryption with a server. If it fails, an exception will be + thrown. On success, the method will return cleanly, and an encrypted + session exists. You may immediately call L{open_channel} or + L{open_session} to get a L{Channel} object, which is used for data + transfer. + + @note: If you fail to supply a password or private key, this method may + succeed, but a subsequent L{open_channel} or L{open_session} call may + fail because you haven't authenticated yet. + + @param hostkey: the host key expected from the server, or C{None} if + you don't want to do host key verification. + @type hostkey: L{PKey} + @param username: the username to authenticate as. + @type username: str + @param password: a password to use for authentication, if you want to + use password authentication; otherwise C{None}. + @type password: str + @param pkey: a private key to use for authentication, if you want to + use private key authentication; otherwise C{None}. + @type pkey: L{PKey} + + @raise SSHException: if the SSH2 negotiation fails, the host key + supplied by the server is incorrect, or authentication fails. + + @since: doduo + """ + if hostkey is not None: + self._preferred_keys = [ hostkey.get_name() ] + + self.start_client() + + # check host key if we were given one + if (hostkey is not None): + key = self.get_remote_server_key() + if (key.get_name() != hostkey.get_name()) or (str(key) != str(hostkey)): + self._log(DEBUG, 'Bad host key from server') + self._log(DEBUG, 'Expected: %s: %s' % (hostkey.get_name(), repr(str(hostkey)))) + self._log(DEBUG, 'Got : %s: %s' % (key.get_name(), repr(str(key)))) + raise SSHException('Bad host key from server') + self._log(DEBUG, 'Host key verified (%s)' % hostkey.get_name()) + + if (pkey is not None) or (password is not None): + if password is not None: + self._log(DEBUG, 'Attempting password auth...') + self.auth_password(username, password) + else: + self._log(DEBUG, 'Attempting public-key auth...') + self.auth_publickey(username, pkey) + + return + + def get_exception(self): + """ + Return any exception that happened during the last server request. + This can be used to fetch more specific error information after using + calls like L{start_client}. The exception (if any) is cleared after + this call. + + @return: an exception, or C{None} if there is no stored exception. + @rtype: Exception + + @since: 1.1 + """ + self.lock.acquire() + try: + e = self.saved_exception + self.saved_exception = None + return e + finally: + self.lock.release() + + def set_subsystem_handler(self, name, handler, *larg, **kwarg): + """ + Set the handler class for a subsystem in server mode. If a request + for this subsystem is made on an open ssh channel later, this handler + will be constructed and called -- see L{SubsystemHandler} for more + detailed documentation. + + Any extra parameters (including keyword arguments) are saved and + passed to the L{SubsystemHandler} constructor later. + + @param name: name of the subsystem. + @type name: str + @param handler: subclass of L{SubsystemHandler} that handles this + subsystem. + @type handler: class + """ + try: + self.lock.acquire() + self.subsystem_table[name] = (handler, larg, kwarg) + finally: + self.lock.release() + + def is_authenticated(self): + """ + Return true if this session is active and authenticated. + + @return: True if the session is still open and has been authenticated + successfully; False if authentication failed and/or the session is + closed. + @rtype: bool + """ + return self.active and (self.auth_handler is not None) and self.auth_handler.is_authenticated() + + def get_username(self): + """ + Return the username this connection is authenticated for. If the + session is not authenticated (or authentication failed), this method + returns C{None}. + + @return: username that was authenticated, or C{None}. + @rtype: string + + @since: fearow + """ + if not self.active or (self.auth_handler is None): + return None + return self.auth_handler.get_username() + + def auth_none(self, username): + """ + Try to authenticate to the server using no authentication at all. + This will almost always fail. It may be useful for determining the + list of authentication types supported by the server, by catching the + L{BadAuthenticationType} exception raised. + + @param username: the username to authenticate as + @type username: string + @return: list of auth types permissible for the next stage of + authentication (normally empty) + @rtype: list + + @raise BadAuthenticationType: if "none" authentication isn't allowed + by the server for this user + @raise SSHException: if the authentication failed due to a network + error + + @since: 1.5 + """ + if (not self.active) or (not self.initial_kex_done): + raise SSHException('No existing session') + my_event = threading.Event() + self.auth_handler = AuthHandler(self) + self.auth_handler.auth_none(username, my_event) + return self.auth_handler.wait_for_response(my_event) + + def auth_password(self, username, password, event=None, fallback=True): + """ + Authenticate to the server using a password. The username and password + are sent over an encrypted link. + + If an C{event} is passed in, this method will return immediately, and + the event will be triggered once authentication succeeds or fails. On + success, L{is_authenticated} will return C{True}. On failure, you may + use L{get_exception} to get more detailed error information. + + Since 1.1, if no event is passed, this method will block until the + authentication succeeds or fails. On failure, an exception is raised. + Otherwise, the method simply returns. + + Since 1.5, if no event is passed and C{fallback} is C{True} (the + default), if the server doesn't support plain password authentication + but does support so-called "keyboard-interactive" mode, an attempt + will be made to authenticate using this interactive mode. If it fails, + the normal exception will be thrown as if the attempt had never been + made. This is useful for some recent Gentoo and Debian distributions, + which turn off plain password authentication in a misguided belief + that interactive authentication is "more secure". (It's not.) + + If the server requires multi-step authentication (which is very rare), + this method will return a list of auth types permissible for the next + step. Otherwise, in the normal case, an empty list is returned. + + @param username: the username to authenticate as + @type username: string + @param password: the password to authenticate with + @type password: string + @param event: an event to trigger when the authentication attempt is + complete (whether it was successful or not) + @type event: threading.Event + @param fallback: C{True} if an attempt at an automated "interactive" + password auth should be made if the server doesn't support normal + password auth + @type fallback: bool + @return: list of auth types permissible for the next stage of + authentication (normally empty) + @rtype: list + + @raise BadAuthenticationType: if password authentication isn't + allowed by the server for this user (and no event was passed in) + @raise SSHException: if the authentication failed (and no event was + passed in) + """ + if (not self.active) or (not self.initial_kex_done): + # we should never try to send the password unless we're on a secure link + raise SSHException('No existing session') + if event is None: + my_event = threading.Event() + else: + my_event = event + self.auth_handler = AuthHandler(self) + self.auth_handler.auth_password(username, password, my_event) + if event is not None: + # caller wants to wait for event themselves + return [] + try: + return self.auth_handler.wait_for_response(my_event) + except BadAuthenticationType, x: + # if password auth isn't allowed, but keyboard-interactive *is*, try to fudge it + if not fallback or not 'keyboard-interactive' in x.allowed_types: + raise + try: + def handler(title, instructions, fields): + if len(fields) > 1: + raise SSHException('Fallback authentication failed.') + if len(fields) == 0: + # for some reason, at least on os x, a 2nd request will + # be made with zero fields requested. maybe it's just + # to try to fake out automated scripting of the exact + # type we're doing here. *shrug* :) + return [] + return [ password ] + return self.auth_interactive(username, handler) + except SSHException, ignored: + # attempt failed; just raise the original exception + raise x + + def auth_publickey(self, username, key, event=None): + """ + Authenticate to the server using a private key. The key is used to + sign data from the server, so it must include the private part. + + If an C{event} is passed in, this method will return immediately, and + the event will be triggered once authentication succeeds or fails. On + success, L{is_authenticated} will return C{True}. On failure, you may + use L{get_exception} to get more detailed error information. + + Since 1.1, if no event is passed, this method will block until the + authentication succeeds or fails. On failure, an exception is raised. + Otherwise, the method simply returns. + + If the server requires multi-step authentication (which is very rare), + this method will return a list of auth types permissible for the next + step. Otherwise, in the normal case, an empty list is returned. + + @param username: the username to authenticate as + @type username: string + @param key: the private key to authenticate with + @type key: L{PKey } + @param event: an event to trigger when the authentication attempt is + complete (whether it was successful or not) + @type event: threading.Event + @return: list of auth types permissible for the next stage of + authentication (normally empty). + @rtype: list + + @raise BadAuthenticationType: if public-key authentication isn't + allowed by the server for this user (and no event was passed in). + @raise SSHException: if the authentication failed (and no event was + passed in). + """ + if (not self.active) or (not self.initial_kex_done): + # we should never try to authenticate unless we're on a secure link + raise SSHException('No existing session') + if event is None: + my_event = threading.Event() + else: + my_event = event + self.auth_handler = AuthHandler(self) + self.auth_handler.auth_publickey(username, key, my_event) + if event is not None: + # caller wants to wait for event themselves + return [] + return self.auth_handler.wait_for_response(my_event) + + def auth_interactive(self, username, handler, submethods=''): + """ + Authenticate to the server interactively. A handler is used to answer + arbitrary questions from the server. On many servers, this is just a + dumb wrapper around PAM. + + This method will block until the authentication succeeds or fails, + peroidically calling the handler asynchronously to get answers to + authentication questions. The handler may be called more than once + if the server continues to ask questions. + + The handler is expected to be a callable that will handle calls of the + form: C{handler(title, instructions, prompt_list)}. The C{title} is + meant to be a dialog-window title, and the C{instructions} are user + instructions (both are strings). C{prompt_list} will be a list of + prompts, each prompt being a tuple of C{(str, bool)}. The string is + the prompt and the boolean indicates whether the user text should be + echoed. + + A sample call would thus be: + C{handler('title', 'instructions', [('Password:', False)])}. + + The handler should return a list or tuple of answers to the server's + questions. + + If the server requires multi-step authentication (which is very rare), + this method will return a list of auth types permissible for the next + step. Otherwise, in the normal case, an empty list is returned. + + @param username: the username to authenticate as + @type username: string + @param handler: a handler for responding to server questions + @type handler: callable + @param submethods: a string list of desired submethods (optional) + @type submethods: str + @return: list of auth types permissible for the next stage of + authentication (normally empty). + @rtype: list + + @raise BadAuthenticationType: if public-key authentication isn't + allowed by the server for this user + @raise SSHException: if the authentication failed + + @since: 1.5 + """ + if (not self.active) or (not self.initial_kex_done): + # we should never try to authenticate unless we're on a secure link + raise SSHException('No existing session') + my_event = threading.Event() + self.auth_handler = AuthHandler(self) + self.auth_handler.auth_interactive(username, handler, my_event, submethods) + return self.auth_handler.wait_for_response(my_event) + + def set_log_channel(self, name): + """ + Set the channel for this transport's logging. The default is + C{"paramiko.transport"} but it can be set to anything you want. + (See the C{logging} module for more info.) SSH Channels will log + to a sub-channel of the one specified. + + @param name: new channel name for logging. + @type name: str + + @since: 1.1 + """ + self.log_name = name + self.logger = util.get_logger(name) + + def get_log_channel(self): + """ + Return the channel name used for this transport's logging. + + @return: channel name. + @rtype: str + + @since: 1.2 + """ + return self.log_name + + def set_hexdump(self, hexdump): + """ + Turn on/off logging a hex dump of protocol traffic at DEBUG level in + the logs. Normally you would want this off (which is the default), + but if you are debugging something, it may be useful. + + @param hexdump: C{True} to log protocol traffix (in hex) to the log; + C{False} otherwise. + @type hexdump: bool + """ + self.packetizer.set_hexdump(hexdump) + + def get_hexdump(self): + """ + Return C{True} if the transport is currently logging hex dumps of + protocol traffic. + + @return: C{True} if hex dumps are being logged + @rtype: bool + + @since: 1.4 + """ + return self.packetizer.get_hexdump() + + def use_compression(self, compress=True): + """ + Turn on/off compression. This will only have an affect before starting + the transport (ie before calling L{connect}, etc). By default, + compression is off since it negatively affects interactive sessions + and is not fully tested. + + @param compress: C{True} to ask the remote client/server to compress + traffic; C{False} to refuse compression + @type compress: bool + + @since: 1.5.2 + """ + if compress: + self._preferred_compression = ( 'zlib@openssh.com', 'zlib', 'none' ) + else: + self._preferred_compression = ( 'none', ) + + def stop_thread(self): + self.active = False + self.packetizer.close() + + + ### internals... + + + def _log(self, level, msg): + if issubclass(type(msg), list): + for m in msg: + self.logger.log(level, m) + else: + self.logger.log(level, msg) + + def _get_modulus_pack(self): + "used by KexGex to find primes for group exchange" + return self._modulus_pack + + def _unlink_channel(self, chanid): + "used by a Channel to remove itself from the active channel list" + try: + self.lock.acquire() + if self.channels.has_key(chanid): + del self.channels[chanid] + finally: + self.lock.release() + + def _send_message(self, data): + self.packetizer.send_message(data) + + def _send_user_message(self, data): + """ + send a message, but block if we're in key negotiation. this is used + for user-initiated requests. + """ + while True: + self.clear_to_send.wait(0.1) + if not self.active: + self._log(DEBUG, 'Dropping user packet because connection is dead.') + return + self.clear_to_send_lock.acquire() + if self.clear_to_send.isSet(): + break + self.clear_to_send_lock.release() + try: + self._send_message(data) + finally: + self.clear_to_send_lock.release() + + def _set_K_H(self, k, h): + "used by a kex object to set the K (root key) and H (exchange hash)" + self.K = k + self.H = h + if self.session_id == None: + self.session_id = h + + def _expect_packet(self, type): + "used by a kex object to register the next packet type it expects to see" + self.expected_packet = type + + def _verify_key(self, host_key, sig): + key = self._key_info[self.host_key_type](Message(host_key)) + if key is None: + raise SSHException('Unknown host key type') + if not key.verify_ssh_sig(self.H, Message(sig)): + raise SSHException('Signature verification (%s) failed. Boo. Robey should debug this.' % self.host_key_type) + self.host_key = key + + def _compute_key(self, id, nbytes): + "id is 'A' - 'F' for the various keys used by ssh" + m = Message() + m.add_mpint(self.K) + m.add_bytes(self.H) + m.add_byte(id) + m.add_bytes(self.session_id) + out = sofar = SHA.new(str(m)).digest() + while len(out) < nbytes: + m = Message() + m.add_mpint(self.K) + m.add_bytes(self.H) + m.add_bytes(sofar) + hash = SHA.new(str(m)).digest() + out += hash + sofar += hash + return out[:nbytes] + + def _get_cipher(self, name, key, iv): + if not self._cipher_info.has_key(name): + raise SSHException('Unknown client cipher ' + name) + return self._cipher_info[name]['class'].new(key, self._cipher_info[name]['mode'], iv) + + def run(self): + # (use the exposed "run" method, because if we specify a thread target + # of a private method, threading.Thread will keep a reference to it + # indefinitely, creating a GC cycle and not letting Transport ever be + # GC'd. it's a bug in Thread.) + + # active=True occurs before the thread is launched, to avoid a race + _active_threads.append(self) + if self.server_mode: + self._log(DEBUG, 'starting thread (server mode): %s' % hex(long(id(self)) & 0xffffffffL)) + else: + self._log(DEBUG, 'starting thread (client mode): %s' % hex(long(id(self)) & 0xffffffffL)) + try: + self.packetizer.write_all(self.local_version + '\r\n') + self._check_banner() + self._send_kex_init() + self.expected_packet = MSG_KEXINIT + + while self.active: + if self.packetizer.need_rekey() and not self.in_kex: + self._send_kex_init() + try: + ptype, m = self.packetizer.read_message() + except NeedRekeyException: + continue + if ptype == MSG_IGNORE: + continue + elif ptype == MSG_DISCONNECT: + self._parse_disconnect(m) + self.active = False + self.packetizer.close() + break + elif ptype == MSG_DEBUG: + self._parse_debug(m) + continue + if self.expected_packet != 0: + if ptype != self.expected_packet: + raise SSHException('Expecting packet %d, got %d' % (self.expected_packet, ptype)) + self.expected_packet = 0 + if (ptype >= 30) and (ptype <= 39): + self.kex_engine.parse_next(ptype, m) + continue + + if self._handler_table.has_key(ptype): + self._handler_table[ptype](self, m) + elif self._channel_handler_table.has_key(ptype): + chanid = m.get_int() + if self.channels.has_key(chanid): + self._channel_handler_table[ptype](self.channels[chanid], m) + elif self.channels_seen.has_key(chanid): + self._log(DEBUG, 'Ignoring message for dead channel %d' % chanid) + else: + self._log(ERROR, 'Channel request for unknown channel %d' % chanid) + self.active = False + self.packetizer.close() + elif (self.auth_handler is not None) and self.auth_handler._handler_table.has_key(ptype): + self.auth_handler._handler_table[ptype](self.auth_handler, m) + else: + self._log(WARNING, 'Oops, unhandled type %d' % ptype) + msg = Message() + msg.add_byte(chr(MSG_UNIMPLEMENTED)) + msg.add_int(m.seqno) + self._send_message(msg) + except SSHException, e: + self._log(ERROR, 'Exception: ' + str(e)) + self._log(ERROR, util.tb_strings()) + self.saved_exception = e + except EOFError, e: + self._log(DEBUG, 'EOF in transport thread') + #self._log(DEBUG, util.tb_strings()) + self.saved_exception = e + except socket.error, e: + if type(e.args) is tuple: + emsg = '%s (%d)' % (e.args[1], e.args[0]) + else: + emsg = e.args + self._log(ERROR, 'Socket exception: ' + emsg) + self.saved_exception = e + except Exception, e: + self._log(ERROR, 'Unknown exception: ' + str(e)) + self._log(ERROR, util.tb_strings()) + self.saved_exception = e + _active_threads.remove(self) + for chan in self.channels.values(): + chan._unlink() + if self.active: + self.active = False + self.packetizer.close() + if self.completion_event != None: + self.completion_event.set() + if self.auth_handler is not None: + self.auth_handler.abort() + for event in self.channel_events.values(): + event.set() + self.sock.close() + + + ### protocol stages + + + def _negotiate_keys(self, m): + # throws SSHException on anything unusual + self.clear_to_send_lock.acquire() + try: + self.clear_to_send.clear() + finally: + self.clear_to_send_lock.release() + if self.local_kex_init == None: + # remote side wants to renegotiate + self._send_kex_init() + self._parse_kex_init(m) + self.kex_engine.start_kex() + + def _check_banner(self): + # this is slow, but we only have to do it once + for i in range(5): + # give them 5 seconds for the first line, then just 2 seconds each additional line + if i == 0: + timeout = 5 + else: + timeout = 2 + try: + buffer = self.packetizer.readline(timeout) + except Exception, x: + raise SSHException('Error reading SSH protocol banner' + str(x)) + if buffer[:4] == 'SSH-': + break + self._log(DEBUG, 'Banner: ' + buffer) + if buffer[:4] != 'SSH-': + raise SSHException('Indecipherable protocol version "' + buffer + '"') + # save this server version string for later + self.remote_version = buffer + # pull off any attached comment + comment = '' + i = string.find(buffer, ' ') + if i >= 0: + comment = buffer[i+1:] + buffer = buffer[:i] + # parse out version string and make sure it matches + segs = buffer.split('-', 2) + if len(segs) < 3: + raise SSHException('Invalid SSH banner') + version = segs[1] + client = segs[2] + if version != '1.99' and version != '2.0': + raise SSHException('Incompatible version (%s instead of 2.0)' % (version,)) + self._log(INFO, 'Connected (version %s, client %s)' % (version, client)) + + def _send_kex_init(self): + """ + announce to the other side that we'd like to negotiate keys, and what + kind of key negotiation we support. + """ + self.clear_to_send_lock.acquire() + try: + self.clear_to_send.clear() + finally: + self.clear_to_send_lock.release() + self.in_kex = True + if self.server_mode: + if (self._modulus_pack is None) and ('diffie-hellman-group-exchange-sha1' in self._preferred_kex): + # can't do group-exchange if we don't have a pack of potential primes + pkex = list(self.get_security_options().kex) + pkex.remove('diffie-hellman-group-exchange-sha1') + self.get_security_options().kex = pkex + available_server_keys = filter(self.server_key_dict.keys().__contains__, + self._preferred_keys) + else: + available_server_keys = self._preferred_keys + + randpool.stir() + m = Message() + m.add_byte(chr(MSG_KEXINIT)) + m.add_bytes(randpool.get_bytes(16)) + m.add_list(self._preferred_kex) + m.add_list(available_server_keys) + m.add_list(self._preferred_ciphers) + m.add_list(self._preferred_ciphers) + m.add_list(self._preferred_macs) + m.add_list(self._preferred_macs) + m.add_list(self._preferred_compression) + m.add_list(self._preferred_compression) + m.add_string('') + m.add_string('') + m.add_boolean(False) + m.add_int(0) + # save a copy for later (needed to compute a hash) + self.local_kex_init = str(m) + self._send_message(m) + + def _parse_kex_init(self, m): + cookie = m.get_bytes(16) + kex_algo_list = m.get_list() + server_key_algo_list = m.get_list() + client_encrypt_algo_list = m.get_list() + server_encrypt_algo_list = m.get_list() + client_mac_algo_list = m.get_list() + server_mac_algo_list = m.get_list() + client_compress_algo_list = m.get_list() + server_compress_algo_list = m.get_list() + client_lang_list = m.get_list() + server_lang_list = m.get_list() + kex_follows = m.get_boolean() + unused = m.get_int() + + self._log(DEBUG, 'kex algos:' + str(kex_algo_list) + ' server key:' + str(server_key_algo_list) + \ + ' client encrypt:' + str(client_encrypt_algo_list) + \ + ' server encrypt:' + str(server_encrypt_algo_list) + \ + ' client mac:' + str(client_mac_algo_list) + \ + ' server mac:' + str(server_mac_algo_list) + \ + ' client compress:' + str(client_compress_algo_list) + \ + ' server compress:' + str(server_compress_algo_list) + \ + ' client lang:' + str(client_lang_list) + \ + ' server lang:' + str(server_lang_list) + \ + ' kex follows?' + str(kex_follows)) + + # as a server, we pick the first item in the client's list that we support. + # as a client, we pick the first item in our list that the server supports. + if self.server_mode: + agreed_kex = filter(self._preferred_kex.__contains__, kex_algo_list) + else: + agreed_kex = filter(kex_algo_list.__contains__, self._preferred_kex) + if len(agreed_kex) == 0: + raise SSHException('Incompatible ssh peer (no acceptable kex algorithm)') + self.kex_engine = self._kex_info[agreed_kex[0]](self) + + if self.server_mode: + available_server_keys = filter(self.server_key_dict.keys().__contains__, + self._preferred_keys) + agreed_keys = filter(available_server_keys.__contains__, server_key_algo_list) + else: + agreed_keys = filter(server_key_algo_list.__contains__, self._preferred_keys) + if len(agreed_keys) == 0: + raise SSHException('Incompatible ssh peer (no acceptable host key)') + self.host_key_type = agreed_keys[0] + if self.server_mode and (self.get_server_key() is None): + raise SSHException('Incompatible ssh peer (can\'t match requested host key type)') + + if self.server_mode: + agreed_local_ciphers = filter(self._preferred_ciphers.__contains__, + server_encrypt_algo_list) + agreed_remote_ciphers = filter(self._preferred_ciphers.__contains__, + client_encrypt_algo_list) + else: + agreed_local_ciphers = filter(client_encrypt_algo_list.__contains__, + self._preferred_ciphers) + agreed_remote_ciphers = filter(server_encrypt_algo_list.__contains__, + self._preferred_ciphers) + if (len(agreed_local_ciphers) == 0) or (len(agreed_remote_ciphers) == 0): + raise SSHException('Incompatible ssh server (no acceptable ciphers)') + self.local_cipher = agreed_local_ciphers[0] + self.remote_cipher = agreed_remote_ciphers[0] + self._log(DEBUG, 'Ciphers agreed: local=%s, remote=%s' % (self.local_cipher, self.remote_cipher)) + + if self.server_mode: + agreed_remote_macs = filter(self._preferred_macs.__contains__, client_mac_algo_list) + agreed_local_macs = filter(self._preferred_macs.__contains__, server_mac_algo_list) + else: + agreed_local_macs = filter(client_mac_algo_list.__contains__, self._preferred_macs) + agreed_remote_macs = filter(server_mac_algo_list.__contains__, self._preferred_macs) + if (len(agreed_local_macs) == 0) or (len(agreed_remote_macs) == 0): + raise SSHException('Incompatible ssh server (no acceptable macs)') + self.local_mac = agreed_local_macs[0] + self.remote_mac = agreed_remote_macs[0] + + if self.server_mode: + agreed_remote_compression = filter(self._preferred_compression.__contains__, client_compress_algo_list) + agreed_local_compression = filter(self._preferred_compression.__contains__, server_compress_algo_list) + else: + agreed_local_compression = filter(client_compress_algo_list.__contains__, self._preferred_compression) + agreed_remote_compression = filter(server_compress_algo_list.__contains__, self._preferred_compression) + if (len(agreed_local_compression) == 0) or (len(agreed_remote_compression) == 0): + raise SSHException('Incompatible ssh server (no acceptable compression) %r %r %r' % (agreed_local_compression, agreed_remote_compression, self._preferred_compression)) + self.local_compression = agreed_local_compression[0] + self.remote_compression = agreed_remote_compression[0] + + self._log(DEBUG, 'using kex %s; server key type %s; cipher: local %s, remote %s; mac: local %s, remote %s; compression: local %s, remote %s' % + (agreed_kex[0], self.host_key_type, self.local_cipher, self.remote_cipher, self.local_mac, + self.remote_mac, self.local_compression, self.remote_compression)) + + # save for computing hash later... + # now wait! openssh has a bug (and others might too) where there are + # actually some extra bytes (one NUL byte in openssh's case) added to + # the end of the packet but not parsed. turns out we need to throw + # away those bytes because they aren't part of the hash. + self.remote_kex_init = chr(MSG_KEXINIT) + m.get_so_far() + + def _activate_inbound(self): + "switch on newly negotiated encryption parameters for inbound traffic" + block_size = self._cipher_info[self.remote_cipher]['block-size'] + if self.server_mode: + IV_in = self._compute_key('A', block_size) + key_in = self._compute_key('C', self._cipher_info[self.remote_cipher]['key-size']) + else: + IV_in = self._compute_key('B', block_size) + key_in = self._compute_key('D', self._cipher_info[self.remote_cipher]['key-size']) + engine = self._get_cipher(self.remote_cipher, key_in, IV_in) + mac_size = self._mac_info[self.remote_mac]['size'] + mac_engine = self._mac_info[self.remote_mac]['class'] + # initial mac keys are done in the hash's natural size (not the potentially truncated + # transmission size) + if self.server_mode: + mac_key = self._compute_key('E', mac_engine.digest_size) + else: + mac_key = self._compute_key('F', mac_engine.digest_size) + self.packetizer.set_inbound_cipher(engine, block_size, mac_engine, mac_size, mac_key) + compress_in = self._compression_info[self.remote_compression][1] + if (compress_in is not None) and ((self.remote_compression != 'zlib@openssh.com') or self.authenticated): + self._log(DEBUG, 'Switching on inbound compression ...') + self.packetizer.set_inbound_compressor(compress_in()) + + def _activate_outbound(self): + "switch on newly negotiated encryption parameters for outbound traffic" + m = Message() + m.add_byte(chr(MSG_NEWKEYS)) + self._send_message(m) + block_size = self._cipher_info[self.local_cipher]['block-size'] + if self.server_mode: + IV_out = self._compute_key('B', block_size) + key_out = self._compute_key('D', self._cipher_info[self.local_cipher]['key-size']) + else: + IV_out = self._compute_key('A', block_size) + key_out = self._compute_key('C', self._cipher_info[self.local_cipher]['key-size']) + engine = self._get_cipher(self.local_cipher, key_out, IV_out) + mac_size = self._mac_info[self.local_mac]['size'] + mac_engine = self._mac_info[self.local_mac]['class'] + # initial mac keys are done in the hash's natural size (not the potentially truncated + # transmission size) + if self.server_mode: + mac_key = self._compute_key('F', mac_engine.digest_size) + else: + mac_key = self._compute_key('E', mac_engine.digest_size) + self.packetizer.set_outbound_cipher(engine, block_size, mac_engine, mac_size, mac_key) + compress_out = self._compression_info[self.local_compression][0] + if (compress_out is not None) and ((self.local_compression != 'zlib@openssh.com') or self.authenticated): + self._log(DEBUG, 'Switching on outbound compression ...') + self.packetizer.set_outbound_compressor(compress_out()) + if not self.packetizer.need_rekey(): + self.in_kex = False + # we always expect to receive NEWKEYS now + self.expected_packet = MSG_NEWKEYS + + def _auth_trigger(self): + self.authenticated = True + # delayed initiation of compression + if self.local_compression == 'zlib@openssh.com': + compress_out = self._compression_info[self.local_compression][0] + self._log(DEBUG, 'Switching on outbound compression ...') + self.packetizer.set_outbound_compressor(compress_out()) + if self.remote_compression == 'zlib@openssh.com': + compress_in = self._compression_info[self.remote_compression][1] + self._log(DEBUG, 'Switching on inbound compression ...') + self.packetizer.set_inbound_compressor(compress_in()) + + def _parse_newkeys(self, m): + self._log(DEBUG, 'Switch to new keys ...') + self._activate_inbound() + # can also free a bunch of stuff here + self.local_kex_init = self.remote_kex_init = None + self.K = None + self.kex_engine = None + if self.server_mode and (self.auth_handler is None): + # create auth handler for server mode + self.auth_handler = AuthHandler(self) + if not self.initial_kex_done: + # this was the first key exchange + self.initial_kex_done = True + # send an event? + if self.completion_event != None: + self.completion_event.set() + # it's now okay to send data again (if this was a re-key) + if not self.packetizer.need_rekey(): + self.in_kex = False + self.clear_to_send_lock.acquire() + try: + self.clear_to_send.set() + finally: + self.clear_to_send_lock.release() + return + + def _parse_disconnect(self, m): + code = m.get_int() + desc = m.get_string() + self._log(INFO, 'Disconnect (code %d): %s' % (code, desc)) + + def _parse_global_request(self, m): + kind = m.get_string() + self._log(DEBUG, 'Received global request "%s"' % kind) + want_reply = m.get_boolean() + ok = self.server_object.check_global_request(kind, m) + extra = () + if type(ok) is tuple: + extra = ok + ok = True + if want_reply: + msg = Message() + if ok: + msg.add_byte(chr(MSG_REQUEST_SUCCESS)) + msg.add(*extra) + else: + msg.add_byte(chr(MSG_REQUEST_FAILURE)) + self._send_message(msg) + + def _parse_request_success(self, m): + self._log(DEBUG, 'Global request successful.') + self.global_response = m + if self.completion_event is not None: + self.completion_event.set() + + def _parse_request_failure(self, m): + self._log(DEBUG, 'Global request denied.') + self.global_response = None + if self.completion_event is not None: + self.completion_event.set() + + def _parse_channel_open_success(self, m): + chanid = m.get_int() + server_chanid = m.get_int() + server_window_size = m.get_int() + server_max_packet_size = m.get_int() + if not self.channels.has_key(chanid): + self._log(WARNING, 'Success for unrequested channel! [??]') + return + self.lock.acquire() + try: + chan = self.channels[chanid] + chan._set_remote_channel(server_chanid, server_window_size, server_max_packet_size) + self._log(INFO, 'Secsh channel %d opened.' % chanid) + if self.channel_events.has_key(chanid): + self.channel_events[chanid].set() + del self.channel_events[chanid] + finally: + self.lock.release() + return + + def _parse_channel_open_failure(self, m): + chanid = m.get_int() + reason = m.get_int() + reason_str = m.get_string() + lang = m.get_string() + if CONNECTION_FAILED_CODE.has_key(reason): + reason_text = CONNECTION_FAILED_CODE[reason] + else: + reason_text = '(unknown code)' + self._log(INFO, 'Secsh channel %d open FAILED: %s: %s' % (chanid, reason_str, reason_text)) + try: + self.lock.aquire() + if self.channels.has_key(chanid): + del self.channels[chanid] + if self.channel_events.has_key(chanid): + self.channel_events[chanid].set() + del self.channel_events[chanid] + finally: + self.lock.release() + return + + def _parse_channel_open(self, m): + kind = m.get_string() + chanid = m.get_int() + initial_window_size = m.get_int() + max_packet_size = m.get_int() + reject = False + if not self.server_mode: + self._log(DEBUG, 'Rejecting "%s" channel request from server.' % kind) + reject = True + reason = OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED + else: + self.lock.acquire() + try: + my_chanid = self.channel_counter + while self.channels.has_key(my_chanid): + self.channel_counter = (self.channel_counter + 1) & 0xffffff + my_chanid = self.channel_counter + self.channel_counter = (self.channel_counter + 1) & 0xffffff + finally: + self.lock.release() + reason = self.server_object.check_channel_request(kind, my_chanid) + if reason != OPEN_SUCCEEDED: + self._log(DEBUG, 'Rejecting "%s" channel request from client.' % kind) + reject = True + if reject: + msg = Message() + msg.add_byte(chr(MSG_CHANNEL_OPEN_FAILURE)) + msg.add_int(chanid) + msg.add_int(reason) + msg.add_string('') + msg.add_string('en') + self._send_message(msg) + return + chan = Channel(my_chanid) + try: + self.lock.acquire() + self.channels[my_chanid] = chan + self.channels_seen[my_chanid] = True + chan._set_transport(self) + chan._set_window(self.window_size, self.max_packet_size) + chan._set_remote_channel(chanid, initial_window_size, max_packet_size) + finally: + self.lock.release() + m = Message() + m.add_byte(chr(MSG_CHANNEL_OPEN_SUCCESS)) + m.add_int(chanid) + m.add_int(my_chanid) + m.add_int(self.window_size) + m.add_int(self.max_packet_size) + self._send_message(m) + self._log(INFO, 'Secsh channel %d opened.' % my_chanid) + try: + self.lock.acquire() + self.server_accepts.append(chan) + self.server_accept_cv.notify() + finally: + self.lock.release() + + def _parse_debug(self, m): + always_display = m.get_boolean() + msg = m.get_string() + lang = m.get_string() + self._log(DEBUG, 'Debug msg: ' + util.safe_string(msg)) + + def _get_subsystem_handler(self, name): + try: + self.lock.acquire() + if not self.subsystem_table.has_key(name): + return (None, [], {}) + return self.subsystem_table[name] + finally: + self.lock.release() + + _handler_table = { + MSG_NEWKEYS: _parse_newkeys, + MSG_GLOBAL_REQUEST: _parse_global_request, + MSG_REQUEST_SUCCESS: _parse_request_success, + MSG_REQUEST_FAILURE: _parse_request_failure, + MSG_CHANNEL_OPEN_SUCCESS: _parse_channel_open_success, + MSG_CHANNEL_OPEN_FAILURE: _parse_channel_open_failure, + MSG_CHANNEL_OPEN: _parse_channel_open, + MSG_KEXINIT: _negotiate_keys, + } + + _channel_handler_table = { + MSG_CHANNEL_SUCCESS: Channel._request_success, + MSG_CHANNEL_FAILURE: Channel._request_failed, + MSG_CHANNEL_DATA: Channel._feed, + MSG_CHANNEL_EXTENDED_DATA: Channel._feed_extended, + MSG_CHANNEL_WINDOW_ADJUST: Channel._window_adjust, + MSG_CHANNEL_REQUEST: Channel._handle_request, + MSG_CHANNEL_EOF: Channel._handle_eof, + MSG_CHANNEL_CLOSE: Channel._handle_close, + } diff --git a/paramiko/util.py b/paramiko/util.py new file mode 100644 index 0000000..abab825 --- /dev/null +++ b/paramiko/util.py @@ -0,0 +1,357 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +Useful functions used by the rest of paramiko. +""" + +from __future__ import generators + +import fnmatch +import sys +import struct +import traceback +import threading + +from paramiko.common import * + + +# Change by RogerB - python < 2.3 doesn't have enumerate so we implement it +if sys.version_info < (2,3): + class enumerate: + def __init__ (self, sequence): + self.sequence = sequence + def __iter__ (self): + count = 0 + for item in self.sequence: + yield (count, item) + count += 1 + + +def inflate_long(s, always_positive=False): + "turns a normalized byte string into a long-int (adapted from Crypto.Util.number)" + out = 0L + negative = 0 + if not always_positive and (len(s) > 0) and (ord(s[0]) >= 0x80): + negative = 1 + if len(s) % 4: + filler = '\x00' + if negative: + filler = '\xff' + s = filler * (4 - len(s) % 4) + s + for i in range(0, len(s), 4): + out = (out << 32) + struct.unpack('>I', s[i:i+4])[0] + if negative: + out -= (1L << (8 * len(s))) + return out + +def deflate_long(n, add_sign_padding=True): + "turns a long-int into a normalized byte string (adapted from Crypto.Util.number)" + # after much testing, this algorithm was deemed to be the fastest + s = '' + n = long(n) + while (n != 0) and (n != -1): + s = struct.pack('>I', n & 0xffffffffL) + s + n = n >> 32 + # strip off leading zeros, FFs + for i in enumerate(s): + if (n == 0) and (i[1] != '\000'): + break + if (n == -1) and (i[1] != '\xff'): + break + else: + # degenerate case, n was either 0 or -1 + i = (0,) + if n == 0: + s = '\000' + else: + s = '\xff' + s = s[i[0]:] + if add_sign_padding: + if (n == 0) and (ord(s[0]) >= 0x80): + s = '\x00' + s + if (n == -1) and (ord(s[0]) < 0x80): + s = '\xff' + s + return s + +def format_binary_weird(data): + out = '' + for i in enumerate(data): + out += '%02X' % ord(i[1]) + if i[0] % 2: + out += ' ' + if i[0] % 16 == 15: + out += '\n' + return out + +def format_binary(data, prefix=''): + x = 0 + out = [] + while len(data) > x + 16: + out.append(format_binary_line(data[x:x+16])) + x += 16 + if x < len(data): + out.append(format_binary_line(data[x:])) + return [prefix + x for x in out] + +def format_binary_line(data): + left = ' '.join(['%02X' % ord(c) for c in data]) + right = ''.join([('.%c..' % c)[(ord(c)+63)//95] for c in data]) + return '%-50s %s' % (left, right) + +def hexify(s): + "turn a string into a hex sequence" + return ''.join(['%02X' % ord(c) for c in s]) + +def unhexify(s): + "turn a hex sequence back into a string" + return ''.join([chr(int(s[i:i+2], 16)) for i in range(0, len(s), 2)]) + +def safe_string(s): + out = '' + for c in s: + if (ord(c) >= 32) and (ord(c) <= 127): + out += c + else: + out += '%%%02X' % ord(c) + return out + +# ''.join([['%%%02X' % ord(c), c][(ord(c) >= 32) and (ord(c) <= 127)] for c in s]) + +def bit_length(n): + norm = deflate_long(n, 0) + hbyte = ord(norm[0]) + bitlen = len(norm) * 8 + while not (hbyte & 0x80): + hbyte <<= 1 + bitlen -= 1 + return bitlen + +def tb_strings(): + return ''.join(traceback.format_exception(*sys.exc_info())).split('\n') + +def generate_key_bytes(hashclass, salt, key, nbytes): + """ + Given a password, passphrase, or other human-source key, scramble it + through a secure hash into some keyworthy bytes. This specific algorithm + is used for encrypting/decrypting private key files. + + @param hashclass: class from L{Crypto.Hash} that can be used as a secure + hashing function (like C{MD5} or C{SHA}). + @type hashclass: L{Crypto.Hash} + @param salt: data to salt the hash with. + @type salt: string + @param key: human-entered password or passphrase. + @type key: string + @param nbytes: number of bytes to generate. + @type nbytes: int + @return: key data + @rtype: string + """ + keydata = '' + digest = '' + if len(salt) > 8: + salt = salt[:8] + while nbytes > 0: + hash = hashclass.new() + if len(digest) > 0: + hash.update(digest) + hash.update(key) + hash.update(salt) + digest = hash.digest() + size = min(nbytes, len(digest)) + keydata += digest[:size] + nbytes -= size + return keydata + +def load_host_keys(filename): + """ + Read a file of known SSH host keys, in the format used by openssh, and + return a compound dict of C{hostname -> keytype ->} L{PKey }. + The hostname may be an IP address or DNS name. The keytype will be either + C{"ssh-rsa"} or C{"ssh-dss"}. + + This type of file unfortunately doesn't exist on Windows, but on posix, + it will usually be stored in C{os.path.expanduser("~/.ssh/known_hosts")}. + + @param filename: name of the file to read host keys from + @type filename: str + @return: dict of host keys, indexed by hostname and then keytype + @rtype: dict(hostname, dict(keytype, L{PKey })) + """ + import base64 + from rsakey import RSAKey + from dsskey import DSSKey + + keys = {} + f = file(filename, 'r') + for line in f: + line = line.strip() + if (len(line) == 0) or (line[0] == '#'): + continue + keylist = line.split(' ') + if len(keylist) != 3: + continue + hostlist, keytype, key = keylist + hosts = hostlist.split(',') + for host in hosts: + if not keys.has_key(host): + keys[host] = {} + if keytype == 'ssh-rsa': + keys[host][keytype] = RSAKey(data=base64.decodestring(key)) + elif keytype == 'ssh-dss': + keys[host][keytype] = DSSKey(data=base64.decodestring(key)) + f.close() + return keys + +def parse_ssh_config(file_obj): + """ + Parse a config file of the format used by OpenSSH, and return an object + that can be used to make queries to L{lookup_ssh_host_config}. The + format is described in OpenSSH's C{ssh_config} man page. This method is + provided primarily as a convenience to posix users (since the OpenSSH + format is a de-facto standard on posix) but should work fine on Windows + too. + + The return value is currently a list of dictionaries, each containing + host-specific configuration, but this is considered an implementation + detail and may be subject to change in later versions. + + @param file_obj: a file-like object to read the config file from + @type file_obj: file + @return: opaque configuration object + @rtype: object + """ + ret = [] + config = { 'host': '*' } + ret.append(config) + + for line in file_obj: + line = line.rstrip('\n').lstrip() + if (line == '') or (line[0] == '#'): + continue + if '=' in line: + key, value = line.split('=', 1) + key = key.strip().lower() + else: + # find first whitespace, and split there + i = 0 + while (i < len(line)) and not line[i].isspace(): + i += 1 + if i == len(line): + raise Exception('Unparsable line: %r' % line) + key = line[:i].lower() + value = line[i:].lstrip() + + if key == 'host': + # do we have a pre-existing host config to append to? + matches = [c for c in ret if c['host'] == value] + if len(matches) > 0: + config = matches[0] + else: + config = { 'host': value } + ret.append(config) + else: + config[key] = value + + return ret + +def lookup_ssh_host_config(hostname, config): + """ + Return a dict of config options for a given hostname. The C{config} object + must come from L{parse_ssh_config}. + + The host-matching rules of OpenSSH's C{ssh_config} man page are used, which + means that all configuration options from matching host specifications are + merged, with more specific hostmasks taking precedence. In other words, if + C{"Port"} is set under C{"Host *"} and also C{"Host *.example.com"}, and + the lookup is for C{"ssh.example.com"}, then the port entry for + C{"Host *.example.com"} will win out. + + The keys in the returned dict are all normalized to lowercase (look for + C{"port"}, not C{"Port"}. No other processing is done to the keys or + values. + + @param hostname: the hostname to lookup + @type hostname: str + @param config: the config object to search + @type config: object + """ + matches = [x for x in config if fnmatch.fnmatch(hostname, x['host'])] + # sort in order of shortest match (usually '*') to longest + matches.sort(key=lambda x: len(x['host'])) + ret = {} + for m in matches: + ret.update(m) + del ret['host'] + return ret + +def mod_inverse(x, m): + # it's crazy how small python can make this function. + u1, u2, u3 = 1, 0, m + v1, v2, v3 = 0, 1, x + + while v3 > 0: + q = u3 // v3 + u1, v1 = v1, u1 - v1 * q + u2, v2 = v2, u2 - v2 * q + u3, v3 = v3, u3 - v3 * q + if u2 < 0: + u2 += m + return u2 + +_g_thread_ids = {} +_g_thread_counter = 0 +_g_thread_lock = threading.Lock() +def get_thread_id(): + global _g_thread_ids, _g_thread_counter, _g_thread_lock + tid = id(threading.currentThread()) + try: + return _g_thread_ids[tid] + except KeyError: + _g_thread_lock.acquire() + try: + _g_thread_counter += 1 + ret = _g_thread_ids[tid] = _g_thread_counter + finally: + _g_thread_lock.release() + return ret + +def log_to_file(filename, level=DEBUG): + "send paramiko logs to a logfile, if they're not already going somewhere" + l = logging.getLogger("paramiko") + if len(l.handlers) > 0: + return + l.setLevel(level) + f = open(filename, 'w') + lh = logging.StreamHandler(f) + lh.setFormatter(logging.Formatter('%(levelname)-.3s [%(asctime)s.%(msecs)03d] thr=%(_threadid)-3d %(name)s: %(message)s', + '%Y%m%d-%H:%M:%S')) + l.addHandler(lh) + +# make only one filter object, so it doesn't get applied more than once +class PFilter (object): + def filter(self, record): + record._threadid = get_thread_id() + return True +_pfilter = PFilter() + +def get_logger(name): + l = logging.getLogger(name) + l.addFilter(_pfilter) + return l diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..ce7d047 --- /dev/null +++ b/setup.py @@ -0,0 +1,49 @@ +from distutils.core import setup + +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + + +longdesc = ''' +This is a library for making SSH2 connections (client or server). +Emphasis is on using SSH2 as an alternative to SSL for making secure +connections between python scripts. All major ciphers and hash methods +are supported. SFTP client and server mode are both supported too. + +Required packages: + pyCrypt +''' + +setup(name = "paramiko", + version = "1.5.2", + description = "SSH2 protocol library", + author = "Robey Pointer", + author_email = "robey@lag.net", + url = "http://www.lag.net/paramiko/", + packages = [ 'paramiko' ], + download_url = 'http://www.lag.net/paramiko/download/paramiko-1.5.2.zip', + license = 'LGPL', + platforms = 'Posix; MacOS X; Windows', + classifiers = [ 'Development Status :: 5 - Production/Stable', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)', + 'Operating System :: OS Independent', + 'Topic :: Internet', + 'Topic :: Security :: Cryptography' ], + long_description = longdesc, + ) diff --git a/test.py b/test.py new file mode 100644 index 0000000..17b6294 --- /dev/null +++ b/test.py @@ -0,0 +1,103 @@ +#!/usr/bin/python + +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +do the unit tests! +""" + +import sys, os, unittest +from optparse import OptionParser +import paramiko + +sys.path.append('tests/') + +from test_message import MessageTest +from test_file import BufferedFileTest +from test_util import UtilTest +from test_pkey import KeyTest +from test_kex import KexTest +from test_packetizer import PacketizerTest +from test_transport import TransportTest +from test_sftp import SFTPTest + +default_host = 'localhost' +default_user = os.environ.get('USER', 'nobody') +default_keyfile = os.path.join(os.environ.get('HOME', '/'), '.ssh/id_rsa') +default_passwd = None + +parser = OptionParser('usage: %prog [options]') +parser.add_option('--verbose', action='store_true', dest='verbose', default=False, + help='verbose display (one line per test)') +parser.add_option('--no-pkey', action='store_false', dest='use_pkey', default=True, + help='skip RSA/DSS private key tests (which can take a while)') +parser.add_option('--no-transport', action='store_false', dest='use_transport', default=True, + help='skip transport tests (which can take a while)') +parser.add_option('--no-sftp', action='store_false', dest='use_sftp', default=True, + help='skip SFTP client/server tests, which can be slow') +parser.add_option('--no-big-file', action='store_false', dest='use_big_file', default=True, + help='skip big file SFTP tests, which are slow as molasses') +parser.add_option('-R', action='store_false', dest='use_loopback_sftp', default=True, + help='perform SFTP tests against a remote server (by default, SFTP tests ' + + 'are done through a loopback socket)') +parser.add_option('-H', '--sftp-host', dest='hostname', type='string', default=default_host, + metavar='', + help='[with -R] host for remote sftp tests (default: %s)' % default_host) +parser.add_option('-U', '--sftp-user', dest='username', type='string', default=default_user, + metavar='', + help='[with -R] username for remote sftp tests (default: %s)' % default_user) +parser.add_option('-K', '--sftp-key', dest='keyfile', type='string', default=default_keyfile, + metavar='', + help='[with -R] location of private key for remote sftp tests (default: %s)' % + default_keyfile) +parser.add_option('-P', '--sftp-passwd', dest='password', type='string', default=default_passwd, + metavar='', + help='[with -R] (optional) password to unlock the private key for remote sftp tests') + +options, args = parser.parse_args() +if len(args) > 0: + parser.error('unknown argument(s)') + +# setup logging +paramiko.util.log_to_file('test.log') + +if options.use_sftp: + if options.use_loopback_sftp: + SFTPTest.init_loopback() + else: + SFTPTest.init(options.hostname, options.username, options.keyfile, options.password) + if not options.use_big_file: + SFTPTest.set_big_file_test(False) + +suite = unittest.TestSuite() +suite.addTest(unittest.makeSuite(MessageTest)) +suite.addTest(unittest.makeSuite(BufferedFileTest)) +suite.addTest(unittest.makeSuite(UtilTest)) +if options.use_pkey: + suite.addTest(unittest.makeSuite(KeyTest)) +suite.addTest(unittest.makeSuite(KexTest)) +suite.addTest(unittest.makeSuite(PacketizerTest)) +if options.use_transport: + suite.addTest(unittest.makeSuite(TransportTest)) +if options.use_sftp: + suite.addTest(unittest.makeSuite(SFTPTest)) +verbosity = 1 +if options.verbose: + verbosity = 2 +unittest.TextTestRunner(verbosity=verbosity).run(suite) diff --git a/tests/loop.py b/tests/loop.py new file mode 100644 index 0000000..ad5f7ca --- /dev/null +++ b/tests/loop.py @@ -0,0 +1,104 @@ +#!/usr/bin/python + +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +... +""" + +import threading, socket + + +class LoopSocket (object): + """ + A LoopSocket looks like a normal socket, but all data written to it is + delivered on the read-end of another LoopSocket, and vice versa. It's + like a software "socketpair". + """ + + def __init__(self): + self.__in_buffer = '' + self.__lock = threading.Lock() + self.__cv = threading.Condition(self.__lock) + self.__timeout = None + self.__mate = None + + def close(self): + self.__unlink() + try: + self.__lock.acquire() + self.__in_buffer = '' + finally: + self.__lock.release() + + def send(self, data): + if self.__mate is None: + # EOF + raise EOFError() + self.__mate.__feed(data) + return len(data) + + def recv(self, n): + self.__lock.acquire() + try: + if self.__mate is None: + # EOF + return '' + if len(self.__in_buffer) == 0: + self.__cv.wait(self.__timeout) + if len(self.__in_buffer) == 0: + raise socket.timeout + if n < self.__in_buffer: + out = self.__in_buffer[:n] + self.__in_buffer = self.__in_buffer[n:] + else: + out = self.__in_buffer + self.__in_buffer = '' + return out + finally: + self.__lock.release() + + def settimeout(self, n): + self.__timeout = n + + def link(self, other): + self.__mate = other + self.__mate.__mate = self + + def __feed(self, data): + self.__lock.acquire() + try: + self.__in_buffer += data + self.__cv.notifyAll() + finally: + self.__lock.release() + + def __unlink(self): + m = None + self.__lock.acquire() + try: + if self.__mate is not None: + m = self.__mate + self.__mate = None + finally: + self.__lock.release() + if m is not None: + m.__unlink() + + diff --git a/tests/stub_sftp.py b/tests/stub_sftp.py new file mode 100644 index 0000000..4b8b9c3 --- /dev/null +++ b/tests/stub_sftp.py @@ -0,0 +1,192 @@ +#!/usr/bin/python + +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +A stub SFTP server for loopback SFTP testing. +""" + +import os +from paramiko import ServerInterface, SFTPServerInterface, SFTPServer, SFTPAttributes, \ + SFTPHandle, SFTP_OK, AUTH_SUCCESSFUL, OPEN_SUCCEEDED + + +class StubServer (ServerInterface): + def check_auth_password(self, username, password): + # all are allowed + return AUTH_SUCCESSFUL + + def check_channel_request(self, kind, chanid): + return OPEN_SUCCEEDED + + +class StubSFTPHandle (SFTPHandle): + def stat(self): + try: + return SFTPAttributes.from_stat(os.fstat(self.readfile.fileno())) + except OSError, e: + return SFTPServer.convert_errno(e.errno) + + def chattr(self, attr): + # python doesn't have equivalents to fchown or fchmod, so we have to + # use the stored filename + try: + SFTPServer.set_file_attr(self.filename, attr) + except OSError, e: + return SFTPServer.convert_errno(e.errno) + + +class StubSFTPServer (SFTPServerInterface): + # assume current folder is a fine root + # (the tests always create and eventualy delete a subfolder, so there shouldn't be any mess) + ROOT = os.getcwd() + + def _realpath(self, path): + return self.ROOT + self.canonicalize(path) + + def list_folder(self, path): + path = self._realpath(path) + try: + out = [ ] + flist = os.listdir(path) + for fname in flist: + attr = SFTPAttributes.from_stat(os.stat(os.path.join(path, fname))) + attr.filename = fname + out.append(attr) + return out + except OSError, e: + return SFTPServer.convert_errno(e.errno) + + def stat(self, path): + path = self._realpath(path) + try: + return SFTPAttributes.from_stat(os.stat(path)) + except OSError, e: + return SFTPServer.convert_errno(e.errno) + + def lstat(self, path): + path = self._realpath(path) + try: + return SFTPAttributes.from_stat(os.lstat(path)) + except OSError, e: + return SFTPServer.convert_errno(e.errno) + + def open(self, path, flags, attr): + path = self._realpath(path) + try: + fd = os.open(path, flags) + except OSError, e: + return SFTPServer.convert_errno(e.errno) + if (flags & os.O_CREAT) and (attr is not None): + SFTPServer.set_file_attr(path, attr) + if flags & os.O_WRONLY: + fstr = 'w' + elif flags & os.O_RDWR: + fstr = 'r+' + else: + # O_RDONLY (== 0) + fstr = 'r' + try: + f = os.fdopen(fd, fstr) + except OSError, e: + return SFTPServer.convert_errno(e.errno) + fobj = StubSFTPHandle() + fobj.filename = path + fobj.readfile = f + fobj.writefile = f + return fobj + + def remove(self, path): + path = self._realpath(path) + try: + os.remove(path) + except OSError, e: + return SFTPServer.convert_errno(e.errno) + return SFTP_OK + + def rename(self, oldpath, newpath): + oldpath = self._realpath(oldpath) + newpath = self._realpath(newpath) + try: + os.rename(oldpath, newpath) + except OSError, e: + return SFTPServer.convert_errno(e.errno) + return SFTP_OK + + def mkdir(self, path, attr): + path = self._realpath(path) + try: + os.mkdir(path) + if attr is not None: + SFTPServer.set_file_attr(path, attr) + except OSError, e: + return SFTPServer.convert_errno(e.errno) + return SFTP_OK + + def rmdir(self, path): + path = self._realpath(path) + try: + os.rmdir(path) + except OSError, e: + return SFTPServer.convert_errno(e.errno) + return SFTP_OK + + def chattr(self, path, attr): + path = self._realpath(path) + try: + SFTPServer.set_file_attr(path, attr) + except OSError, e: + return SFTPServer.convert_errno(e.errno) + return SFTP_OK + + def symlink(self, target_path, path): + path = self._realpath(path) + if (len(target_path) > 0) and (target_path[0] == '/'): + # absolute symlink + target_path = os.path.join(self.ROOT, target_path[1:]) + if target_path[:2] == '//': + # bug in os.path.join + target_path = target_path[1:] + else: + # compute relative to path + abspath = os.path.join(os.path.dirname(path), target_path) + if abspath[:len(self.ROOT)] != self.ROOT: + # this symlink isn't going to work anyway -- just break it immediately + target_path = '' + try: + os.symlink(target_path, path) + except: + return SFTPServer.convert_errno(e.errno) + return SFTP_OK + + def readlink(self, path): + path = self._realpath(path) + try: + symlink = os.readlink(path) + except OSError, e: + return SFTPServer.convert_errno(e.errno) + # if it's absolute, remove the root + if os.path.isabs(symlink): + if symlink[:len(self.ROOT)] == self.ROOT: + symlink = symlink[len(self.ROOT):] + if (len(symlink) == 0) or (symlink[0] != '/'): + symlink = '/' + symlink + else: + symlink = '' + return symlink diff --git a/tests/test_dss.key b/tests/test_dss.key new file mode 100644 index 0000000..e10807f --- /dev/null +++ b/tests/test_dss.key @@ -0,0 +1,12 @@ +-----BEGIN DSA PRIVATE KEY----- +MIIBuwIBAAKBgQDngaYDZ30c6/7cJgEEbtl8FgKdwhba1Z7oOrOn4MI/6C42G1bY +wMuqZf4dBCglsdq39SHrcjbE8Vq54gPSOh3g4+uV9Rcg5IOoPLbwp2jQfF6f1FIb +sx7hrDCIqUcQccPSxetPBKmXI9RN8rZLaFuQeTnI65BKM98Ruwvq6SI2LwIVAPDP +hSeawaJI27mKqOfe5PPBSmyHAoGBAJMXxXmPD9sGaQ419DIpmZecJKBUAy9uXD8x +gbgeDpwfDaFJP8owByCKREocPFfi86LjCuQkyUKOfjYMN6iHIf1oEZjB8uJAatUr +FzI0ArXtUqOhwTLwTyFuUojE5own2WYsOAGByvgfyWjsGhvckYNhI4ODpNdPlxQ8 +ZamaPGPsAoGARmR7CCPjodxASvRbIyzaVpZoJ/Z6x7dAumV+ysrV1BVYd0lYukmn +jO1kKBWApqpH1ve9XDQYN8zgxM4b16L21kpoWQnZtXrY3GZ4/it9kUgyB7+NwacI +BlXa8cMDL7Q/69o0d54U0X/NeX5QxuYR6OMJlrkQB7oiW/P/1mwjQgECFGI9QPSc +h9pT9XHqn+1rZ4bK+QGA +-----END DSA PRIVATE KEY----- diff --git a/tests/test_dss_password.key b/tests/test_dss_password.key new file mode 100644 index 0000000..e2a9bc5 --- /dev/null +++ b/tests/test_dss_password.key @@ -0,0 +1,15 @@ +-----BEGIN DSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,78DAEB836ED0A646 + +ldWkq9OMlXqWmjIqppNnmNPIUj5uVT12LkBosTApTbibTme3kIJb1uDeG2BShVfY ++vDOTUE9koGPDLsxW1t5At+EVyIDK8aIO0uHteXM5AbBX20LLUWRbRVqZhsMxqQh +3H3XlHiN+QhaWcb4fFuu18a8SkimTFpDnZuffoCDl/zh/B7XieARTLA805K/ZgVB +BBwflkR2BE053XHrJAIx9BEUlLP76Fo18rvjLZOSeu3s+VnnhqUb5FCt5h50a46u +YXQBbo2r9Zo1ilGMNEXJO0gk5hwGVmTySz53NkPA5HmWt8NIzv5jQHMDy7N+ZykF +uwpP1R5M/ZIFY4Y5h/lvn6IJjQ7VySRPIbpN8o2YJv2OD1Ja80n3tU8Mg77o3o4d +NwKm7cCjlq+FuIBdOsSgsB8FPQRUhW+jpFDxmWN64DM2cEg6RUdptby7WmMp0HwK +1qyEfxHjLMuDVlD7lASIDBrRlUjPtXEH1DzIYQuYaRZaixFoZ7EY+X73TwmrKFEU +US9ZnQZtRtroRqGwR4fz4wQQsjTl/AmOijlBmi29taJccJsT/THrLQ5plOEd8OMv +9FsaPJXBU85gaRKo3JZtrw== +-----END DSA PRIVATE KEY----- diff --git a/tests/test_file.py b/tests/test_file.py new file mode 100644 index 0000000..250821c --- /dev/null +++ b/tests/test_file.py @@ -0,0 +1,153 @@ +#!/usr/bin/python + +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +Some unit tests for the BufferedFile abstraction. +""" + +import unittest +from paramiko.file import BufferedFile + + +class LoopbackFile (BufferedFile): + """ + BufferedFile object that you can write data into, and then read it back. + """ + def __init__(self, mode='r', bufsize=-1): + BufferedFile.__init__(self) + self._set_mode(mode, bufsize) + self.buffer = '' + + def _read(self, size): + if len(self.buffer) == 0: + return None + if size > len(self.buffer): + size = len(self.buffer) + data = self.buffer[:size] + self.buffer = self.buffer[size:] + return data + + def _write(self, data): + self.buffer += data + return len(data) + + +class BufferedFileTest (unittest.TestCase): + + def test_1_simple(self): + f = LoopbackFile('r') + try: + f.write('hi') + self.assert_(False, 'no exception on write to read-only file') + except: + pass + f.close() + + f = LoopbackFile('w') + try: + f.read(1) + self.assert_(False, 'no exception to read from write-only file') + except: + pass + f.close() + + def test_2_readline(self): + f = LoopbackFile('r+U') + f.write('First line.\nSecond line.\r\nThird line.\nFinal line non-terminated.') + self.assertEqual(f.readline(), 'First line.\n') + # universal newline mode should convert this linefeed: + self.assertEqual(f.readline(), 'Second line.\n') + # truncated line: + self.assertEqual(f.readline(7), 'Third l') + self.assertEqual(f.readline(), 'ine.\n') + self.assertEqual(f.readline(), 'Final line non-terminated.') + self.assertEqual(f.readline(), '') + f.close() + try: + f.readline() + self.assert_(False, 'no exception on readline of closed file') + except IOError: + pass + self.assert_('\n' in f.newlines) + self.assert_('\r\n' in f.newlines) + self.assert_('\r' not in f.newlines) + + def test_3_lf(self): + """ + try to trick the linefeed detector. + """ + f = LoopbackFile('r+U') + f.write('First line.\r') + self.assertEqual(f.readline(), 'First line.\n') + f.write('\nSecond.\r\n') + self.assertEqual(f.readline(), 'Second.\n') + f.close() + self.assertEqual(f.newlines, '\r\n') + + def test_4_write(self): + """ + verify that write buffering is on. + """ + f = LoopbackFile('r+', 1) + f.write('Complete line.\nIncomplete line.') + self.assertEqual(f.readline(), 'Complete line.\n') + self.assertEqual(f.readline(), '') + f.write('..\n') + self.assertEqual(f.readline(), 'Incomplete line...\n') + f.close() + + def test_5_flush(self): + """ + verify that flush will force a write. + """ + f = LoopbackFile('r+', 512) + f.write('Not\nquite\n512 bytes.\n') + self.assertEqual(f.read(1), '') + f.flush() + self.assertEqual(f.read(5), 'Not\nq') + self.assertEqual(f.read(10), 'uite\n512 b') + self.assertEqual(f.read(9), 'ytes.\n') + self.assertEqual(f.read(3), '') + f.close() + + def test_6_buffering(self): + """ + verify that flushing happens automatically on buffer crossing. + """ + f = LoopbackFile('r+', 16) + f.write('Too small.') + self.assertEqual(f.read(4), '') + f.write(' ') + self.assertEqual(f.read(4), '') + f.write('Enough.') + self.assertEqual(f.read(20), 'Too small. Enough.') + f.close() + + def test_7_read_all(self): + """ + verify that read(-1) returns everything left in the file. + """ + f = LoopbackFile('r+', 16) + f.write('The first thing you need to do is open your eyes. ') + f.write('Then, you need to close them again.\n') + s = f.read(-1) + self.assertEqual(s, 'The first thing you need to do is open your eyes. Then, you ' + + 'need to close them again.\n') + f.close() diff --git a/tests/test_kex.py b/tests/test_kex.py new file mode 100644 index 0000000..2680853 --- /dev/null +++ b/tests/test_kex.py @@ -0,0 +1,183 @@ +#!/usr/bin/python + +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +Some unit tests for the key exchange protocols. +""" + +import unittest +import paramiko.util +from paramiko.kex_group1 import KexGroup1 +from paramiko.kex_gex import KexGex +from paramiko import Message + + +class FakeRandpool (object): + def stir(self): + pass + def get_bytes(self, n): + return chr(0xcc) * n + +class FakeKey (object): + def __str__(self): + return 'fake-key' + def sign_ssh_data(self, randpool, H): + return 'fake-sig' + +class FakeModulusPack (object): + P = 0xFFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFFL + G = 2 + def get_modulus(self, min, ask, max): + return self.G, self.P + +class FakeTransport (object): + randpool = FakeRandpool() + local_version = 'SSH-2.0-paramiko_1.0' + remote_version = 'SSH-2.0-lame' + local_kex_init = 'local-kex-init' + remote_kex_init = 'remote-kex-init' + + def _send_message(self, m): + self._message = m + def _expect_packet(self, t): + self._expect = t + def _set_K_H(self, K, H): + self._K = K + self._H = H + def _verify_key(self, host_key, sig): + self._verify = (host_key, sig) + def _activate_outbound(self): + self._activated = True + def _log(self, level, s): + pass + def get_server_key(self): + return FakeKey() + def _get_modulus_pack(self): + return FakeModulusPack() + + +class KexTest (unittest.TestCase): + + K = 14730343317708716439807310032871972459448364195094179797249681733965528989482751523943515690110179031004049109375612685505881911274101441415545039654102474376472240501616988799699744135291070488314748284283496055223852115360852283821334858541043710301057312858051901453919067023103730011648890038847384890504L + + def setUp(self): + pass + + def tearDown(self): + pass + + def test_1_group1_client(self): + transport = FakeTransport() + transport.server_mode = False + kex = KexGroup1(transport) + kex.start_kex() + x = '1E000000807E2DDB1743F3487D6545F04F1C8476092FB912B013626AB5BCEB764257D88BBA64243B9F348DF7B41B8C814A995E00299913503456983FFB9178D3CD79EB6D55522418A8ABF65375872E55938AB99A84A0B5FC8A1ECC66A7C3766E7E0F80B7CE2C9225FC2DD683F4764244B72963BBB383F529DCF0C5D17740B8A2ADBE9208D4' + self.assertEquals(x, paramiko.util.hexify(str(transport._message))) + self.assertEquals(paramiko.kex_group1._MSG_KEXDH_REPLY, transport._expect) + + # fake "reply" + msg = Message() + msg.add_string('fake-host-key') + msg.add_mpint(69) + msg.add_string('fake-sig') + msg.rewind() + kex.parse_next(paramiko.kex_group1._MSG_KEXDH_REPLY, msg) + H = '03079780F3D3AD0B3C6DB30C8D21685F367A86D2' + self.assertEquals(self.K, transport._K) + self.assertEquals(H, paramiko.util.hexify(transport._H)) + self.assertEquals(('fake-host-key', 'fake-sig'), transport._verify) + self.assert_(transport._activated) + + def test_2_group1_server(self): + transport = FakeTransport() + transport.server_mode = True + kex = KexGroup1(transport) + kex.start_kex() + self.assertEquals(paramiko.kex_group1._MSG_KEXDH_INIT, transport._expect) + + msg = Message() + msg.add_mpint(69) + msg.rewind() + kex.parse_next(paramiko.kex_group1._MSG_KEXDH_INIT, msg) + H = 'B16BF34DD10945EDE84E9C1EF24A14BFDC843389' + x = '1F0000000866616B652D6B6579000000807E2DDB1743F3487D6545F04F1C8476092FB912B013626AB5BCEB764257D88BBA64243B9F348DF7B41B8C814A995E00299913503456983FFB9178D3CD79EB6D55522418A8ABF65375872E55938AB99A84A0B5FC8A1ECC66A7C3766E7E0F80B7CE2C9225FC2DD683F4764244B72963BBB383F529DCF0C5D17740B8A2ADBE9208D40000000866616B652D736967' + self.assertEquals(self.K, transport._K) + self.assertEquals(H, paramiko.util.hexify(transport._H)) + self.assertEquals(x, paramiko.util.hexify(str(transport._message))) + self.assert_(transport._activated) + + def test_3_gex_client(self): + transport = FakeTransport() + transport.server_mode = False + kex = KexGex(transport) + kex.start_kex() + x = '22000004000000080000002000' + self.assertEquals(x, paramiko.util.hexify(str(transport._message))) + self.assertEquals(paramiko.kex_gex._MSG_KEXDH_GEX_GROUP, transport._expect) + + msg = Message() + msg.add_mpint(FakeModulusPack.P) + msg.add_mpint(FakeModulusPack.G) + msg.rewind() + kex.parse_next(paramiko.kex_gex._MSG_KEXDH_GEX_GROUP, msg) + x = '20000000807E2DDB1743F3487D6545F04F1C8476092FB912B013626AB5BCEB764257D88BBA64243B9F348DF7B41B8C814A995E00299913503456983FFB9178D3CD79EB6D55522418A8ABF65375872E55938AB99A84A0B5FC8A1ECC66A7C3766E7E0F80B7CE2C9225FC2DD683F4764244B72963BBB383F529DCF0C5D17740B8A2ADBE9208D4' + self.assertEquals(x, paramiko.util.hexify(str(transport._message))) + self.assertEquals(paramiko.kex_gex._MSG_KEXDH_GEX_REPLY, transport._expect) + + msg = Message() + msg.add_string('fake-host-key') + msg.add_mpint(69) + msg.add_string('fake-sig') + msg.rewind() + kex.parse_next(paramiko.kex_gex._MSG_KEXDH_GEX_REPLY, msg) + H = 'A265563F2FA87F1A89BF007EE90D58BE2E4A4BD0' + self.assertEquals(self.K, transport._K) + self.assertEquals(H, paramiko.util.hexify(transport._H)) + self.assertEquals(('fake-host-key', 'fake-sig'), transport._verify) + self.assert_(transport._activated) + + def test_4_gex_server(self): + transport = FakeTransport() + transport.server_mode = True + kex = KexGex(transport) + kex.start_kex() + self.assertEquals(paramiko.kex_gex._MSG_KEXDH_GEX_REQUEST, transport._expect) + + msg = Message() + msg.add_int(1024) + msg.add_int(2048) + msg.add_int(4096) + msg.rewind() + kex.parse_next(paramiko.kex_gex._MSG_KEXDH_GEX_REQUEST, msg) + x = '1F0000008100FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF0000000102' + self.assertEquals(x, paramiko.util.hexify(str(transport._message))) + self.assertEquals(paramiko.kex_gex._MSG_KEXDH_GEX_INIT, transport._expect) + + msg = Message() + msg.add_mpint(12345) + msg.rewind() + kex.parse_next(paramiko.kex_gex._MSG_KEXDH_GEX_INIT, msg) + K = 67592995013596137876033460028393339951879041140378510871612128162185209509220726296697886624612526735888348020498716482757677848959420073720160491114319163078862905400020959196386947926388406687288901564192071077389283980347784184487280885335302632305026248574716290537036069329724382811853044654824945750581L + H = 'CE754197C21BF3452863B4F44D0B3951F12516EF' + x = '210000000866616B652D6B6579000000807E2DDB1743F3487D6545F04F1C8476092FB912B013626AB5BCEB764257D88BBA64243B9F348DF7B41B8C814A995E00299913503456983FFB9178D3CD79EB6D55522418A8ABF65375872E55938AB99A84A0B5FC8A1ECC66A7C3766E7E0F80B7CE2C9225FC2DD683F4764244B72963BBB383F529DCF0C5D17740B8A2ADBE9208D40000000866616B652D736967' + self.assertEquals(K, transport._K) + self.assertEquals(H, paramiko.util.hexify(transport._H)) + self.assertEquals(x, paramiko.util.hexify(str(transport._message))) + self.assert_(transport._activated) diff --git a/tests/test_message.py b/tests/test_message.py new file mode 100644 index 0000000..441e3ce --- /dev/null +++ b/tests/test_message.py @@ -0,0 +1,102 @@ +#!/usr/bin/python + +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +Some unit tests for ssh protocol message blocks. +""" + +import unittest +from paramiko.message import Message + + +class MessageTest (unittest.TestCase): + + __a = '\x00\x00\x00\x17\x07\x60\xe0\x90\x00\x00\x00\x01q\x00\x00\x00\x05hello\x00\x00\x03\xe8' + ('x' * 1000) + __b = '\x01\x00\xf3\x00\x3f\x00\x00\x00\x10huey,dewey,louie' + __c = '\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\xf5\xe4\xd3\xc2\xb1\x09\x00\x00\x00\x01\x11\x00\x00\x00\x07\x00\xf5\xe4\xd3\xc2\xb1\x09\x00\x00\x00\x06\x9a\x1b\x2c\x3d\x4e\xf7' + __d = '\x00\x00\x00\x05\x00\x00\x00\x05\x11\x22\x33\x44\x55\x01\x00\x00\x00\x03cat\x00\x00\x00\x03a,b' + + def test_1_encode(self): + msg = Message() + msg.add_int(23) + msg.add_int(123789456) + msg.add_string('q') + msg.add_string('hello') + msg.add_string('x' * 1000) + self.assertEquals(str(msg), self.__a) + + msg = Message() + msg.add_boolean(True) + msg.add_boolean(False) + msg.add_byte('\xf3') + msg.add_bytes('\x00\x3f') + msg.add_list(['huey', 'dewey', 'louie']) + self.assertEquals(str(msg), self.__b) + + msg = Message() + msg.add_int64(5) + msg.add_int64(0xf5e4d3c2b109L) + msg.add_mpint(17) + msg.add_mpint(0xf5e4d3c2b109L) + msg.add_mpint(-0x65e4d3c2b109L) + self.assertEquals(str(msg), self.__c) + + def test_2_decode(self): + msg = Message(self.__a) + self.assertEquals(msg.get_int(), 23) + self.assertEquals(msg.get_int(), 123789456) + self.assertEquals(msg.get_string(), 'q') + self.assertEquals(msg.get_string(), 'hello') + self.assertEquals(msg.get_string(), 'x' * 1000) + + msg = Message(self.__b) + self.assertEquals(msg.get_boolean(), True) + self.assertEquals(msg.get_boolean(), False) + self.assertEquals(msg.get_byte(), '\xf3') + self.assertEquals(msg.get_bytes(2), '\x00\x3f') + self.assertEquals(msg.get_list(), ['huey', 'dewey', 'louie']) + + msg = Message(self.__c) + self.assertEquals(msg.get_int64(), 5) + self.assertEquals(msg.get_int64(), 0xf5e4d3c2b109L) + self.assertEquals(msg.get_mpint(), 17) + self.assertEquals(msg.get_mpint(), 0xf5e4d3c2b109L) + self.assertEquals(msg.get_mpint(), -0x65e4d3c2b109L) + + def test_3_add(self): + msg = Message() + msg.add(5) + msg.add(0x1122334455L) + msg.add(True) + msg.add('cat') + msg.add(['a', 'b']) + self.assertEquals(str(msg), self.__d) + + def test_4_misc(self): + msg = Message(self.__d) + self.assertEquals(msg.get_int(), 5) + self.assertEquals(msg.get_mpint(), 0x1122334455L) + self.assertEquals(msg.get_so_far(), self.__d[:13]) + self.assertEquals(msg.get_remainder(), self.__d[13:]) + msg.rewind() + self.assertEquals(msg.get_int(), 5) + self.assertEquals(msg.get_so_far(), self.__d[:4]) + self.assertEquals(msg.get_remainder(), self.__d[4:]) + diff --git a/tests/test_packetizer.py b/tests/test_packetizer.py new file mode 100644 index 0000000..8c992bd --- /dev/null +++ b/tests/test_packetizer.py @@ -0,0 +1,70 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +Some unit tests for the ssh2 protocol in Transport. +""" + +import unittest +from loop import LoopSocket +from Crypto.Cipher import AES +from Crypto.Hash import SHA, HMAC +from paramiko import Message, Packetizer, util + +class PacketizerTest (unittest.TestCase): + + def test_1_write (self): + rsock = LoopSocket() + wsock = LoopSocket() + rsock.link(wsock) + p = Packetizer(wsock) + p.set_log(util.get_logger('paramiko.transport')) + p.set_hexdump(True) + cipher = AES.new('\x00' * 16, AES.MODE_CBC, '\x55' * 16) + p.set_outbound_cipher(cipher, 16, SHA, 12, '\x1f' * 20) + + # message has to be at least 16 bytes long, so we'll have at least one + # block of data encrypted that contains zero random padding bytes + m = Message() + m.add_byte(chr(100)) + m.add_int(100) + m.add_int(1) + m.add_int(900) + p.send_message(m) + data = rsock.recv(100) + # 32 + 12 bytes of MAC = 44 + self.assertEquals(44, len(data)) + self.assertEquals('\x43\x91\x97\xbd\x5b\x50\xac\x25\x87\xc2\xc4\x6b\xc7\xe9\x38\xc0', data[:16]) + + def test_2_read (self): + rsock = LoopSocket() + wsock = LoopSocket() + rsock.link(wsock) + p = Packetizer(rsock) + p.set_log(util.get_logger('paramiko.transport')) + p.set_hexdump(True) + cipher = AES.new('\x00' * 16, AES.MODE_CBC, '\x55' * 16) + p.set_inbound_cipher(cipher, 16, SHA, 12, '\x1f' * 20) + + wsock.send('C\x91\x97\xbd[P\xac%\x87\xc2\xc4k\xc7\xe98\xc0' + \ + '\x90\xd2\x16V\rqsa8|L=\xfb\x97}\xe2n\x03\xb1\xa0\xc2\x1c\xd6AAL\xb4Y') + cmd, m = p.read_message() + self.assertEquals(100, cmd) + self.assertEquals(100, m.get_int()) + self.assertEquals(1, m.get_int()) + self.assertEquals(900, m.get_int()) diff --git a/tests/test_pkey.py b/tests/test_pkey.py new file mode 100644 index 0000000..e56edb1 --- /dev/null +++ b/tests/test_pkey.py @@ -0,0 +1,140 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +Some unit tests for public/private key objects. +""" + +import unittest +from paramiko import RSAKey, DSSKey, Message, util, randpool + +# from openssh's ssh-keygen +PUB_RSA = 'ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA049W6geFpmsljTwfvI1UmKWWJPNFI74+vNKTk4dmzkQY2yAMs6FhlvhlI8ysU4oj71ZsRYMecHbBbxdN79+JRFVYTKaLqjwGENeTd+yv4q+V2PvZv3fLnzApI3l7EJCqhWwJUHJ1jAkZzqDx0tyOL4uoZpww3nmE0kb3y21tH4c=' +PUB_DSS = 'ssh-dss AAAAB3NzaC1kc3MAAACBAOeBpgNnfRzr/twmAQRu2XwWAp3CFtrVnug6s6fgwj/oLjYbVtjAy6pl/h0EKCWx2rf1IetyNsTxWrniA9I6HeDj65X1FyDkg6g8tvCnaNB8Xp/UUhuzHuGsMIipRxBxw9LF608EqZcj1E3ytktoW5B5OcjrkEoz3xG7C+rpIjYvAAAAFQDwz4UnmsGiSNu5iqjn3uTzwUpshwAAAIEAkxfFeY8P2wZpDjX0MimZl5wkoFQDL25cPzGBuB4OnB8NoUk/yjAHIIpEShw8V+LzouMK5CTJQo5+Ngw3qIch/WgRmMHy4kBq1SsXMjQCte1So6HBMvBPIW5SiMTmjCfZZiw4AYHK+B/JaOwaG9yRg2Ejg4Ok10+XFDxlqZo8Y+wAAACARmR7CCPjodxASvRbIyzaVpZoJ/Z6x7dAumV+ysrV1BVYd0lYukmnjO1kKBWApqpH1ve9XDQYN8zgxM4b16L21kpoWQnZtXrY3GZ4/it9kUgyB7+NwacIBlXa8cMDL7Q/69o0d54U0X/NeX5QxuYR6OMJlrkQB7oiW/P/1mwjQgE=' +FINGER_RSA = '1024 60:73:38:44:cb:51:86:65:7f:de:da:a2:2b:5a:57:d5' +FINGER_DSS = '1024 44:78:f0:b9:a2:3c:c5:18:20:09:ff:75:5b:c1:d2:6c' +SIGNED_RSA = '20:d7:8a:31:21:cb:f7:92:12:f2:a4:89:37:f5:78:af:e6:16:b6:25:b9:97:3d:a2:cd:5f:ca:20:21:73:4c:ad:34:73:8f:20:77:28:e2:94:15:08:d8:91:40:7a:85:83:bf:18:37:95:dc:54:1a:9b:88:29:6c:73:ca:38:b4:04:f1:56:b9:f2:42:9d:52:1b:29:29:b4:4f:fd:c9:2d:af:47:d2:40:76:30:f3:63:45:0c:d9:1d:43:86:0f:1c:70:e2:93:12:34:f3:ac:c5:0a:2f:14:50:66:59:f1:88:ee:c1:4a:e9:d1:9c:4e:46:f0:0e:47:6f:38:74:f1:44:a8' + + +class KeyTest (unittest.TestCase): + + def setUp(self): + pass + + def tearDown(self): + pass + + def test_1_generate_key_bytes(self): + from Crypto.Hash import MD5 + key = util.generate_key_bytes(MD5, '\x01\x02\x03\x04', 'happy birthday', 30) + exp = util.unhexify('61E1F272F4C1C4561586BD322498C0E924672780F47BB37DDA7D54019E64') + self.assertEquals(exp, key) + + def test_2_load_rsa(self): + key = RSAKey.from_private_key_file('tests/test_rsa.key') + self.assertEquals('ssh-rsa', key.get_name()) + exp_rsa = FINGER_RSA.split()[1].replace(':', '') + my_rsa = util.hexify(key.get_fingerprint()).lower() + self.assertEquals(exp_rsa, my_rsa) + self.assertEquals(PUB_RSA.split()[1], key.get_base64()) + self.assertEquals(1024, key.get_bits()) + + def test_3_load_rsa_password(self): + key = RSAKey.from_private_key_file('tests/test_rsa_password.key', 'television') + self.assertEquals('ssh-rsa', key.get_name()) + exp_rsa = FINGER_RSA.split()[1].replace(':', '') + my_rsa = util.hexify(key.get_fingerprint()).lower() + self.assertEquals(exp_rsa, my_rsa) + self.assertEquals(PUB_RSA.split()[1], key.get_base64()) + self.assertEquals(1024, key.get_bits()) + + def test_4_load_dss(self): + key = DSSKey.from_private_key_file('tests/test_dss.key') + self.assertEquals('ssh-dss', key.get_name()) + exp_dss = FINGER_DSS.split()[1].replace(':', '') + my_dss = util.hexify(key.get_fingerprint()).lower() + self.assertEquals(exp_dss, my_dss) + self.assertEquals(PUB_DSS.split()[1], key.get_base64()) + self.assertEquals(1024, key.get_bits()) + + def test_5_load_dss_password(self): + key = DSSKey.from_private_key_file('tests/test_dss_password.key', 'television') + self.assertEquals('ssh-dss', key.get_name()) + exp_dss = FINGER_DSS.split()[1].replace(':', '') + my_dss = util.hexify(key.get_fingerprint()).lower() + self.assertEquals(exp_dss, my_dss) + self.assertEquals(PUB_DSS.split()[1], key.get_base64()) + self.assertEquals(1024, key.get_bits()) + + def test_6_compare_rsa(self): + # verify that the private & public keys compare equal + key = RSAKey.from_private_key_file('tests/test_rsa.key') + self.assertEquals(key, key) + pub = RSAKey(data=str(key)) + self.assert_(key.can_sign()) + self.assert_(not pub.can_sign()) + self.assertEquals(key, pub) + + def test_7_compare_dss(self): + # verify that the private & public keys compare equal + key = DSSKey.from_private_key_file('tests/test_dss.key') + self.assertEquals(key, key) + pub = DSSKey(data=str(key)) + self.assert_(key.can_sign()) + self.assert_(not pub.can_sign()) + self.assertEquals(key, pub) + + def test_8_sign_rsa(self): + # verify that the rsa private key can sign and verify + key = RSAKey.from_private_key_file('tests/test_rsa.key') + msg = key.sign_ssh_data(randpool, 'ice weasels') + self.assert_(type(msg) is Message) + msg.rewind() + self.assertEquals('ssh-rsa', msg.get_string()) + sig = ''.join([chr(int(x, 16)) for x in SIGNED_RSA.split(':')]) + self.assertEquals(sig, msg.get_string()) + msg.rewind() + pub = RSAKey(data=str(key)) + self.assert_(pub.verify_ssh_sig('ice weasels', msg)) + + def test_9_sign_dss(self): + # verify that the dss private key can sign and verify + key = DSSKey.from_private_key_file('tests/test_dss.key') + msg = key.sign_ssh_data(randpool, 'ice weasels') + self.assert_(type(msg) is Message) + msg.rewind() + self.assertEquals('ssh-dss', msg.get_string()) + # can't do the same test as we do for RSA, because DSS signatures + # are usually different each time. but we can test verification + # anyway so it's ok. + self.assertEquals(40, len(msg.get_string())) + msg.rewind() + pub = DSSKey(data=str(key)) + self.assert_(pub.verify_ssh_sig('ice weasels', msg)) + + def test_A_generate_rsa(self): + key = RSAKey.generate(1024) + msg = key.sign_ssh_data(randpool, 'jerri blank') + msg.rewind() + self.assert_(key.verify_ssh_sig('jerri blank', msg)) + + def test_B_generate_dss(self): + key = DSSKey.generate(1024) + msg = key.sign_ssh_data(randpool, 'jerri blank') + msg.rewind() + self.assert_(key.verify_ssh_sig('jerri blank', msg)) diff --git a/tests/test_rsa.key b/tests/test_rsa.key new file mode 100644 index 0000000..f50e9c5 --- /dev/null +++ b/tests/test_rsa.key @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICWgIBAAKBgQDTj1bqB4WmayWNPB+8jVSYpZYk80Ujvj680pOTh2bORBjbIAyz +oWGW+GUjzKxTiiPvVmxFgx5wdsFvF03v34lEVVhMpouqPAYQ15N37K/ir5XY+9m/ +d8ufMCkjeXsQkKqFbAlQcnWMCRnOoPHS3I4vi6hmnDDeeYTSRvfLbW0fhwIBIwKB +gBIiOqZYaoqbeD9OS9z2K9KR2atlTxGxOJPXiP4ESqP3NVScWNwyZ3NXHpyrJLa0 +EbVtzsQhLn6rF+TzXnOlcipFvjsem3iYzCpuChfGQ6SovTcOjHV9z+hnpXvQ/fon +soVRZY65wKnF7IAoUwTmJS9opqgrN6kRgCd3DASAMd1bAkEA96SBVWFt/fJBNJ9H +tYnBKZGw0VeHOYmVYbvMSstssn8un+pQpUm9vlG/bp7Oxd/m+b9KWEh2xPfv6zqU +avNwHwJBANqzGZa/EpzF4J8pGti7oIAPUIDGMtfIcmqNXVMckrmzQ2vTfqtkEZsA +4rE1IERRyiJQx6EJsz21wJmGV9WJQ5kCQQDwkS0uXqVdFzgHO6S++tjmjYcxwr3g +H0CoFYSgbddOT6miqRskOQF3DZVkJT3kyuBgU2zKygz52ukQZMqxCb1fAkASvuTv +qfpH87Qq5kQhNKdbbwbmd2NxlNabazPijWuphGTdW0VfJdWfklyS2Kr+iqrs/5wV +HhathJt636Eg7oIjAkA8ht3MQ+XSl9yIJIS8gVpbPxSw5OMfw0PjVE7tBdQruiSc +nvuQES5C9BMHjF39LZiGH1iLQy7FgdHyoP+eodI7 +-----END RSA PRIVATE KEY----- diff --git a/tests/test_rsa_password.key b/tests/test_rsa_password.key new file mode 100644 index 0000000..7713049 --- /dev/null +++ b/tests/test_rsa_password.key @@ -0,0 +1,18 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,DAA422E8A5A8EFB7 + ++nssHGmWl91IcmGiE6DdCIqGvAP04tuLh60wLjWBvdjtF9CjztPnF57xe+6pBk7o +YgF/Ry3ik9ZV9rHNcRXifDKM9crxtYlpUlkM2C0SP89sXaO0P1Q1yCnrtZUwDIKO +BNV8et5X7+AGMFsy/nmv0NFMrbpoG03Dppsloecd29NTRlIXwxHRFyHxy6BdEib/ +Dn0mEVbwg3dTvKrd/sODWR9hRwpDGM9nkEbUNJCh7vMwFKkIZZF8yqFvmGckuO5C +HZkDJ6RkEDYrSZJAavQaiOPF5bu3cHughRfnrIKVrQuTTDiWjwX9Ny8e4p4k7dy7 +rLpbPhtxUOUbpOF7T1QxljDi1Tcq3Ebk3kN/ZLPRFnDrJfyUx+m9BXmAa78Wxs/l +KaS8DTkYykd3+EGOeJFjZg2bvgqil4V+5JIt/+MQ5pZ/ui7i4GcH2bvZyGAbrXzP +3LipSAdN5RG+fViLe3HUtfCx4ZAgtU78TWJrLk2FwKQGglFxKLnswp+IKZb09rZV +uxmG4pPLUnH+mMYdiy5ugzj+5C8iZ0/IstpHVmO6GWROfedpJ82eMztTOtdhfMep +8Z3HwAwkDtksL7Gq9klb0Wq5+uRlBWetixddAvnmqXNzYhaANWcAF/2a2Hz06Rb0 +e6pe/g0Ek5KV+6YI+D+oEblG0Sr+d4NtxtDTmIJKNVkmzlhI2s53bHp6txCb5JWJ +S8mKLPBBBzaNXYd3odDvGXguuxUntWSsD11KyR6B9DXMIfWQW5dT7hp5kTMGlXWJ +lD2hYab13DCCuAkwVTdpzhHYLZyxLYoSu05W6z8SAOs= +-----END RSA PRIVATE KEY----- diff --git a/tests/test_sftp.py b/tests/test_sftp.py new file mode 100644 index 0000000..993899a --- /dev/null +++ b/tests/test_sftp.py @@ -0,0 +1,740 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +some unit tests to make sure sftp works. + +a real actual sftp server is contacted, and a new folder is created there to +do test file operations in (so no existing files will be harmed). +""" + +import logging +import os +import random +import sys +import threading +import time +import unittest + +import paramiko +from stub_sftp import StubServer, StubSFTPServer +from loop import LoopSocket + +ARTICLE = ''' +Insulin sensitivity and liver insulin receptor structure in ducks from two +genera + +T. Constans, B. Chevalier, M. Derouet and J. Simon +Station de Recherches Avicoles, Institut National de la Recherche Agronomique, +Nouzilly, France. + +Insulin sensitivity and liver insulin receptor structure were studied in +5-wk-old ducks from two genera (Muscovy and Pekin). In the fasting state, both +duck types were equally resistant to exogenous insulin compared with chicken. +Despite the low potency of duck insulin, the number of insulin receptors was +lower in Muscovy duck and similar in Pekin duck and chicken liver membranes. +After 125I-insulin cross-linking, the size of the alpha-subunit of the +receptors from the three species was 135,000. Wheat germ agglutinin-purified +receptors from the three species were contaminated by an active and unusual +adenosinetriphosphatase (ATPase) contaminant (highest activity in Muscovy +duck). Sequential purification of solubilized receptor from both duck types on +lentil and then wheat germ agglutinin lectins led to a fraction of receptors +very poor in ATPase activity that exhibited a beta-subunit size (95,000) and +tyrosine kinase activity similar to those of ATPase-free chicken insulin +receptors. Therefore the ducks from the two genera exhibit an alpha-beta- +structure for liver insulin receptors and a clear difference in the number of +liver insulin receptors. Their sensitivity to insulin is, however, similarly +decreased compared with chicken. +''' + +FOLDER = os.environ.get('TEST_FOLDER', 'temp-testing000') + +sftp = None +tc = None +g_big_file_test = True + + +class SFTPTest (unittest.TestCase): + + def init(hostname, username, keyfile, passwd): + global sftp, tc + + t = paramiko.Transport(hostname) + tc = t + try: + key = paramiko.RSAKey.from_private_key_file(keyfile, passwd) + except paramiko.PasswordRequiredException: + sys.stderr.write('\n\nparamiko.RSAKey.from_private_key_file REQUIRES PASSWORD.\n') + sys.stderr.write('You have two options:\n') + sys.stderr.write('* Use the "-K" option to point to a different (non-password-protected)\n') + sys.stderr.write(' private key file.\n') + sys.stderr.write('* Use the "-P" option to provide the password needed to unlock this private\n') + sys.stderr.write(' key.\n') + sys.stderr.write('\n') + sys.exit(1) + try: + t.connect(username=username, pkey=key) + except paramiko.SSHException: + t.close() + sys.stderr.write('\n\nparamiko.Transport.connect FAILED.\n') + sys.stderr.write('There are several possible reasons why it might fail so quickly:\n\n') + sys.stderr.write('* The host to connect to (%s) is not a valid SSH server.\n' % hostname) + sys.stderr.write(' (Use the "-H" option to change the host.)\n') + sys.stderr.write('* The username to auth as (%s) is invalid.\n' % username) + sys.stderr.write(' (Use the "-U" option to change the username.)\n') + sys.stderr.write('* The private key given (%s) is not accepted by the server.\n' % keyfile) + sys.stderr.write(' (Use the "-K" option to provide a different key file.)\n') + sys.stderr.write('\n') + sys.exit(1) + sftp = paramiko.SFTP.from_transport(t) + init = staticmethod(init) + + def init_loopback(): + global sftp, tc + + socks = LoopSocket() + sockc = LoopSocket() + sockc.link(socks) + tc = paramiko.Transport(sockc) + ts = paramiko.Transport(socks) + + host_key = paramiko.RSAKey.from_private_key_file('tests/test_rsa.key') + ts.add_server_key(host_key) + event = threading.Event() + server = StubServer() + ts.set_subsystem_handler('sftp', paramiko.SFTPServer, StubSFTPServer) + ts.start_server(event, server) + tc.connect(username='slowdive', password='pygmalion') + event.wait(1.0) + + sftp = paramiko.SFTP.from_transport(tc) + init_loopback = staticmethod(init_loopback) + + def set_big_file_test(onoff): + global g_big_file_test + g_big_file_test = onoff + set_big_file_test = staticmethod(set_big_file_test) + + def setUp(self): + global FOLDER + for i in xrange(1000): + FOLDER = FOLDER[:-3] + '%03d' % i + try: + sftp.mkdir(FOLDER) + break + except (IOError, OSError): + pass + + def tearDown(self): + sftp.rmdir(FOLDER) + + def test_1_file(self): + """ + verify that we can create a file. + """ + f = sftp.open(FOLDER + '/test', 'w') + try: + self.assertEqual(f.stat().st_size, 0) + f.close() + finally: + sftp.remove(FOLDER + '/test') + + def test_2_close(self): + """ + verify that closing the sftp session doesn't do anything bad, and that + a new one can be opened. + """ + global sftp + sftp.close() + try: + sftp.open(FOLDER + '/test2', 'w') + self.fail('expected exception') + except: + pass + sftp = paramiko.SFTP.from_transport(tc) + + def test_3_write(self): + """ + verify that a file can be created and written, and the size is correct. + """ + f = sftp.open(FOLDER + '/duck.txt', 'w') + try: + f.write(ARTICLE) + f.close() + self.assertEqual(sftp.stat(FOLDER + '/duck.txt').st_size, 1483) + finally: + sftp.remove(FOLDER + '/duck.txt') + + def test_4_append(self): + """ + verify that a file can be opened for append, and tell() still works. + """ + f = sftp.open(FOLDER + '/append.txt', 'w') + try: + f.write('first line\nsecond line\n') + self.assertEqual(f.tell(), 23) + f.close() + + f = sftp.open(FOLDER + '/append.txt', 'a+') + f.write('third line!!!\n') + self.assertEqual(f.tell(), 37) + self.assertEqual(f.stat().st_size, 37) + f.seek(-26, f.SEEK_CUR) + self.assertEqual(f.readline(), 'second line\n') + f.close() + finally: + sftp.remove(FOLDER + '/append.txt') + + def test_5_rename(self): + """ + verify that renaming a file works. + """ + f = sftp.open(FOLDER + '/first.txt', 'w') + try: + f.write('content!\n'); + f.close() + sftp.rename(FOLDER + '/first.txt', FOLDER + '/second.txt') + try: + f = sftp.open(FOLDER + '/first.txt', 'r') + self.assert_(False, 'no exception on reading nonexistent file') + except IOError: + pass + f = sftp.open(FOLDER + '/second.txt', 'r') + f.seek(-6, f.SEEK_END) + self.assertEqual(f.read(4), 'tent') + f.close() + finally: + try: + sftp.remove(FOLDER + '/first.txt') + except: + pass + try: + sftp.remove(FOLDER + '/second.txt') + except: + pass + + def test_6_folder(self): + """ + create a temporary folder, verify that we can create a file in it, then + remove the folder and verify that we can't create a file in it anymore. + """ + sftp.mkdir(FOLDER + '/subfolder') + f = sftp.open(FOLDER + '/subfolder/test', 'w') + f.close() + sftp.remove(FOLDER + '/subfolder/test') + sftp.rmdir(FOLDER + '/subfolder') + try: + f = sftp.open(FOLDER + '/subfolder/test') + # shouldn't be able to create that file + self.assert_(False, 'no exception at dummy file creation') + except IOError: + pass + + def test_7_listdir(self): + """ + verify that a folder can be created, a bunch of files can be placed in it, + and those files show up in sftp.listdir. + """ + try: + f = sftp.open(FOLDER + '/duck.txt', 'w') + f.close() + + f = sftp.open(FOLDER + '/fish.txt', 'w') + f.close() + + f = sftp.open(FOLDER + '/tertiary.py', 'w') + f.close() + + x = sftp.listdir(FOLDER) + self.assertEqual(len(x), 3) + self.assert_('duck.txt' in x) + self.assert_('fish.txt' in x) + self.assert_('tertiary.py' in x) + self.assert_('random' not in x) + finally: + sftp.remove(FOLDER + '/duck.txt') + sftp.remove(FOLDER + '/fish.txt') + sftp.remove(FOLDER + '/tertiary.py') + + def test_8_setstat(self): + """ + verify that the setstat functions (chown, chmod, utime) work. + """ + f = sftp.open(FOLDER + '/special', 'w') + try: + f.close() + + stat = sftp.stat(FOLDER + '/special') + sftp.chmod(FOLDER + '/special', (stat.st_mode & ~0777) | 0600) + self.assertEqual(sftp.stat(FOLDER + '/special').st_mode & 0777, 0600) + + mtime = stat.st_mtime - 3600 + atime = stat.st_atime - 1800 + sftp.utime(FOLDER + '/special', (atime, mtime)) + nstat = sftp.stat(FOLDER + '/special') + self.assertEqual(nstat.st_mtime, mtime) + self.assertEqual(nstat.st_atime, atime) + + # can't really test chown, since we'd have to know a valid uid. + finally: + sftp.remove(FOLDER + '/special') + + def test_9_readline_seek(self): + """ + create a text file and write a bunch of text into it. then count the lines + in the file, and seek around to retreive particular lines. this should + verify that read buffering and 'tell' work well together, and that read + buffering is reset on 'seek'. + """ + try: + f = sftp.open(FOLDER + '/duck.txt', 'w') + f.write(ARTICLE) + f.close() + + f = sftp.open(FOLDER + '/duck.txt', 'r+') + line_number = 0 + loc = 0 + pos_list = [] + for line in f: + line_number += 1 + pos_list.append(loc) + loc = f.tell() + f.seek(pos_list[6], f.SEEK_SET) + self.assertEqual(f.readline(), 'Nouzilly, France.\n') + f.seek(pos_list[17], f.SEEK_SET) + self.assertEqual(f.readline()[:4], 'duck') + f.seek(pos_list[10], f.SEEK_SET) + self.assertEqual(f.readline(), 'duck types were equally resistant to exogenous insulin compared with chicken.\n') + f.close() + finally: + sftp.remove(FOLDER + '/duck.txt') + + def test_A_write_seek(self): + """ + create a text file, seek back and change part of it, and verify that the + changes worked. + """ + f = sftp.open(FOLDER + '/testing.txt', 'w') + try: + f.write('hello kitty.\n') + f.seek(-5, f.SEEK_CUR) + f.write('dd') + f.close() + + self.assertEqual(sftp.stat(FOLDER + '/testing.txt').st_size, 13) + f = sftp.open(FOLDER + '/testing.txt', 'r') + data = f.read(20) + f.close() + self.assertEqual(data, 'hello kiddy.\n') + finally: + sftp.remove(FOLDER + '/testing.txt') + + def test_B_symlink(self): + """ + create a symlink and then check that lstat doesn't follow it. + """ + f = sftp.open(FOLDER + '/original.txt', 'w') + try: + f.write('original\n') + f.close() + sftp.symlink('original.txt', FOLDER + '/link.txt') + self.assertEqual(sftp.readlink(FOLDER + '/link.txt'), 'original.txt') + + f = sftp.open(FOLDER + '/link.txt', 'r') + self.assertEqual(f.readlines(), [ 'original\n' ]) + f.close() + + cwd = sftp.normalize('.') + if cwd[-1] == '/': + cwd = cwd[:-1] + abs_path = cwd + '/' + FOLDER + '/original.txt' + sftp.symlink(abs_path, FOLDER + '/link2.txt') + self.assertEqual(abs_path, sftp.readlink(FOLDER + '/link2.txt')) + + self.assertEqual(sftp.lstat(FOLDER + '/link.txt').st_size, 12) + self.assertEqual(sftp.stat(FOLDER + '/link.txt').st_size, 9) + # the sftp server may be hiding extra path members from us, so the + # length may be longer than we expect: + self.assert_(sftp.lstat(FOLDER + '/link2.txt').st_size >= len(abs_path)) + self.assertEqual(sftp.stat(FOLDER + '/link2.txt').st_size, 9) + self.assertEqual(sftp.stat(FOLDER + '/original.txt').st_size, 9) + finally: + try: + sftp.remove(FOLDER + '/link.txt') + except: + pass + try: + sftp.remove(FOLDER + '/link2.txt') + except: + pass + try: + sftp.remove(FOLDER + '/original.txt') + except: + pass + + def test_C_flush_seek(self): + """ + verify that buffered writes are automatically flushed on seek. + """ + f = sftp.open(FOLDER + '/happy.txt', 'w', 1) + try: + f.write('full line.\n') + f.write('partial') + f.seek(9, f.SEEK_SET) + f.write('?\n') + f.close() + + f = sftp.open(FOLDER + '/happy.txt', 'r') + self.assertEqual(f.readline(), 'full line?\n') + self.assertEqual(f.read(7), 'partial') + f.close() + finally: + try: + sftp.remove(FOLDER + '/happy.txt') + except: + pass + + def test_D_lots_of_files(self): + """ + create a bunch of files over the same session. + """ + global g_big_file_test + if not g_big_file_test: + return + numfiles = 100 + try: + for i in range(numfiles): + f = sftp.open('%s/file%d.txt' % (FOLDER, i), 'w', 1) + f.write('this is file #%d.\n' % i) + f.close() + sftp.chmod('%s/file%d.txt' % (FOLDER, i), 0660) + + # now make sure every file is there, by creating a list of filenmes + # and reading them in random order. + numlist = range(numfiles) + while len(numlist) > 0: + r = numlist[random.randint(0, len(numlist) - 1)] + f = sftp.open('%s/file%d.txt' % (FOLDER, r)) + self.assertEqual(f.readline(), 'this is file #%d.\n' % r) + f.close() + numlist.remove(r) + finally: + for i in range(numfiles): + try: + sftp.remove('%s/file%d.txt' % (FOLDER, i)) + except: + pass + + def test_E_big_file(self): + """ + write a 1MB file with no buffering. + """ + global g_big_file_test + if not g_big_file_test: + return + kblob = (1024 * 'x') + start = time.time() + try: + f = sftp.open('%s/hongry.txt' % FOLDER, 'w') + for n in range(1024): + f.write(kblob) + if n % 128 == 0: + sys.stderr.write('.') + f.close() + sys.stderr.write(' ') + + self.assertEqual(sftp.stat('%s/hongry.txt' % FOLDER).st_size, 1024 * 1024) + end = time.time() + sys.stderr.write('%ds ' % round(end - start)) + + start = time.time() + f = sftp.open('%s/hongry.txt' % FOLDER, 'r') + for n in range(1024): + data = f.read(1024) + self.assertEqual(data, kblob) + f.close() + + end = time.time() + sys.stderr.write('%ds ' % round(end - start)) + finally: + sftp.remove('%s/hongry.txt' % FOLDER) + + def test_F_big_file_pipelined(self): + """ + write a 1MB file, with no linefeeds, using pipelining. + """ + global g_big_file_test + if not g_big_file_test: + return + kblob = (1024 * 'x') + start = time.time() + try: + f = sftp.open('%s/hongry.txt' % FOLDER, 'w') + f.set_pipelined(True) + for n in range(1024): + f.write(kblob) + if n % 128 == 0: + sys.stderr.write('.') + f.close() + sys.stderr.write(' ') + + self.assertEqual(sftp.stat('%s/hongry.txt' % FOLDER).st_size, 1024 * 1024) + end = time.time() + sys.stderr.write('%ds ' % round(end - start)) + + start = time.time() + f = sftp.open('%s/hongry.txt' % FOLDER, 'r') + f.prefetch() + for n in range(1024): + data = f.read(1024) + self.assertEqual(data, kblob) + f.close() + + end = time.time() + sys.stderr.write('%ds ' % round(end - start)) + finally: + sftp.remove('%s/hongry.txt' % FOLDER) + + def test_G_lots_of_prefetching(self): + """ + prefetch a 1MB file a bunch of times, discarding the file object + without using it, to verify that paramiko doesn't get confused. + """ + global g_big_file_test + if not g_big_file_test: + return + kblob = (1024 * 'x') + try: + f = sftp.open('%s/hongry.txt' % FOLDER, 'w') + f.set_pipelined(True) + for n in range(1024): + f.write(kblob) + if n % 128 == 0: + sys.stderr.write('.') + f.close() + sys.stderr.write(' ') + + self.assertEqual(sftp.stat('%s/hongry.txt' % FOLDER).st_size, 1024 * 1024) + + for i in range(10): + f = sftp.open('%s/hongry.txt' % FOLDER, 'r') + f.prefetch() + f = sftp.open('%s/hongry.txt' % FOLDER, 'r') + f.prefetch() + for n in range(1024): + data = f.read(1024) + self.assertEqual(data, kblob) + if n % 128 == 0: + sys.stderr.write('.') + f.close() + sys.stderr.write(' ') + finally: + sftp.remove('%s/hongry.txt' % FOLDER) + + def test_H_big_file_big_buffer(self): + """ + write a 1MB file, with no linefeeds, and a big buffer. + """ + global g_big_file_test + if not g_big_file_test: + return + mblob = (1024 * 1024 * 'x') + try: + f = sftp.open('%s/hongry.txt' % FOLDER, 'w', 128 * 1024) + f.write(mblob) + f.close() + + self.assertEqual(sftp.stat('%s/hongry.txt' % FOLDER).st_size, 1024 * 1024) + finally: + sftp.remove('%s/hongry.txt' % FOLDER) + + def test_I_big_file_renegotiate(self): + """ + write a 1MB file, forcing key renegotiation in the middle. + """ + global g_big_file_test + if not g_big_file_test: + return + t = sftp.sock.get_transport() + t.packetizer.REKEY_BYTES = 512 * 1024 + k32blob = (32 * 1024 * 'x') + try: + f = sftp.open('%s/hongry.txt' % FOLDER, 'w', 128 * 1024) + for i in xrange(32): + f.write(k32blob) + f.close() + + self.assertEqual(sftp.stat('%s/hongry.txt' % FOLDER).st_size, 1024 * 1024) + self.assertNotEquals(t.H, t.session_id) + finally: + sftp.remove('%s/hongry.txt' % FOLDER) + t.packetizer.REKEY_BYTES = pow(2, 30) + + def test_J_realpath(self): + """ + test that realpath is returning something non-empty and not an + error. + """ + pwd = sftp.normalize('.') + self.assert_(len(pwd) > 0) + f = sftp.normalize('./' + FOLDER) + self.assert_(len(f) > 0) + self.assertEquals(os.path.join(pwd, FOLDER), f) + + def test_K_mkdir(self): + """ + verify that mkdir/rmdir work. + """ + try: + sftp.mkdir(FOLDER + '/subfolder') + except: + self.assert_(False, 'exception creating subfolder') + try: + sftp.mkdir(FOLDER + '/subfolder') + self.assert_(False, 'no exception overwriting subfolder') + except IOError: + pass + try: + sftp.rmdir(FOLDER + '/subfolder') + except: + self.assert_(False, 'exception removing subfolder') + try: + sftp.rmdir(FOLDER + '/subfolder') + self.assert_(False, 'no exception removing nonexistent subfolder') + except IOError: + pass + + def test_L_chdir(self): + """ + verify that chdir/getcwd work. + """ + root = sftp.normalize('.') + if root[-1] != '/': + root += '/' + try: + sftp.mkdir(FOLDER + '/alpha') + sftp.chdir(FOLDER + '/alpha') + sftp.mkdir('beta') + self.assertEquals(root + FOLDER + '/alpha', sftp.getcwd()) + self.assertEquals(['beta'], sftp.listdir('.')) + + sftp.chdir('beta') + f = sftp.open('fish', 'w') + f.write('hello\n') + f.close() + sftp.chdir('..') + self.assertEquals(['fish'], sftp.listdir('beta')) + sftp.chdir('..') + self.assertEquals(['fish'], sftp.listdir('alpha/beta')) + finally: + sftp.chdir(root) + try: + sftp.unlink(FOLDER + '/alpha/beta/fish') + except: + pass + try: + sftp.rmdir(FOLDER + '/alpha/beta') + except: + pass + try: + sftp.rmdir(FOLDER + '/alpha') + except: + pass + + def test_M_get_put(self): + """ + verify that get/put work. + """ + import os, warnings + warnings.filterwarnings('ignore', 'tempnam.*') + + localname = os.tempnam() + text = 'All I wanted was a plastic bunny rabbit.\n' + f = open(localname, 'w') + f.write(text) + f.close() + sftp.put(localname, FOLDER + '/bunny.txt') + + f = sftp.open(FOLDER + '/bunny.txt', 'r') + self.assertEquals(text, f.read(128)) + f.close() + + os.unlink(localname) + localname = os.tempnam() + sftp.get(FOLDER + '/bunny.txt', localname) + + f = open(localname, 'r') + self.assertEquals(text, f.read(128)) + f.close() + + os.unlink(localname) + sftp.unlink(FOLDER + '/bunny.txt') + + def test_N_check(self): + """ + verify that file.check() works against our own server. + (it's an sftp extension that we support, and may be the only ones who + support it.) + """ + f = sftp.open(FOLDER + '/kitty.txt', 'w') + f.write('here kitty kitty' * 64) + f.close() + + try: + f = sftp.open(FOLDER + '/kitty.txt', 'r') + sum = f.check('sha1') + self.assertEquals('91059CFC6615941378D413CB5ADAF4C5EB293402', paramiko.util.hexify(sum)) + sum = f.check('md5', 0, 512) + self.assertEquals('93DE4788FCA28D471516963A1FE3856A', paramiko.util.hexify(sum)) + sum = f.check('md5', 0, 0, 510) + self.assertEquals('EB3B45B8CD55A0707D99B177544A319F373183D241432BB2157AB9E46358C4AC90370B5CADE5D90336FC1716F90B36D6', + paramiko.util.hexify(sum)) + finally: + sftp.unlink(FOLDER + '/kitty.txt') + + def test_O_x_flag(self): + """ + verify that the 'x' flag works when opening a file. + """ + f = sftp.open(FOLDER + '/unusual.txt', 'wx') + f.close() + + try: + try: + f = sftp.open(FOLDER + '/unusual.txt', 'wx') + self.fail('expected exception') + except IOError, x: + pass + finally: + sftp.unlink(FOLDER + '/unusual.txt') + + def test_P_utf8(self): + """ + verify that unicode strings are encoded into utf8 correctly. + """ + f = sftp.open(FOLDER + '/something', 'w') + f.write('okay') + f.close() + + try: + sftp.rename(FOLDER + '/something', FOLDER + u'/\u00fcnic\u00f8de') + sftp.open(FOLDER + '/\xc3\xbcnic\xc3\xb8\x64\x65', 'r') + except Exception, e: + self.fail('exception ' + e) + sftp.unlink(FOLDER + '/\xc3\xbcnic\xc3\xb8\x64\x65') + diff --git a/tests/test_transport.py b/tests/test_transport.py new file mode 100644 index 0000000..5fcc786 --- /dev/null +++ b/tests/test_transport.py @@ -0,0 +1,573 @@ +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +Some unit tests for the ssh2 protocol in Transport. +""" + +import sys, time, threading, unittest +import select +from paramiko import Transport, SecurityOptions, ServerInterface, RSAKey, DSSKey, \ + SSHException, BadAuthenticationType, InteractiveQuery, util +from paramiko import AUTH_FAILED, AUTH_PARTIALLY_SUCCESSFUL, AUTH_SUCCESSFUL +from paramiko import OPEN_SUCCEEDED +from loop import LoopSocket + + +class NullServer (ServerInterface): + paranoid_did_password = False + paranoid_did_public_key = False + paranoid_key = DSSKey.from_private_key_file('tests/test_dss.key') + + def get_allowed_auths(self, username): + if username == 'slowdive': + return 'publickey,password' + if username == 'paranoid': + if not self.paranoid_did_password and not self.paranoid_did_public_key: + return 'publickey,password' + elif self.paranoid_did_password: + return 'publickey' + else: + return 'password' + if username == 'commie': + return 'keyboard-interactive' + return 'publickey' + + def check_auth_password(self, username, password): + if (username == 'slowdive') and (password == 'pygmalion'): + return AUTH_SUCCESSFUL + if (username == 'paranoid') and (password == 'paranoid'): + # 2-part auth (even openssh doesn't support this) + self.paranoid_did_password = True + if self.paranoid_did_public_key: + return AUTH_SUCCESSFUL + return AUTH_PARTIALLY_SUCCESSFUL + return AUTH_FAILED + + def check_auth_publickey(self, username, key): + if (username == 'paranoid') and (key == self.paranoid_key): + # 2-part auth + self.paranoid_did_public_key = True + if self.paranoid_did_password: + return AUTH_SUCCESSFUL + return AUTH_PARTIALLY_SUCCESSFUL + return AUTH_FAILED + + def check_auth_interactive(self, username, submethods): + if username == 'commie': + self.username = username + return InteractiveQuery('password', 'Please enter a password.', ('Password', False)) + return AUTH_FAILED + + def check_auth_interactive_response(self, responses): + if self.username == 'commie': + if (len(responses) == 1) and (responses[0] == 'cat'): + return AUTH_SUCCESSFUL + return AUTH_FAILED + + def check_channel_request(self, kind, chanid): + return OPEN_SUCCEEDED + + def check_channel_exec_request(self, channel, command): + if command != 'yes': + return False + return True + + def check_channel_shell_request(self, channel): + return True + + def check_global_request(self, kind, msg): + self._global_request = kind + return False + + +class TransportTest (unittest.TestCase): + + def setUp(self): + self.socks = LoopSocket() + self.sockc = LoopSocket() + self.sockc.link(self.socks) + self.tc = Transport(self.sockc) + self.ts = Transport(self.socks) + + def tearDown(self): + self.tc.close() + self.ts.close() + self.socks.close() + self.sockc.close() + + def test_1_security_options(self): + o = self.tc.get_security_options() + self.assertEquals(type(o), SecurityOptions) + self.assert_(('aes256-cbc', 'blowfish-cbc') != o.ciphers) + o.ciphers = ('aes256-cbc', 'blowfish-cbc') + self.assertEquals(('aes256-cbc', 'blowfish-cbc'), o.ciphers) + try: + o.ciphers = ('aes256-cbc', 'made-up-cipher') + self.assert_(False) + except ValueError: + pass + try: + o.ciphers = 23 + self.assert_(False) + except TypeError: + pass + + def test_2_compute_key(self): + self.tc.K = 123281095979686581523377256114209720774539068973101330872763622971399429481072519713536292772709507296759612401802191955568143056534122385270077606457721553469730659233569339356140085284052436697480759510519672848743794433460113118986816826624865291116513647975790797391795651716378444844877749505443714557929L + self.tc.H = util.unhexify('0C8307CDE6856FF30BA93684EB0F04C2520E9ED3') + self.tc.session_id = self.tc.H + key = self.tc._compute_key('C', 32) + self.assertEquals('207E66594CA87C44ECCBA3B3CD39FDDB378E6FDB0F97C54B2AA0CFBF900CD995', + util.hexify(key)) + + def test_3_simple(self): + """ + verify that we can establish an ssh link with ourselves across the + loopback sockets. this is hardly "simple" but it's simpler than the + later tests. :) + """ + host_key = RSAKey.from_private_key_file('tests/test_rsa.key') + public_host_key = RSAKey(data=str(host_key)) + self.ts.add_server_key(host_key) + event = threading.Event() + server = NullServer() + self.assert_(not event.isSet()) + self.assertEquals(None, self.tc.get_username()) + self.assertEquals(None, self.ts.get_username()) + self.assertEquals(False, self.tc.is_authenticated()) + self.assertEquals(False, self.ts.is_authenticated()) + self.ts.start_server(event, server) + self.tc.connect(hostkey=public_host_key, + username='slowdive', password='pygmalion') + event.wait(1.0) + self.assert_(event.isSet()) + self.assert_(self.ts.is_active()) + self.assertEquals('slowdive', self.tc.get_username()) + self.assertEquals('slowdive', self.ts.get_username()) + self.assertEquals(True, self.tc.is_authenticated()) + self.assertEquals(True, self.ts.is_authenticated()) + + def test_4_special(self): + """ + verify that the client can demand odd handshake settings, and can + renegotiate keys in mid-stream. + """ + host_key = RSAKey.from_private_key_file('tests/test_rsa.key') + public_host_key = RSAKey(data=str(host_key)) + self.ts.add_server_key(host_key) + event = threading.Event() + server = NullServer() + self.assert_(not event.isSet()) + self.ts.start_server(event, server) + options = self.tc.get_security_options() + options.ciphers = ('aes256-cbc',) + options.digests = ('hmac-md5-96',) + self.tc.connect(hostkey=public_host_key, + username='slowdive', password='pygmalion') + event.wait(1.0) + self.assert_(event.isSet()) + self.assert_(self.ts.is_active()) + self.assertEquals('aes256-cbc', self.tc.local_cipher) + self.assertEquals('aes256-cbc', self.tc.remote_cipher) + self.assertEquals(12, self.tc.packetizer.get_mac_size_out()) + self.assertEquals(12, self.tc.packetizer.get_mac_size_in()) + + self.tc.send_ignore(1024) + self.assert_(self.tc.renegotiate_keys()) + self.ts.send_ignore(1024) + + def test_5_keepalive(self): + """ + verify that the keepalive will be sent. + """ + self.tc.set_hexdump(True) + + host_key = RSAKey.from_private_key_file('tests/test_rsa.key') + public_host_key = RSAKey(data=str(host_key)) + self.ts.add_server_key(host_key) + event = threading.Event() + server = NullServer() + self.assert_(not event.isSet()) + self.ts.start_server(event, server) + self.tc.connect(hostkey=public_host_key, + username='slowdive', password='pygmalion') + event.wait(1.0) + self.assert_(event.isSet()) + self.assert_(self.ts.is_active()) + + self.assertEquals(None, getattr(server, '_global_request', None)) + self.tc.set_keepalive(1) + time.sleep(2) + self.assertEquals('keepalive@lag.net', server._global_request) + + def test_6_bad_auth_type(self): + """ + verify that we get the right exception when an unsupported auth + type is requested. + """ + host_key = RSAKey.from_private_key_file('tests/test_rsa.key') + public_host_key = RSAKey(data=str(host_key)) + self.ts.add_server_key(host_key) + event = threading.Event() + server = NullServer() + self.assert_(not event.isSet()) + self.ts.start_server(event, server) + try: + self.tc.connect(hostkey=public_host_key, + username='unknown', password='error') + self.assert_(False) + except: + etype, evalue, etb = sys.exc_info() + self.assertEquals(BadAuthenticationType, etype) + self.assertEquals(['publickey'], evalue.allowed_types) + + def test_7_bad_password(self): + """ + verify that a bad password gets the right exception, and that a retry + with the right password works. + """ + host_key = RSAKey.from_private_key_file('tests/test_rsa.key') + public_host_key = RSAKey(data=str(host_key)) + self.ts.add_server_key(host_key) + event = threading.Event() + server = NullServer() + self.assert_(not event.isSet()) + self.ts.start_server(event, server) + self.tc.ultra_debug = True + self.tc.connect(hostkey=public_host_key) + try: + self.tc.auth_password(username='slowdive', password='error') + self.assert_(False) + except: + etype, evalue, etb = sys.exc_info() + self.assertEquals(SSHException, etype) + self.tc.auth_password(username='slowdive', password='pygmalion') + event.wait(1.0) + self.assert_(event.isSet()) + self.assert_(self.ts.is_active()) + + def test_8_multipart_auth(self): + """ + verify that multipart auth works. + """ + host_key = RSAKey.from_private_key_file('tests/test_rsa.key') + public_host_key = RSAKey(data=str(host_key)) + self.ts.add_server_key(host_key) + event = threading.Event() + server = NullServer() + self.assert_(not event.isSet()) + self.ts.start_server(event, server) + self.tc.ultra_debug = True + self.tc.connect(hostkey=public_host_key) + remain = self.tc.auth_password(username='paranoid', password='paranoid') + self.assertEquals(['publickey'], remain) + key = DSSKey.from_private_key_file('tests/test_dss.key') + remain = self.tc.auth_publickey(username='paranoid', key=key) + self.assertEquals([], remain) + event.wait(1.0) + self.assert_(event.isSet()) + self.assert_(self.ts.is_active()) + + def test_9_interactive_auth(self): + """ + verify keyboard-interactive auth works. + """ + host_key = RSAKey.from_private_key_file('tests/test_rsa.key') + public_host_key = RSAKey(data=str(host_key)) + self.ts.add_server_key(host_key) + event = threading.Event() + server = NullServer() + self.assert_(not event.isSet()) + self.ts.start_server(event, server) + self.tc.ultra_debug = True + self.tc.connect(hostkey=public_host_key) + + def handler(title, instructions, prompts): + self.got_title = title + self.got_instructions = instructions + self.got_prompts = prompts + return ['cat'] + remain = self.tc.auth_interactive('commie', handler) + self.assertEquals(self.got_title, 'password') + self.assertEquals(self.got_prompts, [('Password', False)]) + self.assertEquals([], remain) + event.wait(1.0) + self.assert_(event.isSet()) + self.assert_(self.ts.is_active()) + + def test_A_interactive_auth_fallback(self): + """ + verify that a password auth attempt will fallback to "interactive" + if password auth isn't supported but interactive is. + """ + host_key = RSAKey.from_private_key_file('tests/test_rsa.key') + public_host_key = RSAKey(data=str(host_key)) + self.ts.add_server_key(host_key) + event = threading.Event() + server = NullServer() + self.assert_(not event.isSet()) + self.ts.start_server(event, server) + self.tc.ultra_debug = True + self.tc.connect(hostkey=public_host_key) + remain = self.tc.auth_password('commie', 'cat') + self.assertEquals([], remain) + event.wait(1.0) + self.assert_(event.isSet()) + self.assert_(self.ts.is_active()) + + def test_B_exec_command(self): + """ + verify that exec_command() does something reasonable. + """ + host_key = RSAKey.from_private_key_file('tests/test_rsa.key') + public_host_key = RSAKey(data=str(host_key)) + self.ts.add_server_key(host_key) + event = threading.Event() + server = NullServer() + self.assert_(not event.isSet()) + self.ts.start_server(event, server) + self.tc.ultra_debug = True + self.tc.connect(hostkey=public_host_key) + self.tc.auth_password(username='slowdive', password='pygmalion') + event.wait(1.0) + self.assert_(event.isSet()) + self.assert_(self.ts.is_active()) + + chan = self.tc.open_session() + schan = self.ts.accept(1.0) + self.assert_(not chan.exec_command('no')) + + chan = self.tc.open_session() + self.assert_(chan.exec_command('yes')) + schan = self.ts.accept(1.0) + schan.send('Hello there.\n') + schan.send_stderr('This is on stderr.\n') + schan.close() + + f = chan.makefile() + self.assertEquals('Hello there.\n', f.readline()) + self.assertEquals('', f.readline()) + f = chan.makefile_stderr() + self.assertEquals('This is on stderr.\n', f.readline()) + self.assertEquals('', f.readline()) + + # now try it with combined stdout/stderr + chan = self.tc.open_session() + self.assert_(chan.exec_command('yes')) + schan = self.ts.accept(1.0) + schan.send('Hello there.\n') + schan.send_stderr('This is on stderr.\n') + schan.close() + + chan.set_combine_stderr(True) + f = chan.makefile() + self.assertEquals('Hello there.\n', f.readline()) + self.assertEquals('This is on stderr.\n', f.readline()) + self.assertEquals('', f.readline()) + + def test_C_invoke_shell(self): + """ + verify that invoke_shell() does something reasonable. + """ + host_key = RSAKey.from_private_key_file('tests/test_rsa.key') + public_host_key = RSAKey(data=str(host_key)) + self.ts.add_server_key(host_key) + event = threading.Event() + server = NullServer() + self.assert_(not event.isSet()) + self.ts.start_server(event, server) + self.tc.ultra_debug = True + self.tc.connect(hostkey=public_host_key) + self.tc.auth_password(username='slowdive', password='pygmalion') + event.wait(1.0) + self.assert_(event.isSet()) + self.assert_(self.ts.is_active()) + + chan = self.tc.open_session() + self.assert_(chan.invoke_shell()) + schan = self.ts.accept(1.0) + chan.send('communist j. cat\n') + f = schan.makefile() + self.assertEquals('communist j. cat\n', f.readline()) + chan.close() + self.assertEquals('', f.readline()) + + def test_D_exit_status(self): + """ + verify that get_exit_status() works. + """ + host_key = RSAKey.from_private_key_file('tests/test_rsa.key') + public_host_key = RSAKey(data=str(host_key)) + self.ts.add_server_key(host_key) + event = threading.Event() + server = NullServer() + self.assert_(not event.isSet()) + self.ts.start_server(event, server) + self.tc.ultra_debug = True + self.tc.connect(hostkey=public_host_key) + self.tc.auth_password(username='slowdive', password='pygmalion') + event.wait(1.0) + self.assert_(event.isSet()) + self.assert_(self.ts.is_active()) + + chan = self.tc.open_session() + schan = self.ts.accept(1.0) + self.assert_(chan.exec_command('yes')) + schan.send('Hello there.\n') + # trigger an EOF + schan.shutdown_read() + schan.shutdown_write() + schan.send_exit_status(23) + schan.close() + + f = chan.makefile() + self.assertEquals('Hello there.\n', f.readline()) + self.assertEquals('', f.readline()) + self.assertEquals(23, chan.recv_exit_status()) + chan.close() + + def test_E_select(self): + """ + verify that select() on a channel works. + """ + host_key = RSAKey.from_private_key_file('tests/test_rsa.key') + public_host_key = RSAKey(data=str(host_key)) + self.ts.add_server_key(host_key) + event = threading.Event() + server = NullServer() + self.assert_(not event.isSet()) + self.ts.start_server(event, server) + self.tc.ultra_debug = True + self.tc.connect(hostkey=public_host_key) + self.tc.auth_password(username='slowdive', password='pygmalion') + event.wait(1.0) + self.assert_(event.isSet()) + self.assert_(self.ts.is_active()) + + chan = self.tc.open_session() + self.assert_(chan.invoke_shell()) + schan = self.ts.accept(1.0) + + # nothing should be ready + r, w, e = select.select([chan], [], [], 0.1) + self.assertEquals([], r) + self.assertEquals([], w) + self.assertEquals([], e) + + schan.send('hello\n') + + # something should be ready now (give it 1 second to appear) + for i in range(10): + r, w, e = select.select([chan], [], [], 0.1) + if chan in r: + break + time.sleep(0.1) + self.assertEquals([chan], r) + self.assertEquals([], w) + self.assertEquals([], e) + + self.assertEquals('hello\n', chan.recv(6)) + + # and, should be dead again now + r, w, e = select.select([chan], [], [], 0.1) + self.assertEquals([], r) + self.assertEquals([], w) + self.assertEquals([], e) + + schan.close() + + # detect eof? + for i in range(10): + r, w, e = select.select([chan], [], [], 0.1) + if chan in r: + break + time.sleep(0.1) + self.assertEquals([chan], r) + self.assertEquals([], w) + self.assertEquals([], e) + self.assertEquals('', chan.recv(16)) + + chan.close() + + def test_F_renegotiate(self): + """ + verify that a transport can correctly renegotiate mid-stream. + """ + host_key = RSAKey.from_private_key_file('tests/test_rsa.key') + public_host_key = RSAKey(data=str(host_key)) + self.ts.add_server_key(host_key) + event = threading.Event() + server = NullServer() + self.ts.start_server(event, server) + self.tc.connect(hostkey=public_host_key, + username='slowdive', password='pygmalion') + event.wait(1.0) + self.assert_(event.isSet()) + self.assert_(self.ts.is_active()) + + self.tc.packetizer.REKEY_BYTES = 16384 + + chan = self.tc.open_session() + self.assert_(chan.exec_command('yes')) + schan = self.ts.accept(1.0) + + self.assertEquals(self.tc.H, self.tc.session_id) + for i in range(20): + chan.send('x' * 1024) + chan.close() + + # allow a few seconds for the rekeying to complete + for i in xrange(50): + if self.tc.H != self.tc.session_id: + break + time.sleep(0.1) + self.assertNotEquals(self.tc.H, self.tc.session_id) + + schan.close() + + def test_G_compression(self): + """ + verify that zlib compression is basically working. + """ + host_key = RSAKey.from_private_key_file('tests/test_rsa.key') + public_host_key = RSAKey(data=str(host_key)) + self.ts.add_server_key(host_key) + self.ts.get_security_options().compression = ('zlib',) + self.tc.get_security_options().compression = ('zlib',) + event = threading.Event() + server = NullServer() + self.ts.start_server(event, server) + self.tc.connect(hostkey=public_host_key, + username='slowdive', password='pygmalion') + event.wait(1.0) + self.assert_(event.isSet()) + self.assert_(self.ts.is_active()) + + chan = self.tc.open_session() + self.assert_(chan.exec_command('yes')) + schan = self.ts.accept(1.0) + + bytes = self.tc.packetizer._Packetizer__sent_bytes + chan.send('x' * 1024) + bytes2 = self.tc.packetizer._Packetizer__sent_bytes + # tests show this is actually compressed to *52 bytes*! including packet overhead! nice!! :) + self.assert_(bytes2 - bytes < 1024) + + chan.close() + schan.close() diff --git a/tests/test_util.py b/tests/test_util.py new file mode 100644 index 0000000..fa8c029 --- /dev/null +++ b/tests/test_util.py @@ -0,0 +1,80 @@ +#!/usr/bin/python + +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +""" +Some unit tests for utility functions. +""" + +import cStringIO +import unittest +from Crypto.Hash import SHA +import paramiko.util + + +test_config_file = """\ +Host * + User robey + IdentityFile =~/.ssh/id_rsa + +# comment +Host *.example.com + \tUser bjork +Port=3333 +Host * + \t \t Crazy something dumb +Host spoo.example.com +Crazy something else +""" + + +class UtilTest (unittest.TestCase): + + K = 14730343317708716439807310032871972459448364195094179797249681733965528989482751523943515690110179031004049109375612685505881911274101441415545039654102474376472240501616988799699744135291070488314748284283496055223852115360852283821334858541043710301057312858051901453919067023103730011648890038847384890504L + + def setUp(self): + pass + + def tearDown(self): + pass + + def test_1_parse_config(self): + global test_config_file + f = cStringIO.StringIO(test_config_file) + config = paramiko.util.parse_ssh_config(f) + self.assertEquals(config, [ {'identityfile': '~/.ssh/id_rsa', 'host': '*', 'user': 'robey', + 'crazy': 'something dumb '}, + {'host': '*.example.com', 'user': 'bjork', 'port': '3333'}, + {'host': 'spoo.example.com', 'crazy': 'something else'}]) + + def test_2_host_config(self): + global test_config_file + f = cStringIO.StringIO(test_config_file) + config = paramiko.util.parse_ssh_config(f) + c = paramiko.util.lookup_ssh_host_config('irc.danger.com', config) + self.assertEquals(c, {'identityfile': '~/.ssh/id_rsa', 'user': 'robey', 'crazy': 'something dumb '}) + c = paramiko.util.lookup_ssh_host_config('irc.example.com', config) + self.assertEquals(c, {'identityfile': '~/.ssh/id_rsa', 'user': 'bjork', 'crazy': 'something dumb ', 'port': '3333'}) + c = paramiko.util.lookup_ssh_host_config('spoo.example.com', config) + self.assertEquals(c, {'identityfile': '~/.ssh/id_rsa', 'user': 'bjork', 'crazy': 'something else', 'port': '3333'}) + + def test_3_generate_key_bytes(self): + x = paramiko.util.generate_key_bytes(SHA, 'ABCDEFGH', 'This is my secret passphrase.', 64) + hex = ''.join(['%02x' % ord(c) for c in x]) + self.assertEquals(hex, '9110e2f6793b69363e58173e9436b13a5a4b339005741d5c680e505f57d871347b4239f14fb5c46e857d5e100424873ba849ac699cea98d729e57b3e84378e8b') -- cgit v1.2.3