From 0147fdb6202ef51ffbd540f47b5ba247e8a3ec5f Mon Sep 17 00:00:00 2001 From: Ofer Koren Date: Wed, 20 Sep 2023 14:40:42 +0300 Subject: [PATCH 1/2] lock setuptools-scm to avoid compatibility issue https://github.com/pypa/setuptools_scm/issues/905 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 7f03dc928..590a354b0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ requires = [ "setuptools>=42", "wheel", - "setuptools_scm[toml]>=3.4.3" + "setuptools_scm[toml]<8.0.0" ] build-backend = "setuptools.build_meta" From ae4dba38003ce6334e631601195b1747167517d9 Mon Sep 17 00:00:00 2001 From: Shlomi Romano Date: Tue, 15 Apr 2025 13:52:19 +0300 Subject: [PATCH 2/2] plumbum/ssh_machine: Add ipv6 support to scp commands --- plumbum/machines/ssh_machine.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/plumbum/machines/ssh_machine.py b/plumbum/machines/ssh_machine.py index 648b0efbf..f5799a738 100644 --- a/plumbum/machines/ssh_machine.py +++ b/plumbum/machines/ssh_machine.py @@ -1,4 +1,5 @@ import warnings +import ipaddress from plumbum.commands import ProcessExecutionError, shquote from plumbum.lib import IS_WIN32 @@ -32,6 +33,12 @@ def close(self): """Closes(terminates) the tunnel""" self._session.close() +def is_ipv6_address(addr: str) -> bool: + try: + ipaddress.IPv6Address(addr) + return True + except ValueError: + return False class SshMachine(BaseRemoteMachine): """ @@ -109,6 +116,9 @@ def __init__( self._fqhost = f"{user}@{host}" else: self._fqhost = host + # if the host is an IPv6 address, we need to wrap it in brackets for scp command (upload / download functions) + scp_host = f'[{self.host}]' if not self.host.startswith('[') and is_ipv6_address(self.host) else self.host + self.scp_fqhost = f"{user}@{scp_host}" if user else scp_host if port: ssh_args.extend(["-p", str(port)]) scp_args.extend(["-P", str(port)]) @@ -307,7 +317,7 @@ def download(self, src, dst): if IS_WIN32: src = self._translate_drive_letter(src) dst = self._translate_drive_letter(dst) - self._scp_command(f"{self._fqhost}:{shquote(src)}", dst) + self._scp_command(f"{self.scp_fqhost}:{shquote(src)}", dst) def upload(self, src, dst): if isinstance(src, RemotePath): @@ -319,7 +329,7 @@ def upload(self, src, dst): if IS_WIN32: src = self._translate_drive_letter(src) dst = self._translate_drive_letter(dst) - self._scp_command(src, f"{self._fqhost}:{shquote(dst)}") + self._scp_command(src, f"{self.scp_fqhost}:{shquote(dst)}") class PuttyMachine(SshMachine):