π`2490` Private key material is now explicitly 'unpadded' during decryption, removing a reliance on some lax OpenSSL behavior & making us compatible with future Cryptography releases. Patch courtesy of Alex Gaynor.
:feature:`982` (via :issue:`2444`, which was a rebase of :issue:`2157`) Add support for AES-GCM encryption ciphers (128 and 256 bit variants). Thanks to Alex Gaynor for the report (& for cryptography review), Shen Cheng for the original PR, and Chris Mason for the updated PR; plus as usual to everyone who tested the patches and reported their results!
This functionality has been tested in client mode against OpenSSH 9.0, 9.2, and 9.6, as well as against a number of proprietary appliance SSH servers.
π`-` Check for
Nonetransport members inside ~paramiko.channel.Channel when closing the channel; this likely doesn't come up much in the real world, but was causing warnings in the test suite.π`2419` (fixed in :issue:`2421`) Massage our import of the TripleDES cipher to support Cryptography >=43; this should prevent
CryptographyDeprecationWarningfrom appearing upon import. Thanks to Erick Alejo for the report and Bryan Banda for the patch.π`2420` Modify a test-harness skiptest check to work with newer versions of Cryptography. Props to Paul Howarth for the patch.
π`2353` Fix a 64-bit-ism in the test suite so the tests don't encounter a false negative on 32-bit systems. Reported by Stanislav Levin.
:feature:`-` Transport grew a new
packetizer_classkwarg for overriding the packet-handler class used internally. Mostly for testing, but advanced users may find this useful when doing deep hacks.π`- major` Address CVE 2023-48795 (aka the "Terrapin Attack", a vulnerability found in the SSH protocol re: treatment of packet sequence numbers) as follows:
- The vulnerability only impacts encrypt-then-MAC digest algorithms in
tandem with CBC ciphers, and ChaCha20-poly1305; of these, Paramiko
currently only implements
hmac-sha2-(256|512)-etmin tandem withAES-CBC. If you are unable to upgrade to Paramiko versions containing the below fixes right away, you may instead use thedisabled_algorithmsconnection option to disable the ETM MACs and/or the CBC ciphers (this option is present in Paramiko >=2.6). - As the fix for the vulnerability requires both ends of the connection to
cooperate, the below changes will only take effect when the remote end is
OpenSSH >= 9.6 (or equivalent, such as Paramiko in server mode, as of
this patch version) and configured to use the new "strict kex" mode.
Paramiko will always attempt to use "strict kex" mode if offered by the
server, unless you override this by specifying
strict_kex=Falsein Transport.__init__. - Paramiko will now raise an SSHException subclass (MessageOrderError)
when protocol messages are received in unexpected order. This includes
situations like receiving
MSG_DEBUGorMSG_IGNOREduring initial key exchange, which are no longer allowed during strict mode. - Key (re)negotiation -- i.e.
MSG_NEWKEYS, whenever it is encountered -- now resets packet sequence numbers. (This should be invisible to users during normal operation, only causing exceptions if the exploit is encountered, which will usually result in, again, MessageOrderError.) - Sequence number rollover will now raise SSHException if it occurs during initial key exchange (regardless of strict mode status).
Thanks to Fabian BΓ€umer, Marcus Brinkmann, and JΓΆrg Schwenk for submitting details on the CVE prior to release.
- The vulnerability only impacts encrypt-then-MAC digest algorithms in
tandem with CBC ciphers, and ChaCha20-poly1305; of these, Paramiko
currently only implements
π`- major` Tweak
ext-info-(c|s)detection during KEXINIT protocol phase; the original implementation made assumptions based on an OpenSSH implementation detail.π`-` Cleaned up some very old root level files, mostly just to exercise some of our doc build and release machinery. This changelog entry intentionally left blank!
nothing-to-see-here-move-along.gif:feature:`1907` (solves :issue:`1992`) Add support and tests for
Match final β¦(frequently used in ProxyJump configurations to exclude the jump host) to our :ref:`SSH config parser <ssh-config-support>`. Patch by@commonism.:feature:`2058` (solves :issue:`1587` and possibly others) Add an explicit
max_concurrent_prefetch_requestsargument to paramiko.client.SSHClient.get and paramiko.client.SSHClient.getfo, allowing users to limit the number of concurrent requests used during prefetch. Patch by@kschoelhorn, with a test by@bwinston-sdp.π`- major` Fixed a very sneaky bug found at the apparently rarely-traveled intersection of
RSA-SHA2keys, certificates, SSH agents, and stricter-than-OpenSSH server targets. This manifested as yet another "well, if we turn off SHA2 at one end or another, everything works again" problem, for example with version 12 of the Teleport server endpoint.This has been fixed; Paramiko tweaked multiple aspects of how it requests agent signatures, and the agent appears to do the right thing now.
Thanks to Ryan Stoner for the bug report and testing.
π`2012 major` (also :issue:`1961` and countless others) The
server-sig-algsandRSA-SHA2features added around Paramiko 2.9 or so, had the annoying side effect of not working with servers that don't support either of those feature sets, requiring use ofdisabled_algorithmsto forcibly disable the SHA2 algorithms on Paramiko's end.The experimental ~paramiko.transport.ServiceRequestingTransport (noted in its own entry in this changelog) includes a fix for this issue, specifically by falling back to the same algorithm as the in-use pubkey if it's in the algorithm list (leaving the "first algorithm in said list" as an absolute final fallback).
:feature:`-` Implement
_fields()on ~paramiko.agent.AgentKey so that it may be compared (via==) with other ~paramiko.pkey.PKey instances.π`23 major` Since its inception, Paramiko has (for reasons lost to time) implemented authentication as a side effect of handling affirmative replies to
MSG_SERVICE_REQUESTprotocol messages. What this means is Paramiko makes one such request before everyMSG_USERAUTH_REQUEST, i.e. every auth attempt.OpenSSH doesn't care if clients send multiple service requests, but other server implementations are often stricter in what they accept after an initial service request (due to the RFCs not being clear). This can result in odd behavior when a user doesn't authenticate successfully on the very first try (for example, when the right key for a target host is the third in one's ssh-agent).
This version of Paramiko now contains an opt-in ~paramiko.transport.Transport subclass, ~paramiko.transport.ServiceRequestingTransport, which more-correctly implements service request handling in the Transport, and uses an auth-handler subclass internally which has been similarly adapted. Users wanting to try this new experimental code path may hand this class to SSHClient.connect <paramiko.client.SSHClient.connect> as its
transport_factorykwarg.Warning
This feature is EXPERIMENTAL and its code may be subject to change.
- In addition:
- minor backwards incompatible changes exist in the new code paths,
most notably the removal of the (inconsistently applied and rarely
used)
eventarguments to theauth_xxxmethods. - GSSAPI support has only been partially implemented, and is untested.
- minor backwards incompatible changes exist in the new code paths,
most notably the removal of the (inconsistently applied and rarely
used)
Note
Some minor backwards-compatible changes were made to the existing Transport and AuthHandler classes to facilitate the new code. For example,
Transport._handler_tableandAuthHandler._client_handler_tableare now properties instead of raw attributes.:feature:`387` Users of ~paramiko.client.SSHClient can now configure the authentication logic Paramiko uses when connecting to servers; this functionality is intended for advanced users and higher-level libraries such as Fabric. See ~paramiko.auth_strategy for details.
Fabric's co-temporal release includes a proof-of-concept use of this feature, implementing an auth flow much closer to that of the OpenSSH client (versus Paramiko's legacy behavior). It is strongly recommended that if this interests you, investigate replacing any direct use of
SSHClientwith Fabric'sConnection.Warning
This feature is EXPERIMENTAL; please see its docs for details.
:feature:`-` Enhanced ~paramiko.agent.AgentKey with new attributes, such as:
- Added a
commentattribute (and constructor argument); Agent.get_keys() <paramiko.agent.Agent.get_keys> now uses this kwarg to store any comment field sent over by the agent. The original version of the agent feature inexplicably did not store the comment anywhere. - Agent-derived keys now attempt to instantiate a copy of the appropriate
key class for access to other algorithm-specific members (eg key size).
This is available as the
.inner_keyattribute.
Note
This functionality is now in use in Fabric's new
--list-agent-keysfeature, as well as in Paramiko's debug logging.- Added a
:feature:`-` ~paramiko.pkey.PKey now offers convenience "meta-constructors", static methods that simplify the process of instantiating the correct subclass for a given key input.
For example, PKey.from_path <paramiko.pkey.PKey.from_path> can load a file path without knowing a priori what type of key it is (thanks to some handy methods within our cryptography dependency). Going forwards, we expect this to be the primary method of loading keys by user code that runs on "human time" (i.e. where some minor efficiencies are worth the convenience).
In addition, PKey.from_type_string <paramiko.pkey.PKey.from_type_string> now exists, and is being used in some internals to load ssh-agent keys.
As part of these changes, ~paramiko.pkey.PKey and friends grew an ~paramiko.pkey.PKey.identifiers classmethod; this is inspired by the ~paramiko.ecdsakey.ECDSAKey.supported_key_format_identifiers classmethod (which now refers to the new method.) This also includes adding a
.nameattribute to most key classes (which will eventually replace.get_name().:feature:`-` ~paramiko.pkey.PKey grew a new
.algorithm_nameproperty which displays the key algorithm; this is typically derived from the value of ~paramiko.pkey.PKey.get_name. For example, ED25519 keys have aget_nameofssh-ed25519(the SSH protocol key type field value), and now have aalgorithm_nameofED25519.:feature:`-` ~paramiko.pkey.PKey grew a new
.fingerprintproperty which emits a fingerprint string matching the SHA256+Base64 values printed by various OpenSSH tooling (egssh-add -l,ssh -v). This is intended to help troubleshoot Paramiko-vs-OpenSSH behavior and will eventually replace the venerableget_fingerprintmethod.π`- major` ~paramiko.agent.AgentKey had a dangling Python 3 incompatible
__str__method returning bytes. This method has been removed, allowing the superclass' (~paramiko.pkey.PKey) method to run instead.:feature:`2013` (solving :issue:`2009`, plus others) Add an explicit
channel_timeoutkeyword argument to paramiko.client.SSHClient.connect, allowing users to configure the previously-hardcoded default value of 3600 seconds. Thanks to@VakarisZand@ilija-lazoroskifor the report and patch, with credit to Mike Salvatore for patch review.:feature:`2173` Accept single tabs as field separators (in addition to single spaces) in <paramiko.hostkeys.HostKeyEntry.from_line> for parity with OpenSSH's KnownHosts parser. Patched by Alex Chavkin.
:support:`2178 backported` Apply
codespellto the codebase, which found a lot of very old minor spelling mistakes in docstrings. Also modernize many instances of*largsvs*argsand**kwargvs**kwargs. Patch courtesy of Yaroslav Halchenko, with review from Brian Skinn.π`2110 major` Remove some unnecessary
__repr__calls when handling bytes-vs-str conversions. This was apparently doing a lot of unintentional data processing, which adds up in some use cases -- such as SFTP transfers, which may now be significantly faster. Kudos to Shuhua Zhong for catch & patch.π`2165 major` Streamline some redundant (and costly) byte conversion calls in the packetizer and the core SFTP module. This should lead to some SFTP speedups at the very least. Thanks to Alex Gaynor for the patch.
:support:`-`
paramiko.util.retry_on_signal(and any internal uses of same, and also any internal retries ofEINTRon eg socket operations) has been removed. As of Python 3.5, per PEP 475, this functionality (and retryingEINTRgenerally) is now part of the standard library.Warning
This change is backwards incompatible if you were explicitly importing/using this particular function. The observable behavior otherwise should not be changing.
:support:`732` (also re: :issue:`630`) ~paramiko.config.SSHConfig used to straight-up delete the
proxycommandkey from config lookup results when the source config saidProxyCommand none. This has been altered to preserve the key and give it the Python valueNone, thus making the Python representation more in line with the source config file.Warning
This change is backwards incompatible if you were relying on the old (1.x, 2.x) behavior for some reason (eg assuming all
proxycommandvalues were valid subcommand strings).:support:`-` The behavior of private key classes' (ie anything inheriting from ~paramiko.pkey.PKey) private key writing methods used to perform a manual, extra
chmodcall after writing. This hasn't been strictly necessary since the mid 2.x release line (when key writing started giving themodeargument to os.open), and has now been removed entirely.This should only be observable if you were mocking Paramiko's system calls during your own testing, or similar.
:support:`-`
PKey.__cmp__has been removed. Ordering-oriented comparison of key files is unlikely to have ever made sense (the old implementation attempted to order by the hashes of the key material) and so we have not bothered setting up__lt__and friends at this time. The class continues to have its original__eq__untouched.Warning
This change is backwards incompatible if you were actually trying to sort public key objects (directly or indirectly). Please file bug reports detailing your use case if you have some intractable need for this behavior, and we'll consider adding back the necessary Python 3 magic methods so that it works as before.
π`- major` A handful of lower-level classes (notably paramiko.message.Message and paramiko.pkey.PKey) previously returned bytes objects from their implementation of
__str__, even under Python 3; and there was never any__bytes__method.These issues have been fixed by renaming
__str__to__bytes__and relying on Python's default "stringification returns the output of__repr__" behavior re: any real attempts tostr()such objects.:support:`-`
paramiko.common.asbyteshas been moved toparamiko.util.asbytes.Warning
This change is backwards incompatible if you were directly using this function (which is unlikely).
:support:`-` Remove the now irrelevant
paramiko.py3compatmodule.Warning
This change is backwards incompatible. Such references should be search-and-replaced with their modern Python 3.6+ equivalents; in some cases, still-useful methods or values have been moved to
paramiko.util(most) orparamiko.common(byte_*).:support:`-` Drop support for Python versions less than 3.6, including Python 2. So long and thanks for all the fish!
Warning
This change is backwards incompatible. However, our packaging metadata has been updated to include
python_requires, so this should not cause breakage unless you're on an old installation method that can't read this metadata.Note
As part of this change, our dependencies have been updated; eg we now require Cryptography>=3.3, up from 2.5.
:feature:`2125` (also re: :issue:`2054`) Add a
transport_factorykwarg to SSHClient.connect <paramiko.client.SSHClient.connect> for advanced users to gain more control over early Transport setup and manipulation. Thanks to Noah Pederson for the patch.π`1822` (via, and relating to, far too many other issues to mention here) Update ~paramiko.client.SSHClient so it explicitly closes its wrapped socket object upon encountering socket errors at connection time. This should help somewhat with certain classes of memory leaks, resource warnings, and/or errors (though we hasten to remind everyone that Client and Transport have their own
.close()methods for use in non-error situations!). Patch courtesy of@YoavCohen.bug:1637 (via :issue:`1599`) Raise ~paramiko.ssh_exception.SSHException explicitly when blank private key data is loaded, instead of the natural result of
IndexError. This should help more bits of Paramiko or Paramiko-adjacent codebases to correctly handle this class of error. Credit: Nicholas Dietz.π`1933` Align signature verification algorithm with OpenSSH re: zero-padding signatures which don't match their nominal size/length. This shouldn't affect most users, but will help Paramiko-implemented SSH servers handle poorly behaved clients such as PuTTY. Thanks to Jun Omae for catch & patch.
π`2017` OpenSSH 7.7 and older has a bug preventing it from understanding how to perform SHA2 signature verification for RSA certificates (specifically certs - not keys), so when we added SHA2 support it broke all clients using RSA certificates with these servers. This has been fixed in a manner similar to what OpenSSH's own client does: a version check is performed and the algorithm used is downgraded if needed. Reported by Adarsh Chauhan, with fix suggested by Jun Omae.
:support:`2038` (via :issue:`2039`) Recent versions of Cryptography have deprecated Blowfish algorithm support; in lieu of an easy method for users to remove it from the list of algorithms Paramiko tries to import and use, we've decided to remove it from our "preferred algorithms" list. This will both discourage use of a weak algorithm, and avoid warnings. Credit for report/patch goes to Mike Roest.
π`2008` (via :issue:`2010`) Windows-native SSH agent support as merged in 2.10 could encounter
Errno 22OSErrorexceptions in some scenarios (eg server not cleanly closing a relevant named pipe). This has been worked around and should be less problematic. Reported by Danilo Campana Fuchs and patched by Jun Omae.:support:`1838 backported` (via :issue:`1870`/:issue:`2028`) Update
camelCasemethod calls against thethreadingmodule to besnake_case; this and related tweaks should fix some deprecation warnings under Python 3.10. Thanks to Karthikeyan Singaravelan for the report,@Narendra-Neerukondafor the patch, and to Thomas Grainger and Jun Omae for patch workshopping.:feature:`1951` Add SSH config token expansion (eg
%h,%p) when parsingProxyJumpdirectives. Patch courtesy of Bruno Inec.π`1964` (via :issue:`2024` as also reported in :issue:`2023`) ~paramiko.pkey.PKey instances'
__eq__did not have the usual safety guard in place to ensure they were being compared to anotherPKeyobject, causing occasional spuriousBadHostKeyException(among other things). This has been fixed. Thanks to Shengdun Hua for the original report/patch and to Christopher Papke for the final version of the fix.:support:`2004` (via :issue:`2011`) Apply unittest
skipIfto tests currently using SHA1 in their critical path, to avoid failures on systems starting to disable SHA1 outright in their crypto backends (eg RHEL 9). Report & patch via Paul Howarth.π`2035` Servers offering certificate variants of hostkey algorithms (eg
ssh-rsa-cert-v01@openssh.com) could not have their host keys verified by Paramiko clients, as it only ever considered non-cert key types for that part of connection handshaking. This has been fixed.π`1963` (via :issue:`1977`) Certificate-based pubkey auth was inadvertently broken when adding SHA2 support; this has been fixed. Reported by Erik Forsberg and fixed by Jun Omae.
π`2002` (via :issue:`2003`) Switch from module-global to thread-local storage when recording thread IDs for a logging helper; this should avoid one flavor of memory leak for long-running processes. Catch & patch via Richard Kojedzinszky.
π`2001` Fix Python 2 compatibility breakage introduced in 2.10.1. Spotted by Christian Hammond.
Warning
This is almost certainly the last time we will fix Python 2 related errors! Please see the roadmap.
π`- (2.10+)` (CVE-2022-24302) Creation of new private key files using ~paramiko.pkey.PKey subclasses was subject to a race condition between file creation & mode modification, which could be exploited by an attacker with knowledge of where the Paramiko-using code would write out such files.
This has been patched by using os.open and os.fdopen to ensure new files are opened with the correct mode immediately. We've left the subsequent explicit
chmodin place to minimize any possible disruption, though it may get removed in future backwards-incompatible updates.Thanks to Jan Schejbal for the report & feedback on the solution, and to Jeremy Katz at Tidelift for coordinating the disclosure.
:feature:`1976` Add support for the
%Ctoken when parsing SSH config files. Foundational PR submitted by@jbrand42.:feature:`1509` (via :issue:`1868`, :issue:`1837`) Add support for OpenSSH's Windows agent as a fallback when Putty/WinPageant isn't available or functional. Reported by
@benj56with patches/PRs from@lewgordonand Patrick Spendrin.π`892 major` Significantly speed up low-level read/write actions on ~paramiko.sftp_file.SFTPFile objects by using bytearray/memoryview. This is unlikely to change anything for users of the higher level methods like SFTPClient.get <paramiko.sftp_client.SFTPClient.get> or SFTPClient.getfo <paramiko.sftp_client.SFTPClient.getfo>, but users of SFTPClient.open <paramiko.sftp_client.SFTPClient.open> will likely see orders of magnitude improvements for files larger than a few megabytes in size.
Thanks to
@jkjifor the original report and to Sevastian Tchernov for the patch.:support:`1985` Add
sixexplicitly to install-requires; it snuck into active use at some point but has only been indicated by transitive dependency onbcryptuntil they somewhat-recently dropped it. This will be short-lived until we drop Python 2 support. Thanks to Sondre LillebΓΈ Gundersen for catch & patch.π`-` Connecting to servers which support
server-sig-algsbut which have no overlap between that list and what a Paramiko client supports, now raise an exception instead of defaulting torsa-sha2-512(since the use ofserver-sig-algsallows us to know what the server supports).π`-` Enhanced log output when connecting to servers that do not support
server-sig-algsextensions, making the new-as-of-2.9 defaulting to SHA2 pubkey algorithms more obvious when it kicks in.π`1955` Server-side support for
rsa-sha2-256andssh-rsawasn't fully operable after 2.9.0's release (signatures for RSA pubkeys were always run throughrsa-sha2-512instead). Report and early stab at a fix courtesy of Jun Omae.:feature:`1643` (also :issue:`1925`, :issue:`1644`, :issue:`1326`) Add support for SHA-2 variants of RSA key verification algorithms (as described in RFC 8332) as well as limited SSH extension negotiation (RFC 8308).
Warning
This change is slightly backwards incompatible, insofar as action is required if your target systems do not support either RSA2 or the
server-sig-algsprotocol extension.Specifically, you need to specify
disabled_algorithms={'keys': ['rsa-sha2-256', 'rsa-sha2-512']}in either SSHClient <paramiko.client.SSHClient.__init__> or Transport <paramiko.transport.Transport.__init__>. See below for details on why.How SSH servers/clients decide when and how to use this functionality can be complicated; Paramiko's support is as follows:
Client verification of server host key during key exchange will now prefer
rsa-sha2-512,rsa-sha2-256, and legacyssh-rsaalgorithms, in that order, instead of justssh-rsa.- Note that the preference order of other algorithm families such as
ed25519andecdsahas not changed; for example, those two groups are still preferred over RSA.
- Note that the preference order of other algorithm families such as
Server mode will now offer all 3 RSA algorithms for host key verification during key exchange, similar to client mode, if it has been configured with an RSA host key.
Client mode key exchange now sends the
ext-info-cflag signaling support forMSG_EXT_INFO, and support for parsing the latter (specifically, itsserver-sig-algsflag) has been added.Client mode, when performing public key authentication with an RSA key or cert, will act as follows:
- In all cases, the list of algorithms to consider is based on the new
preferred_pubkeyslist (see below) anddisabled_algorithms(specifically, itspubkeyskey); this list, like with host keys, prefers SHA2-512, SHA2-256 and SHA1, in that order. - When the server does not send
server-sig-algs, Paramiko will attempt the first algorithm in the above list. Clients connecting to legacy servers should thus usedisabled_algorithmsto turn off SHA2. - When the server does send
server-sig-algs, the first algorithm supported by both ends is used, or if there is none, it falls back to the previous behavior.
- In all cases, the list of algorithms to consider is based on the new
SSH agent support grew the ability to specify algorithm flags when requesting private key signatures; this is now used to forward SHA2 algorithms when appropriate.
Server mode is now capable of pubkey auth involving SHA-2 signatures from clients, provided one's server implementation actually provides for doing so.
- This includes basic support for sending
MSG_EXT_INFO(containingserver-sig-algsonly) to clients advertisingext-info-cin their key exchange list.
- This includes basic support for sending
In order to implement the above, the following API additions were made:
- PKey.sign_ssh_data <paramiko.pkey.PKey>: Grew an extra, optional
algorithmkeyword argument (defaulting toNonefor most subclasses, and to"ssh-rsa"for ~paramiko.rsakey.RSAKey). - A new ~paramiko.ssh_exception.SSHException subclass was added,
~paramiko.ssh_exception.IncompatiblePeer, and is raised in all spots
where key exchange aborts due to algorithmic incompatibility.
- Like all other exceptions in that module, it inherits from
SSHException, and as we did not change anything else about the raising (i.e. the attributes and message text are the same) this change is backwards compatible.
- Like all other exceptions in that module, it inherits from
- ~paramiko.transport.Transport grew a
_preferred_pubkeysattribute and matchingpreferred_pubkeysproperty to match the other, kex-focused, such members. This allows client pubkey authentication to honor thedisabled_algorithmsfeature.
Thanks to KrisztiΓ‘n KovΓ‘cs for the report and an early stab at a patch, as well as the numerous users who submitted feedback on the issue, including but not limited to: Christopher Rabotin, Sam Bull, and Manfred Kaiser.
π`985` (via :issue:`992`) Fix listdir failure when server uses a locale. Now on Python 2.7 SFTPAttributes <paramiko.sftp_attr.SFTPAttributes> will decode abbreviated month names correctly rather than raise
UnicodeDecodeError`. Patch courtesy of Martin Packman.π`1024` Deleting items from ~paramiko.hostkeys.HostKeys would incorrectly raise KeyError even for valid keys, due to a logic bug. This has been fixed. Report & patch credit: Jia Zhang.
π`1257` (also :issue:`1266`) Update RSA and ECDSA key decoding subroutines to correctly catch exception types thrown by modern versions of Cryptography (specifically
TypeErrorand its internalUnsupportedAlgorithm). These exception classes will now become ~paramiko.ssh_exception.SSHException instances instead of bubbling up. Thanks to Ignat Semenov for the report and@tylergarcianetfor an early patch.π`-` (also :issue:`908`) Update ~paramiko.pkey.PKey and subclasses to compare (
__eq__) via direct field/attribute comparison instead of hashing (while retaining the existing behavior of__hash__via a slight refactor). Big thanks to Josh Snyder and Jun Omae for the reports, and to Josh Snyder for reproduction details & patch.Warning
This fixes a security flaw! If you are running Paramiko on 32-bit systems with low entropy (such as any 32-bit Python 2, or a 32-bit Python 3 which is running with
PYTHONHASHSEED=0) it is possible for an attacker to craft a new keypair from an exfiltrated public key, which Paramiko would consider equal to the original key.This could enable attacks such as, but not limited to, the following:
- Paramiko server processes would incorrectly authenticate the attacker (using their generated private key) as if they were the victim. We see this as the most plausible attack using this flaw.
- Paramiko client processes would incorrectly validate a connected server (when host key verification is enabled) while subjected to a man-in-the-middle attack. This impacts more users than the server-side version, but also carries higher requirements for the attacker, namely successful DNS poisoning or other MITM techniques.
:support:`-` Administrivia overhaul, including but not limited to:
- Migrate CI to CircleCI
- Primary dev branch is now
main(renamed) - Many README edits for clarity, modernization etc; including a bunch more (and consistent) status badges & unification with main project site index
- PyPI page much more fleshed out (long_description is now filled in with the README; sidebar links expanded; etc)
- flake8, pytest configs split out of setup.cfg into their own files
- Invoke/invocations (used by maintainers/contributors) upgraded to modern versions
π`1462 major` (via :issue:`1882`) Newer server-side key exchange algorithms not intended to use SHA1 (
diffie-hellman-group14-sha256,diffie-hellman-group16-sha512) were incorrectly using SHA1 after all, due to a bug causing them to ignore thehash_algoclass attribute. This has been corrected. Big thanks to@miversonfor the report and to Benno Rice for the patch.:feature:`1846` Add a
prefetchkeyword argument to SFTPClient.get <paramiko.sftp_client.SFTPClient.get>/SFTPClient.getfo <paramiko.sftp_client.SFTPClient.getfo> so users who need to skip SFTP prefetching are able to conditionally turn it off. Thanks to Github user@h3ll0rfor the PR.:support:`- backported` Update our CI to catch issues with sdist generation, installation and testing.
:support:`1727 backported` Add missing test suite fixtures directory to MANIFEST.in, reinstating the ability to run Paramiko's tests from an sdist tarball. Thanks to Sandro Tosi for reporting the issue and to Blazej Michalik for the PR.
:support:`1722 backported` Remove leading whitespace from OpenSSH RSA test suite static key fixture, to conform better to spec. Credit: Alex Gaynor.
π`-` Fix incorrect string formatting causing unhelpful error message annotation when using Kerberos/GSSAPI. (Thanks, newer version of flake8!)
π`1723` Fix incorrectly swapped order of
pandqnumbers when loading OpenSSH-format RSA private keys. At minimum this should address a slowdown when using such keys, and it also means Paramiko works with Cryptography 3.1 and above (which complains strenuously when this problem appears). Thanks to Alex Gaynor for the patch.π`1567` The new-style private key format (added in 2.7) suffered from an unpadding bug which had been fixed earlier for Ed25519 (as that key type has always used the newer format). That fix has been refactored and applied to the base key class, courtesy of Pierce Lopez.
π`1565` (via :issue:`1566`) Fix a bug in support for ECDSA keys under the newly supported OpenSSH key format. Thanks to Pierce Lopez for the patch.
:feature:`602` (via :issue:`1343`, :issue:`1313`, :issue:`618`) Implement support for OpenSSH 6.5-style private key files (typically denoted as having
BEGIN OPENSSH PRIVATE KEYheaders instead of PEM format'sBEGIN RSA PRIVATE KEYor similar). If you were getting any sort of weird auth error from "modern" keys generated on newer operating system releases (such as macOS Mojave), this is the first update to try.Major thanks to everyone who contributed or tested versions of the patch, including but not limited to: Kevin Abel, Michiel Tiller, Pierce Lopez, and Jared Hobbs.
π`- major`
ssh_config:ref:`token expansion <TOKENS>` used a different method of determining the local username ($USERenv var), compared to what the (much older) client connection code does (getpass.getuser, which includes$USERbut may check other variables first, and is generally much more comprehensive). Both modules now usegetpass.getuser.:feature:`-` A couple of outright ~paramiko.config.SSHConfig parse errors were previously represented as vanilla
Exceptioninstances; as part of recent feature work a more specific exception class, ~paramiko.ssh_exception.ConfigParseError, has been created. It is now also used in those older spots, which is naturally backwards compatible.:feature:`717` Implement support for the
Matchkeyword inssh_configfiles. Previously, this keyword was simply ignored & keywords inside such blocks were treated as if they were part of the previous block. Thanks to Michael Leinartas for the initial patchset.Note
This feature adds a new :doc:`optional install dependency </installing>`, Invoke, for managing
Match execsubprocesses.:support:`-` Additional :doc:`installation </installing>`
extras_require"flavors" (ed25519,invoke, andall) have been added to our packaging metadata; see the install docs for details.π`- major` Paramiko's use of
subprocessforProxyCommandsupport is conditionally imported to prevent issues on limited interpreter platforms like Google Compute Engine. However, any resultingImportErrorwas lost instead of preserved for raising (in the rare cases where a user tried leveragingProxyCommandin such an environment). This has been fixed.π`- major` Perform deduplication of
IdentityFilecontents duringssh_configparsing; previously, if your config would result in the same value being encountered more than once,IdentityFilewould contain that many copies of the same string.:feature:`897` Implement most 'canonical hostname'
ssh_configfunctionality (CanonicalizeHostname,CanonicalDomains,CanonicalizeFallbackLocal, andCanonicalizeMaxDots;CanonicalizePermittedCNAMEshas not yet been implemented). All were previously silently ignored. Reported by Michael Leinartas.:support:`-` Explicitly document :ref:`which ssh_config features we currently support <ssh-config-support>`. Previously users just had to guess, which is simply no good.
:feature:`-` Add new convenience classmethod constructors to ~paramiko.config.SSHConfig: ~paramiko.config.SSHConfig.from_text, ~paramiko.config.SSHConfig.from_file, and ~paramiko.config.SSHConfig.from_path. No more annoying two-step process!
:feature:`1463` Add a new keyword argument to SSHClient.connect <paramiko.client.SSHClient.connect> and ~paramiko.transport.Transport,
disabled_algorithms, which allows selectively disabling one or more kex/key/cipher/etc algorithms. This can be useful when disabling algorithms your target server (or client) does not support cleanly, or to work around unpatched bugs in Paramiko's own implementation thereof.π`1306` (via :issue:`1400`) Fix Ed25519 key handling so certain key comment lengths don't cause
SSHException("Invalid key")(this was technically a bug in how padding, or lack thereof, is calculated/interpreted). Thanks to@parkefor the bug report & Pierce Lopez for the patch.:support:`1440` (with initial fixes via :issue:`1460`) Tweak many exception classes so their string representations are more human-friendly; this also includes incidental changes to some
super()calls.The definitions of exceptions'
__init__methods have not changed, nor have any log messages been altered, so this should be backwards compatible for everything except the actual exceptions'__str__()outputs.Thanks to Fabian BΓΌchler for original report & Pierce Lopez for the foundational patch.
:support:`1311` (for :issue:`584`, replacing :issue:`1166`) Add backwards-compatible support for the
gssapiGSSAPI library, as the previous backend (python-gssapi) has since become defunct. This change also includes tests for the GSSAPI functionality.Big thanks to Anselm Kruis for the patch and to Sebastian DeiΓ (author of our initial GSSAPI functionality) for review.
Note
This feature also adds
setup.py'extras' support for installing Paramiko asparamiko[gssapi], which pulls in the optional dependencies you had to get by hand previously.Note
To be very clear, this patch does not remove support for the older
python-gssapilibrary. We may remove that support in a later release, but for now, either library will work. Please upgrade togssapiwhen you can, however, aspython-gssapiis no longer maintained upstream.π`322 major` SSHClient.exec_command <paramiko.client.SSHClient.exec_command> previously returned a naive ~paramiko.channel.ChannelFile object for its
stdinvalue; such objects don't know to properly shut down the remote end's stdin when they.close(). This lead to issues (such as hangs) when running remote commands that read from stdin.A new subclass, ~paramiko.channel.ChannelStdinFile, has been created which closes remote stdin when it itself is closed. ~paramiko.client.SSHClient.exec_command has been updated to use that class for its
stdinreturn value.Thanks to Brandon Rhodes for the report & steps to reproduce.
:feature:`1233` (also :issue:`1229`, :issue:`1332`) Add support for encrypt-then-MAC (ETM) schemes (
hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com) and two newer Diffie-Hellman group key exchange algorithms (group14, using SHA256; andgroup16, using SHA512). Patch courtesy of Edgar Sousa.:feature:`532` (via :issue:`1384` and :issue:`1258`) Add support for Curve25519 key exchange (aka
curve25519-sha256@libssh.org). Thanks to Alex Gaynor and Dan Fuhry for supplying patches.:support:`1379` (also :issue:`1369`) Raise Cryptography dependency requirement to version 2.5 (from 1.5) and update some deprecated uses of its API.
This removes a bunch of warnings of the style
CryptographyDeprecationWarning: encode_point has been deprecated on EllipticCurvePublicNumbers and will be removed in a future version. Please use EllipticCurvePublicKey.public_bytes to obtain both compressed and uncompressed point encodingand similar, which users who had eventually upgraded to Cryptography 2.x would encounter.Warning
This change is backwards incompatible if you are unable to upgrade your version of Cryptography. Please see Cryptography's own changelog for details on what may change when you upgrade; for the most part the only changes involved dropping older Python versions (such as 2.6, 3.3, or some PyPy editions) which Paramiko itself has already dropped.
:support:`1378 backported` Add support for the modern (as of Python 3.3) import location of
MutableMapping(used in host key management) to avoid the old location becoming deprecated in Python 3.8. Thanks to Josh Karpel for catch & patch.π`-` Modify protocol message handling such that
Transportdoes not respond toMSG_UNIMPLEMENTEDwith its ownMSG_UNIMPLEMENTED. This behavior probably didn't cause any outright errors, but it doesn't seem to conform to the RFCs and could cause (non-infinite) feedback loops in some scenarios (usually those involving Paramiko on both ends).π`1283` Fix exploit (CVE-2018-1000805) in Paramiko's server mode (not client mode) where hostile clients could trick the server into thinking they were authenticated without actually submitting valid authentication.
Specifically, steps have been taken to start separating client and server related message types in the message handling tables within
TransportandAuthHandler; this work is not complete but enough has been performed to close off this particular exploit (which was the only obvious such exploit for this particular channel).Thanks to Daniel Hoffman for the detailed report.
:support:`1292 backported (<2.4)` Backport changes from :issue:`979` (added in Paramiko 2.3) to Paramiko 2.0-2.2, using duck-typing to preserve backwards compatibility. This allows these older versions to use newer Cryptography sign/verify APIs when available, without requiring them (as is the case with Paramiko 2.3+).
Practically speaking, this change prevents spamming of
CryptographyDeprecationWarningnotices which pop up in the above scenario (older Paramiko, newer Cryptography).Note
This is a no-op for Paramiko 2.3+, which have required newer Cryptography releases since they were released.
:support:`1291 backported (<2.4)` Backport pytest support and application of the
blackcode formatter (both of which previously only existed in the 2.4 branch and above) to everything 2.0 and newer. This makes back/forward porting bugfixes significantly easier.:support:`1262 backported` Add
*.pubfiles to the MANIFEST so distributed source packages contain some necessary test assets. Credit: Alexander Kapshuna.:feature:`1212` Updated SSHConfig.lookup <paramiko.config.SSHConfig.lookup> so it returns a new, type-casting-friendly dict subclass (~paramiko.config.SSHConfigDict) in lieu of dict literals. This ought to be backwards compatible, and allows an easier way to check boolean or int type
ssh_configvalues. Thanks to Chris Rose for the patch.:support:`1191` Update our install docs with (somewhat) recently added additional dependencies; we previously only required Cryptography, but the docs never got updated after we incurred
bcryptandpynaclrequirements for Ed25519 key support.Additionally,
pyasn1was never actually hard-required; it was necessary during a development branch, and is used by the optional GSSAPI support, but is not required for regular installation. Thus, it has been removed from oursetup.pyand its imports in the GSSAPI code made optional.Credit to
@stevenwinfieldfor highlighting the outdated install docs.π`1175 (1.17+)` Fix a security flaw (CVE-2018-7750) in Paramiko's server mode (emphasis on server mode; this does not impact client use!) where authentication status was not checked before processing channel-open and other requests typically only sent after authenticating. Big thanks to Matthijs Kooijman for the report.
π`1168` Add newer key classes for Ed25519 and ECDSA to
paramiko.__all__so that code introspecting that attribute, or usingfrom paramiko import *(such as some IDEs) sees them. Thanks to@patriksevalliusfor the patch.π`1039` Ed25519 auth key decryption raised an unexpected exception when given a unicode password string (typical in python 3). Report by Theodor van Nahl and fix by Pierce Lopez.
:feature:`-` Add a new
passphrasekwarg to SSHClient.connect <paramiko.client.SSHClient.connect> so users may disambiguate key-decryption passphrases from password-auth passwords. (This is a backwards compatible change;passwordwill still pull double duty as a passphrase whenpassphraseis not given.):support:`-` Update
tearDownof client test suite to avoid hangs due to eternally blockingaccept()calls on the internal server thread (which can occur when test code raises an exception before actually connecting to the server.)π`1108 (1.17+)` Rename a private method keyword argument (which was named
async) so that we're compatible with the upcoming Python 3.7 release (whereasyncis a new keyword.) Thanks to@vEpiphytefor the report.:support:`1100` Updated the test suite & related docs/metadata/config to be compatible with pytest instead of using the old, custom, crufty unittest-based
test.py.This includes marking known-slow tests (mostly the SFTP ones) so they can be filtered out by
inv test's default behavior; as well as other minor tweaks to test collection and/or display (for example, GSSAPI tests are collected, but skipped, instead of not even being collected by default as intest.py.):support:`- backported` Include LICENSE file in wheel archives.
:support:`1070` Drop Python 2.6 and Python 3.3 support; now only 2.7 and 3.4+ are supported. If you're unable to upgrade from 2.6 or 3.3, please stick to the Paramiko 2.3.x (or below) release lines.
π`1071` Certificate support broke the no-certificate case for Ed25519 keys (symptom is an
AttributeErroraboutpublic_blob.) This went uncaught due to cert autoload behavior (i.e. our test suite never actually ran the no-cert case, because the cert existed!) Both issues have been fixed. Thanks to John Hu for the report.π`1065` Add rekeying support to GSSAPI connections, which was erroneously missing. Without this fix, any attempt to renegotiate the transport keys for a
gss-kex-authed ~paramiko.transport.Transport would cause a MIC failure and terminate the connection. Thanks to Sebastian DeiΓ and Anselm Kruis for the patch.:feature:`1063` Add a
gss_trust_dnsoption toClientandTransportto allow explicitly setting whether or not DNS canonicalization should occur when using GSSAPI. Thanks to Richard E. Silverman for the report & Sebastian DeiΓ for initial patchset.π`1061` Clean up GSSAPI authentication procedures so they do not prevent normal fallback to other authentication methods on failure. (In other words, presence of GSSAPI functionality on a target server precluded use of _any_ other auth type if the user was unable to pass GSSAPI auth.) Patch via Anselm Kruis.
π`1060` Fix key exchange (kex) algorithm list for GSSAPI authentication; previously, the list used solely out-of-date algorithms, and now contains newer ones listed preferentially before the old. Credit: Anselm Kruis.
π`1055 (1.17+)` (also :issue:`1056`, :issue:`1057`, :issue:`1058`, :issue:`1059`) Fix up host-key checking in our GSSAPI support, which was previously using an incorrect API call. Thanks to Anselm Kruis for the patches.
π`945 (1.18+)` (backport of :issue:`910` and re: :issue:`865`) SSHClient now requests the type of host key it has (e.g. from known_hosts) and does not consider a different type to be a "Missing" host key. This fixes a common case where an ECDSA key is in known_hosts and the server also has an RSA host key. Thanks to Pierce Lopez.
:support:`979` Update how we use Cryptography's signature/verification methods so we aren't relying on a deprecated API. Thanks to Paul Kehrer for the patch.
Warning
This bumps the minimum Cryptography version from 1.1 to 1.5. Such an upgrade should be backwards compatible and easy to do. See their changelog for additional details.
:support:`-` Ed25519 keys never got proper API documentation support; this has been fixed.
:feature:`1026` Update ~paramiko.ed25519key.Ed25519Key so its constructor offers the same
file_objparameter as its sibling key classes. Credit: Michal Kuffa.:feature:`1013` Added pre-authentication banner support for the server interface (ServerInterface.get_banner <paramiko.server.ServerInterface.get_banner> plus related support in
Transport/AuthHandler.) Patch courtesy of Dennis Kaarsemaker.π`60 major` (via :issue:`1037`) Paramiko originally defaulted to zlib compression level 9 (when one connects with
compression=True; it defaults to off.) This has been found to be quite wasteful and tends to cause much longer transfers in most cases, than is necessary.OpenSSH defaults to compression level 6, which is a much more reasonable setting (nearly identical compression characteristics but noticeably, sometimes significantly, faster transmission); Paramiko now uses this value instead.
Thanks to Damien DubΓ© for the report and
@DrNeutronfor investigating & submitting the patch.:support:`-` Display exception type and message when logging auth-rejection messages (ones reading
Auth rejected: unsupported or mangled public key); previously this error case had a bare except and did not display exactly why the key failed. It will now append info such asKeyError: 'some-unknown-type-string'or similar.:feature:`1042` (also partially :issue:`531`) Implement basic client-side certificate authentication (as per the OpenSSH vendor extension.)
The core implementation is PKey.load_certificate <paramiko.pkey.PKey.load_certificate> and its corresponding
.public_blobattribute on key objects, which is honored in the auth and transport modules. Additionally, SSHClient.connect <paramiko.client.SSHClient.connect> will now automatically load certificate data alongside private key data when one has appropriately-named cert files (e.g.id_rsa-cert.pub) - see its docstring for details.Thanks to Jason Rigby for a first draft (:issue:`531`) and to Paul Kapp for the second draft, upon which the current functionality has been based (with modifications.)
Note
This support is client-focused; Paramiko-driven server code is capable of handling cert-bearing pubkey auth packets, but it does not interpret any cert-specific fields, so the end result is functionally identical to a vanilla pubkey auth process (and thus requires e.g. prepopulated authorized-keys data.) We expect full server-side cert support to follow later.
:support:`1041` Modify logic around explicit disconnect messages, and unknown-channel situations, so that they rely on centralized shutdown code instead of running their own. This is at worst removing some unnecessary code, and may help with some situations where Paramiko hangs at the end of a session. Thanks to Paul Kapp for the patch.
:support:`1012` (via :issue:`1016`) Enhance documentation around the new SFTP.posix_rename <paramiko.sftp_client.SFTPClient.posix_rename> method so it's referenced in the 'standard'
renamemethod for increased visibility. Thanks to Marius Flage for the report.π`993` Ed25519 host keys were not comparable/hashable, causing an exception if such a key existed in a
known_hostsfile. Thanks to Oleh Prypin for the report and Pierce Lopez for the fix.π`990` The (added in 2.2.0)
bcryptdependency should have been on version 3.1.3 or greater (was initially set to 3.0.0 or greater.) Thanks to Paul Howarth for the report.π`865` SSHClient now requests the type of host key it has (e.g. from known_hosts) and does not consider a different type to be a "Missing" host key. This fixes a common case where an ECDSA key is in known_hosts and the server also has an RSA host key. Thanks to Pierce Lopez.
:support:`906 (1.18+)` Clean up a handful of outdated imports and related tweaks. Thanks to Pierce Lopez.
π`984` Enhance default cipher preference order such that
aes(192|256)-cbcare preferred overblowfish-cbc. Thanks to Alex Gaynor.π`971 (1.17+)` Allow any type implementing the buffer API to be used with BufferedFile <paramiko.file.BufferedFile>, Channel <paramiko.channel.Channel>, and SFTPFile <paramiko.sftp_file.SFTPFile>. This resolves a regression introduced in 1.13 with the Python 3 porting changes, when using types such as
memoryview. Credit: Martin Packman.π`741` (also :issue:`809`, :issue:`772`; all via :issue:`912`) Writing encrypted/password-protected private key files was silently broken since 2.0 due to an incorrect API call; this has been fixed.
Includes a directly related fix, namely adding the ability to read
AES-256-CBCciphered private keys (which is now what we tend to write out as it is Cryptography's default private key cipher.)Thanks to
@virlosfor the original report, Chris Harris and@ibulerfor initial draft PRs, and@jhgorrellfor the final patch.:feature:`65` (via :issue:`471`) Add support for OpenSSH's SFTP
posix-renameprotocol extension (section 3.3 of OpenSSH's protocol extension document), via a newposix_renamemethod in SFTPClient <paramiko.sftp_client.SFTPClient.posix_rename> and SFTPServerInterface <paramiko.sftp_si.SFTPServerInterface.posix_rename>. Thanks to Wren Turkal for the initial patch & Mika PflΓΌger for the enhanced, merged PR.:feature:`869` Add an
auth_timeoutkwarg to SSHClient.connect <paramiko.client.SSHClient.connect> (default: 30s) to avoid hangs when the remote end becomes unresponsive during the authentication step. Credit to@timsavage.Note
This technically changes behavior, insofar as very slow auth steps >30s will now cause timeout exceptions instead of completing. We doubt most users will notice; those affected can simply give a higher value to
auth_timeout.:support:`921` Tighten up the
__hash__implementation for various key classes; less code is good code. Thanks to Francisco Couzo for the patch.:support:`956 backported (1.17+)` Switch code coverage service from coveralls.io to codecov.io (& then disable the latter's auto-comments.) Thanks to Nikolai RΓΈed Kristiansen for the patch.
π`983` Move
sha1above the now-arguably-brokenmd5in the list of preferred MAC algorithms, as an incremental security improvement for users whose target systems offer both. Credit: Pierce Lopez.π`667` The RC4/arcfour family of ciphers has been broken since version 2.0; but since the algorithm is now known to be completely insecure, we are opting to remove support outright instead of fixing it. Thanks to Alex Gaynor for catch & patch.
:feature:`857` Allow SSHClient.set_missing_host_key_policy <paramiko.client.SSHClient.set_missing_host_key_policy> to accept policy classes _or_ instances, instead of only instances, thus fixing a long-standing gotcha for unaware users.
:feature:`951` Add support for ECDH key exchange (kex), specifically the algorithms
ecdh-sha2-nistp256,ecdh-sha2-nistp384, andecdh-sha2-nistp521. They now come before the olderdiffie-hellman-*family of kex algorithms in the preferred-kex list. Thanks to Shashank Veerapaneni for the patch & Pierce Lopez for a follow-up.:support:`- backported` A big formatting pass to clean up an enormous number of invalid Sphinx reference links, discovered by switching to a modern, rigorous nitpicking doc-building mode.
π`900` (via :issue:`911`) Prefer newer
ecdsa-sha2-nistpkeys over RSA and DSA keys during host key selection. This improves compatibility with OpenSSH, both in terms of general behavior, and also re: ability to properly leverage OpenSSH-modifiedknown_hostsfiles. Credit:@kasdoefor original report/PR and Pierce Lopez for the second draft.π`794` (via :issue:`981`) Prior support for
ecdsa-sha2-nistp(384|521)algorithms didn't fully extend to covering host keys, preventing connection to hosts which only offer these key types and no others. This is now fixed. Thanks to@ncoultand@kasdoefor reports and Pierce Lopez for the patch.:feature:`325` (via :issue:`972`) Add Ed25519 support, for both host keys and user authentication. Big thanks to Alex Gaynor for the patch.
Note
This change adds the
bcryptandpynaclPython libraries as dependencies. No C-level dependencies beyond those previously required (for Cryptography) have been added.:support:`974 backported` Overhaul the codebase to be PEP-8, etc, compliant (i.e. passes the maintainer's preferred flake8 configuration) and add a
flake8step to the Travis config. Big thanks to Dorian Pula!π`949 (1.17+)` SSHClient and Transport could cause a memory leak if there's a connection problem or protocol error, even if
Transport.close()is called. Thanks Kyle Agronick for the discovery and investigation, and Pierce Lopez for assistance.π`683 (1.17+)` Make
util.log_to_fileappend instead of replace. Thanks to@vlcinskyfor the report.π`853 (1.17+)` Tweak how RSAKey.__str__ <paramiko.rsakey.RSAKey> behaves so it doesn't cause
TypeErrorunder Python 3. Thanks to Francisco Couzo for the report.π`862 (1.17+)` (via :issue:`863`) Avoid test suite exceptions on platforms lacking
errno.ETIME(which seems to be some FreeBSD and some Windows environments.) Thanks to Sofian Brabez.π`44 (1.17+)` (via :issue:`891`) SSHClient <paramiko.client.SSHClient> now gives its internal Transport <paramiko.transport.Transport> a handle on itself, preventing garbage collection of the client until the session is closed. Without this, some code which returns stream or transport objects without the client that generated them, would result in premature session closure when the client was GCd. Credit:
@w31rd0for original report, Omer Anson for the patch.π`713 (<2.0)` (via :issue:`714` and :issue:`889`) Don't pass initialization vectors to PyCrypto when dealing with counter-mode ciphers; newer PyCrypto versions throw an exception otherwise (older ones simply ignored this parameter altogether). Thanks to
@jmh045000for report & patches.π`895 (1.17+)` Fix a bug in server-mode concerning multiple interactive auth steps (which were incorrectly responded to). Thanks to Dennis Kaarsemaker for catch & patch.
:support:`866 backported (1.17+)` (also :issue:`838`) Remove an old test-related file we don't support, and add PyPy to Travis-CI config. Thanks to Pierce Lopez for the final patch and Pedro Rodrigues for an earlier edition.
π`859 (1.18+)` (via :issue:`860`) A tweak to the original patch implementing :issue:`398` was not fully applied, causing calls to ~paramiko.client.SSHClient.invoke_shell to fail with
AttributeError. This has been fixed. Patch credit: Kirk Byers.π`-` Accidentally merged the new features from 1.18.0 into the 2.0.x bugfix-only branch. This included merging a bug in one of those new features (breaking ~paramiko.client.SSHClient.invoke_shell with an
AttributeError.) The offending code has been stripped out of the 2.0.x line (but of course, remains in 2.1.x and above.)π`859` (via :issue:`860`) A tweak to the original patch implementing :issue:`398` was not fully applied, causing calls to ~paramiko.client.SSHClient.invoke_shell to fail with
AttributeError. This has been fixed. Patch credit: Kirk Byers.π`802 (1.17+)` (via :issue:`804`) Update our vendored Windows API module to address errors of the form
AttributeError: 'module' object has no attribute 'c_ssize_t'. Credit to Jason R. Coombs.π`824 (1.17+)` Fix the implementation of
PKey.write_private_key_file(this method is only publicly defined on subclasses; the fix was in the private real implementation) so it passes the correct params toopen(). This bug apparently went unnoticed and unfixed for 12 entire years. Congrats to John Villalovos for noticing & submitting the patch!:support:`801 backported (1.17+)` Skip a Unix-only test when on Windows; thanks to Gabi Davar.
:support:`792 backported (1.17+)` Minor updates to the README and demos; thanks to Alan Yee.
:feature:`780 (1.18+)` (also :issue:`779`, and may help users affected by :issue:`520`) Add an optional
timeoutparameter to Transport.start_client <paramiko.transport.Transport.start_client> (and feed it the value of the configured connection timeout when used within SSHClient <paramiko.client.SSHClient>.) This helps prevent situations where network connectivity isn't timing out, but the remote server is otherwise unable to service the connection in a timely manner. Credit to@sanseihappa.π`742` (also re: :issue:`559`) Catch
AssertionErrorthrown by Cryptography when attempting to load bad ECDSA keys, turning it into anSSHException. This moves the behavior in line with other "bad keys" situations, re: Paramiko's main auth loop. Thanks to MengHuan Yu for the patch.π`789 (1.17+)` Add a missing
.closedattribute (plus._closedbecause reasons) to ProxyCommand <paramiko.proxy.ProxyCommand> so the earlier partial fix for :issue:`520` works in situations where one is gatewaying viaProxyCommand.π`334 (1.17+)` Make the
subprocessimport inproxy.pylazy so users on platforms without it (such as Google App Engine) can import Paramiko successfully. (Relatedly, make it easier to tweak an active socket check timeout [in Transport <paramiko.transport.Transport>] which was previously hardcoded.) Credit: Shinya Okano.:support:`854 backported (1.17+)` Fix incorrect docstring/param-list for Transport.auth_gssapi_keyex <paramiko.transport.Transport.auth_gssapi_keyex> so it matches the real signature. Caught by
@Score_Under.π`681 (1.17+)` Fix a Python3-specific bug re: the handling of read buffers when using
ProxyCommand. Thanks to Paul Kapp for catch & patch.:feature:`398 (1.18+)` Add an
environmentdict argument to Client.exec_command <paramiko.client.SSHClient.exec_command> (plus the lower level Channel.update_environment <paramiko.channel.Channel.update_environment> and Channel.set_environment_variable <paramiko.channel.Channel.set_environment_variable> methods) which implements theenvSSH message type. This means the remote shell environment can be set without the use ofVARNAME=valueshell tricks, provided the server'sAcceptEnvlists the variables you need to set. Thanks to Philip Lorenz for the pull request.:support:`819 backported (>=1.15,<2.0)` Document how lacking
gmpheaders at install time can cause a significant performance hit if you build PyCrypto from source. (Most system-distributed packages already have this enabled.)π`673 (1.16+)` (via :issue:`681`) Fix protocol banner read errors (
SSHException) which would occasionally pop up when usingProxyCommandgatewaying. Thanks to@Depadofor the initial report and Paul Kapp for the fix.π`774 (1.16+)` Add a
_closedprivate attribute to ~paramiko.channel.Channel objects so that they continue functioning when used as proxy sockets under Python 3 (e.g. asdirect-tcpipgateways for other Paramiko connections.)π`758 (1.16+)` Apply type definitions to
_winapimodule from jaraco.windows 3.6.1. This should address issues on Windows platforms that often result in errors likeArgumentError: [...] int too long to convert. Thanks to@swohlerLLfor the report and Jason R. Coombs for the patch.π`520 (1.16+)` (Partial fix) Fix at least one instance of race condition driven threading hangs at end of the Python interpreter session. (Includes a docs update as well - always make sure to
.close()your clients!)π`537 (1.16+)` Fix a bug in BufferedPipe.set_event <paramiko.buffered_pipe.BufferedPipe.set_event> which could cause deadlocks/hangs when one uses select.select against ~paramiko.channel.Channel objects (or otherwise calls Channel.fileno <paramiko.channel.Channel.fileno> after the channel has closed). Thanks to PrzemysΕaw Strzelczak for the report & reproduction case, and to Krzysztof Rusek for the fix.
:feature:`731` (working off the earlier :issue:`611`) Add support for 384- and 512-bit elliptic curve groups in ECDSA key types (aka
ecdsa-sha2-nistp384/ecdsa-sha2-nistp521). Thanks to Michiel Tiller and@CrazyCastafor the patches.π`670` Due to an earlier bugfix, less-specific
Hostblocks'ProxyCommandvalues were overridingProxyCommand nonein more-specificHostblocks. This has been fixed in a backwards compatible manner (i.e.ProxyCommand nonecontinues to appear as a total lack of anyproxycommandkey in parsed config structures). Thanks to Pat Brisbin for the catch.π`676` (via :issue:`677`) Fix a backwards incompatibility issue that cropped up in SFTPFile.prefetch <paramiko.sftp_file.SFTPFile.prefetch> re: the erroneously non-optional
file_sizeparameter. Should only affect users who manually callprefetch. Thanks to@stevevanhooserfor catch & patch.:feature:`394` Replace PyCrypto with the Python Cryptographic Authority (PyCA) 'Cryptography' library suite. This improves security, installability, and performance; adds PyPy support; and much more.
There aren't enough ways to thank Alex Gaynor for all of his work on this, and then his patience while the maintainer let his PR grow moss for a year and change. Paul Kehrer came in with an assist, and I think I saw Olle Lundberg,
@techtonikand@johnthagensupplying backup as well. Thanks to all!Warning
This is a backwards incompatible change.
However, it should only affect installation requirements; no API changes are intended or expected. Please report any such breakages as bugs.
See our updated :doc:`installation docs <installing>` for details on what is now required to install Paramiko; many/most users should be able to simply
pip install -U paramiko(especially if you upgrade to pip 8).π`577` (via :issue:`578`; should also fix :issue:`718`, :issue:`560`) Fix stalled/hung SFTP downloads by cleaning up some threading lock issues. Thanks to Stephen C. Pope for the patch.
π`716` Fix a Python 3 compatibility issue when handling two-factor authentication. Thanks to Mateusz Kowalski for the catch & original patch.
:support:`729 backported (>=1.15,<2.0)` Clean up
setup.pyto always usesetuptools, not doing so was a historical artifact from bygone days. Thanks to Alex Gaynor.π`649 major (==1.17)` Update the module in charge of handling SSH moduli so it's consistent with OpenSSH behavior re: prime number selection. Thanks to Damien Tournoud for catch & patch.
π`617` (aka fabric/fabric#1429; via :issue:`679`; related: :issue:`678`, :issue:`685`, :issue:`615` & :issue:`616`) Fix up ~paramiko.ssh_exception.NoValidConnectionsError so it pickles correctly, and fix a related Python 3 compatibility issue. Thanks to Rebecca Schlussel for the report & Marius Gedminas for the patch.
π`613` (via :issue:`619`) Update to
jaraco.windows3.4.1 to fix some errors related toctypeson Windows platforms. Credit to Jason R. Coombs.:support:`621 backported (>=1.15,<2.0)` Annotate some public attributes on ~paramiko.channel.Channel such as
.closed. Thanks to Sergey Vasilyev for the report.π`632` Fix logic bug in the SFTP client's callback-calling functionality; previously there was a chance the given callback would fire twice at the end of a transfer. Thanks to
@ab9-erfor catch & original patch.:support:`612 backported (>=1.15,<2.0)` Identify & work around a race condition in the test for handshake timeouts, which was causing frequent test failures for a subset of contributors as well as Travis-CI (usually, but not always, limited to Python 3.5). Props to Ed Kellett for assistance during some of the troubleshooting.
:support:`697 backported (>=1.15,<2.0)` Remove whitespace in our
setup.py'sinstall_requiresas it triggers occasional bugs in some versions ofsetuptools. Thanks to Justin Lecher for catch & original patch.π`499` Strip trailing/leading whitespace from lines when parsing SSH config files - this brings things in line with OpenSSH behavior. Thanks to Alfredo Esteban for the original report and Nick Pillitteri for the patch.
π`652` Fix behavior of
gssapi-with-micauth requests so they fail gracefully (allowing followup via other auth methods) instead of raising an exception. Patch courtesy of@jamercee.:feature:`588 (==1.17)` Add missing file-like object methods for ~paramiko.file.BufferedFile and ~paramiko.sftp_file.SFTPFile. Thanks to Adam Meily for the patch.
:support:`636 backported (>=1.15,<2.0)` Clean up and enhance the README (and rename it to
README.rstfrom justREADME). Thanks to@LucasRMehl.π`194 major` (also :issue:`562`, :issue:`530`, :issue:`576`) Streamline use of
statwhen downloading SFTP files via SFTPClient.get <paramiko.sftp_client.SFTPClient.get>; this avoids triggering bugs in some off-spec SFTP servers such as IBM Sterling. Thanks to@muraleeefor the initial report and to Torkil Gustavsen for the patch.:feature:`467` (also :issue:`139`, :issue:`412`) Fully enable two-factor authentication (e.g. when a server requires
AuthenticationMethods pubkey,keyboard-interactive). Thanks to@perryjrandallfor the patch and to@nevins-band Matt Robenolt for additional support.π`502 major` Fix 'exec' requests in server mode to use
get_stringinstead ofget_textto avoidUnicodeDecodeErroron non-UTF-8 input. Thanks to Anselm Kruis for the patch & discussion.π`401` Fix line number reporting in log output regarding invalid
known_hostsline entries. Thanks to Dylan Thacker-Smith for catch & patch.:support:`525 backported` Update the vendored Windows API addon to a more recent edition. Also fixes :issue:`193`, :issue:`488`, :issue:`498`. Thanks to Jason Coombs.
π`366` Fix ~paramiko.sftp_attr.SFTPAttributes so its string representation doesn't raise exceptions on empty/initialized instances. Patch by Ulrich Petri.
π`359` Use correct attribute name when trying to use Python 3's
int.bit_lengthmethod; prior to fix, the Python 2 custom fallback implementation was always used, even on Python 3. Thanks to Alex Gaynor.:support:`594 backported` Correct some post-Python3-port docstrings to specify
bytestype instead ofstr. Credit to@redixin.π`565` Don't explode with
IndexErrorwhen reading private key files lacking an-----END <type> PRIVATE KEY-----footer. Patch courtesy of Prasanna Santhanam.:feature:`604` Add support for the
aes192-ctrandaes192-cbcciphers. Thanks to Michiel Tiller for noticing it was as easy as tweaking some key sizes :D:feature:`356` (also :issue:`596`, :issue:`365`, :issue:`341`, :issue:`164`, :issue:`581`, and a bunch of other duplicates besides) Add support for SHA-2 based key exchange (kex) algorithm
diffie-hellman-group-exchange-sha256and (H)MAC algorithmshmac-sha2-256andhmac-sha2-512.This change includes tweaks to debug-level logging regarding algorithm-selection handshakes; the old all-in-one log line is now multiple easier-to-read, printed-at-handshake-time log lines.
Thanks to the many people who submitted patches for this functionality and/or assisted in testing those patches. That list includes but is not limited to, and in no particular order: Matthias Witte, Dag Wieers, Ash Berlin, Etienne Perot, Gert van Dijk,
@GuyShaanan, Aaron Bieber,@cyphase, and Eric Brown.:support:`554 backported` Fix inaccuracies in the docstring for the ECDSA key class. Thanks to Jared Hance for the patch.
:support:`516 backported` Document ~paramiko.agent.AgentRequestHandler. Thanks to
@toejoughfor report & suggestions.π`496 (1.15+)` Fix a handful of small but critical bugs in Paramiko's GSSAPI support (note: this includes switching from PyCrypo's Random to os.urandom). Thanks to Anselm Kruis for catch & patch.
π`491` (combines :issue:`62` and :issue:`439`) Implement timeout functionality to address hangs from dropped network connections and/or failed handshakes. Credit to
@vazirand@dacutfor the original patches and to Olle Lundberg for reimplementation.π`490` Skip invalid/unparsable lines in
known_hostsfiles, instead of raising ~paramiko.ssh_exception.SSHException. This brings Paramiko's behavior more in line with OpenSSH, which silently ignores such input. Catch & patch courtesy of Martin Topholm.π`404` Print details when displaying ~paramiko.ssh_exception.BadHostKeyException objects (expected vs received data) instead of just "hey shit broke". Patch credit: Loic Dachary.
π`469` (also :issue:`488`, :issue:`461` and like a dozen others) Fix a typo introduced in the 1.15 release which broke WinPageant support. Thanks to everyone who submitted patches, and to Steve Cohen who was the lucky winner of the cherry-pick lottery.
π`353` (via :issue:`482`) Fix a bug introduced in the Python 3 port which caused
OverFlowError(and other symptoms) in SFTP functionality. Thanks to@dborehamfor leading the troubleshooting charge, and to Scott Maxwell for the final patch.:support:`582` Fix some old
setup.pyrelated helper code which was breakingbdist_dumbon Mac OS X. Thanks to Peter Odding for the patch.π`22 major` Try harder to connect to multiple network families (e.g. IPv4 vs IPv6) in case of connection issues; this helps with problems such as hosts which resolve both IPv4 and IPv6 addresses but are only listening on IPv4. Thanks to Dries Desmet for original report and Torsten Landschoff for the foundational patchset.
π`402` Check to see if an SSH agent is actually present before trying to forward it to the remote end. This replaces what was usually a useless
TypeErrorwith a human-readable ~paramiko.ssh_exception.AuthenticationException. Credit to Ken Jordan for the fix and Yvan Marques for original report.π`413` (also :issue:`414`, :issue:`420`, :issue:`454`) Be significantly smarter about polling & timing behavior when running proxy commands, to avoid unnecessary (often 100%!) CPU usage. Major thanks to Jason Dunsmore for report & initial patchset and to Chris Adams & John Morrissey for followup improvements.
π`455` Tweak packet size handling to conform better to the OpenSSH RFCs; this helps address issues with interactive program cursors. Courtesy of Jeff Quast.
π`428` Fix an issue in ~paramiko.file.BufferedFile (primarily used in the SFTP modules) concerning incorrect behavior by ~paramiko.file.BufferedFile.readlines on files whose size exceeds the buffer size. Thanks to
@achappfor catch & patch.π`415` Fix
ssh_configparsing to correctly interpretProxyCommand noneas the lack of a proxy command, instead of as a literal command string of"none". Thanks to Richard Spiers for the catch & Sean Johnson for the fix.:support:`431 backported` Replace handrolled
ssh_configparsing code with use of theshlexmodule. Thanks to Yan Kalchevskiy.:support:`422 backported` Clean up some unused imports. Courtesy of Olle Lundberg.
:support:`421 backported` Modernize threading calls to use newer API. Thanks to Olle Lundberg.
:support:`419 backported` Modernize a bunch of the codebase internals to leverage decorators. Props to
@beckjakefor realizing we're no longer on Python 2.2 :Dπ`266` Change numbering of ~paramiko.transport.Transport channels to start at 0 instead of 1 for better compatibility with OpenSSH & certain server implementations which break on 1-indexed channels. Thanks to
@egroeperfor catch & patch.π`459` Tighten up agent connection closure behavior to avoid spurious
ResourceWarningdisplay in some situations. Thanks to@tkrappfor the catch.π`429` Server-level debug message logging was overlooked during the Python 3 compatibility update; Python 3 clients attempting to log SSH debug packets encountered type errors. This is now fixed. Thanks to
@mjmaenpaafor the catch.π`320` Update our win_pageant module to be Python 3 compatible. Thanks to
@sherbangand@adamkerzfor the patches.π`399` SSH agent forwarding (potentially other functionality as well) would hang due to incorrect values passed into the new window size arguments for ~paramiko.transport.Transport (thanks to a botched merge). This has been corrected. Thanks to Dylan Thacker-Smith for the report & patch.
:feature:`167` Add ~paramiko.config.SSHConfig.get_hostnames for easier introspection of a loaded SSH config file or object. Courtesy of SΓΈren LΓΈvborg.
:support:`393` Replace internal use of PyCrypto's
SHA.newwith the stdlib'shashlib.sha1. Thanks to Alex Gaynor.:feature:`267` (also :issue:`250`, :issue:`241`, :issue:`228`) Add GSS-API / SSPI (e.g. Kerberos) key exchange and authentication support (:ref:`installation docs here <gssapi>`). Mega thanks to Sebastian DeiΓ, with assist by Torsten Landschoff.
Note
Unix users should be aware that the
python-gssapilibrary (a requirement for using this functionality) only appears to support Python 2.7 and up at this time.π`346 major` Fix an issue in private key files' encryption salts that could cause tracebacks and file corruption if keys were re-encrypted. Credit to Xavier Nunn.
:feature:`362` Allow users to control the SSH banner timeout. Thanks to Cory Benfield.
:feature:`372` Update default window & packet sizes to more closely adhere to the pertinent RFC; also expose these settings in the public API so they may be overridden by client code. This should address some general speed issues such as :issue:`175`. Big thanks to Olle Lundberg for the update.
π`373 major` Attempt to fix a handful of issues (such as :issue:`354`) related to infinite loops and threading deadlocks. Thanks to Olle Lundberg as well as a handful of community members who provided advice & feedback via IRC.
:support:`374` (also :issue:`375`) Old code cleanup courtesy of Olle Lundberg.
:support:`377` Factor ~paramiko.channel.Channel openness sanity check into a decorator. Thanks to Olle Lundberg for original patch.
π`298 major` Don't perform point validation on ECDSA keys in
known_hostsfiles, since a) this can cause significant slowdown when such keys exist, and b)known_hostsfiles are implicitly trustworthy. Thanks to Kieran Spear for catch & patch.Note
This change bumps up the version requirement for the
ecdsalibrary to0.11.π`234 major` Lower logging levels for a few overly-noisy log messages about secure channels. Thanks to David Pursehouse for noticing & contributing the fix.
:feature:`218` Add support for ECDSA private keys on the client side. Thanks to
@aszligfor the patch.π`335 major` Fix ECDSA key generation (generation of brand new ECDSA keys was broken previously). Thanks to
@solarwfor catch & patch.:feature:`184` Support quoted values in SSH config file parsing. Credit to Yan Kalchevskiy.
:feature:`131` Add a ~paramiko.sftp_client.SFTPClient.listdir_iter method to ~paramiko.sftp_client.SFTPClient allowing for more efficient, async/generator based file listings. Thanks to John Begeman.
:support:`378 backported` Minor code cleanup in the SSH config module courtesy of Olle Lundberg.
:support:`249 backported` Consolidate version information into one spot. Thanks to Gabi Davar for the reminder.
π`376` Be less aggressive about expanding variables in
ssh_configfiles, which results in a speedup of SSH config parsing. Credit to Olle Lundberg.:support:`324 backported` A bevvy of documentation typo fixes, courtesy of Roy Wellington.
π`312` paramiko.transport.Transport had a bug in its
__repr__which surfaces during errors encountered within its__init__, causing problematic tracebacks in such situations. Thanks to Simon Percivall for catch & patch.π`272` Fix a bug where
known_hostsparsing hashed the input hostname as well as the hostnames from theknown_hostsfile, on every comparison. Thanks to@sigmunaufor final patch and@ostaceyfor the original report.π`239` Add Windows-style CRLF support to SSH config file parsing. Props to Christopher Swenson.
:support:`229 backported` Fix a couple of incorrectly-copied docstrings'
.. versionadded::RST directives. Thanks to Aarni Koskela for the catch.:support:`169 backported` Minor refactor of paramiko.sftp_client.SFTPClient.put thanks to Abhinav Upadhyay.
π`285` (also :issue:`352`) Update our Python 3
b()compatibility shim to handlebufferobjects correctly; this fixes a frequently reported issue affecting many users, including users of thebzrsoftware suite. Thanks to@basictheprogramfor the initial report, Jelmer Vernooij for the fix and Andrew Starr-Bochicchio & Jeremy T. Bouse (among others) for discussion & feedback.:support:`371` Add Travis support & docs update for Python 3.4. Thanks to Olle Lundberg.
π`-` paramiko.file.BufferedFile.read incorrectly returned text strings after the Python 3 migration, despite bytes being more appropriate for file contents (which may be binary or of an unknown encoding.) This has been addressed.
Note
paramiko.file.BufferedFile.readline continues to return strings, not bytes, as "lines" only make sense for textual data. It assumes UTF-8 by default.
This should fix this issue raised on the Obnam mailing list. Thanks to Antoine Brenner for the patch.
π`-` Added self.args for exception classes. Used for unpickling. Related to (Fabric #986, Fabric #714). Thanks to Alex Plugaru.
π`-` Fix logging error in sftp_client for filenames containing the '%' character. Thanks to Antoine Brenner.
π`308` Fix regression in dsskey.py that caused sporadic signature verification failures. Thanks to Chris Rose.
:support:`299` Use deterministic signatures for ECDSA keys for improved security. Thanks to Alex Gaynor.
:support:`297` Replace PyCrypto's
Randomwith os.urandom for improved speed and security. Thanks again to Alex.:support:`295` Swap out a bunch of PyCrypto hash functions with use of hashlib. Thanks to Alex Gaynor.
:support:`290` (also :issue:`292`) Add support for building universal (Python 2+3 compatible) wheel files during the release process. Courtesy of Alex Gaynor.
:support:`284` Add Python language trove identifiers to
setup.py. Thanks to Alex Gaynor for catch & patch.π`235` Improve string type testing in a handful of spots (e.g.
s/if type(x) is str/if isinstance(x, basestring)/g.) Thanks to@ksamuelfor the report.:feature:`16` Python 3 support! Our test suite passes under Python 3, and it (& Fabric's test suite) continues to pass under Python 2. Python 2.5 is no longer supported with this change!
The merged code was built on many contributors' efforts, both code & feedback. In no particular order, we thank Daniel Goertzen, Ivan Kolodyazhny, Tomi PievilΓ€inen, Jason R. Coombs, Jan N. Schulze,
@Lazik, Dorian Pula, Scott Maxwell, Tshepang Lekhonkhobe, Aaron Meurer, and Dave Halter.:support:`256 backported` Convert API documentation to Sphinx, yielding a new API docs website to replace the old Epydoc one. Thanks to Olle Lundberg for the initial conversion work.
π`-` Use constant-time hash comparison operations where possible, to protect against timing-based attacks. Thanks to Alex Gaynor for the patch.
:feature:`58` Allow client code to access the stored SSH server banner via Transport.get_banner <paramiko.transport.Transport.get_banner>. Thanks to
@Jhoanorfor the patch.π`252` (Fabric #1020) Enhanced the implementation of
ProxyCommandto avoid a deadlock/hang condition that frequently occurs atTransportshutdown time. Thanks to Mateusz Kobos, Matthijs van der Vleuten and Guillaume Zitta for the original reports and to Marius Gedminas for helping test nontrivial use cases.π`268` Fix some missed renames of
ProxyCommandrelated error classes. Thanks to Marius Gedminas for catch & patch.π`34` (PR :issue:`35`) Fix SFTP prefetching incompatibility with some SFTP servers regarding request/response ordering. Thanks to Richard Kettlewell.
π`193` (and its attentant PRs :issue:`230` & :issue:`253`) Fix SSH agent problems present on Windows. Thanks to David Hobbs for initial report and to Aarni Koskela & Olle Lundberg for the patches.
π`225 (1.12+)` Note ecdsa requirement in README. Thanks to Amaury Rodriguez for the catch.
π`176` Fix AttributeError bugs in known_hosts file (re)loading. Thanks to Nathan Scowcroft for the patch & Martin Blumenstingl for the initial test case.
:feature:`152` Add tentative support for ECDSA keys. This adds the ecdsa module as a new dependency of Paramiko. The module is available at warner/python-ecdsa on Github and ecdsa on PyPI.
- Note that you might still run into problems with key negotiation -- Paramiko picks the first key that the server offers, which might not be what you have in your known_hosts file.
- Mega thanks to Ethan Glasser-Camp for the patch.
:feature:`136` Add server-side support for the SSH protocol's 'env' command. Thanks to Benjamin Pollack for the patch.
π`156 (1.11+)` Fix potential deadlock condition when using Channel objects as sockets (e.g. when using SSH gatewaying). Thanks to Steven Noonan and Frank Arnold for catch & patch.
π`179` Fix a missing variable causing errors when an ssh_config file has a non-default AddressFamily set. Thanks to Ed Marshall & Tomaz Muraus for catch & patch.
π`200` Fix an exception-causing typo in
demo_simple.py. Thanks to Alex Buchanan for catch & Dave Foster for patch.π`199` Typo fix in the license header cross-project. Thanks to Armin Ronacher for catch & patch.
π`162` Clean up HMAC module import to avoid deadlocks in certain uses of SSHClient. Thanks to Gernot Hillier for the catch & suggested fix.
π`36` Fix the port-forwarding demo to avoid file descriptor errors. Thanks to Jonathan Halcrow for catch & patch.
π`168` Update config handling to properly handle multiple 'localforward' and 'remoteforward' keys. Thanks to Emre YΔ±lmaz for the patch.
π`98 major` On Windows, when interacting with the PuTTY PAgeant, Paramiko now creates the shared memory map with explicit Security Attributes of the user, which is the same technique employed by the canonical PuTTY library to avoid permissions issues when Paramiko is running under a different UAC context than the PuTTY Ageant process. Thanks to Jason R. Coombs for the patch.
:support:`100` Remove use of PyWin32 in
win_pageantmodule. Module was already dependent on ctypes for constructing appropriate structures and had ctypes implementations of all functionality. Thanks to Jason R. Coombs for the patch.π`87 major` Ensure updates to
known_hostsfiles account for any updates to said files after Paramiko initially read them. (Includes related fix to guard against duplicate entries during subsequentknown_hostsloads.) Thanks to@sunweaverfor the contribution.π`153` (also :issue:`67`) Warn on parse failure when reading known_hosts file. Thanks to
@glassercfor patch.π`146` Indentation fixes for readability. Thanks to Abhinav Upadhyay for catch & patch.
π`142` (Fabric #811) SFTP put of empty file will still return the attributes of the put file. Thanks to Jason R. Coombs for the patch.
π`154` (Fabric #876) Forwarded SSH agent connections left stale local pipes lying around, which could cause local (and sometimes remote or network) resource starvation when running many agent-using remote commands. Thanks to Kevin Tegtmeier for catch & patch.
:feature:`66` Batch SFTP writes to help speed up file transfers. Thanks to Olle Lundberg for the patch.
π`133 major` Fix handling of window-change events to be on-spec and not attempt to wait for a response from the remote sshd; this fixes problems with less common targets such as some Cisco devices. Thanks to Phillip Heller for catch & patch.
:feature:`93` Overhaul SSH config parsing to be in line with
man ssh_config(& the behavior ofsshitself), including addition of parameter expansion within config values. Thanks to Olle Lundberg for the patch.:feature:`110` Honor SSH config
AddressFamilysetting when looking up local host's FQDN. Thanks to John Hensley for the patch.:feature:`128` Defer FQDN resolution until needed, when parsing SSH config files. Thanks to Parantapa Bhattacharya for catch & patch.
π`102 major` Forego random padding for packets when running under
*-ctrciphers. This corrects some slowdowns on platforms where random byte generation is inefficient (e.g. Windows). Thanks to@warthog618for catch & patch, and Michael van der Kolff for code/technique review.:feature:`127` Turn
SFTPFileinto a context manager. Thanks to Michael Williamson for the patch.:feature:`116` Limit
Message.get_bytesto an upper bound of 1MB to protect against potential DoS vectors. Thanks to@mvschaikfor catch & patch.:feature:`115` Add convenience
get_ptykwarg toClient.exec_commandso users not manually controlling a channel object can still toggle PTY creation. Thanks to Michael van der Kolff for the patch.:feature:`71` Add
SFTPClient.putfoand.getfomethods to allow direct uploading/downloading of file-like objects. Thanks to Eric Buehl for the patch.:feature:`113` Add
timeoutparameter toSSHClient.exec_commandfor easier setting of the command's internal channel object's timeout. Thanks to Cernov Vladimir for the patch.:support:`94` Remove duplication of SSH port constant. Thanks to Olle Lundberg for the catch.
:feature:`80` Expose the internal "is closed" property of the file transfer class
BufferedFileas.closed, better conforming to Python's file interface. Thanks to@smunautand James Hiscock for catch & patch.