6 from argparse
import ArgumentError
7 from itertools
import chain
8 from pathlib
import Path
9 from socketserver
import BaseRequestHandler
, TCPServer
10 from subprocess
import DEVNULL
, PIPE
, Popen
, check_output
, run
13 REMOTE_HOST
= "localhost"
15 AUTH_SOCK_DIR_PATTERN
= re
.compile(r
"ssh-")
16 AUTH_SOCK_PATTERN
= re
.compile(f
"agent.[0-9]+$")
19 class ReusableTCPServer(TCPServer
):
20 allow_reuse_address
= True
23 def check_ssh_auth_sock(**kwargs
):
28 universal_newlines
=True,
32 completed
.returncode
== 0
33 or completed
.stdout
.rstrip() == "The agent has no identities."
37 def get_ssh_auth_sock():
38 if "SSH_AUTH_SOCK" in os
.environ
and check_ssh_auth_sock():
39 return os
.environ
["SSH_AUTH_SOCK"]
40 for q
in chain
.from_iterable(
42 for p
in Path(os
.environ
.get("TMPDIR") or "/tmp").iterdir()
43 if p
.is_dir() and AUTH_SOCK_DIR_PATTERN
.match(p
.name
)
48 and AUTH_SOCK_PATTERN
.fullmatch(q
.name
)
49 and check_ssh_auth_sock(env
={**os.environ, "SSH_AUTH_SOCK": q_str}
)
52 print("starting new ssh-agent")
54 ["bash", "-c", '. <(ssh-agent); echo "${SSH_AUTH_SOCK}"'],
55 universal_newlines
=True,
59 def create_tcp_server(server_address
, data
):
60 if not isinstance(data
, bytes):
63 class RequestHandler(BaseRequestHandler
):
65 self
.request
.sendall(data
)
67 return ReusableTCPServer(server_address
, RequestHandler
)
71 print(f
"{sys.argv[0]} [-h|--help] [--sudo] ssh-args script")
72 print("\t-h, --help display this help message")
73 print("\t--sudo run remote script as root")
74 print("\tssh-args arguments passed to ssh; include a hostname here")
75 print("\tscript script to run remotely")
81 raise ArgumentError(None, "No host specified")
82 if "--help" in args
or "-h" in args
:
90 environ
= {**os.environ, "SSH_AUTH_SOCK": get_ssh_auth_sock()}
91 run(["ssh-add", "id_ed25519"], stderr
=DEVNULL
, env
=environ
)
92 with open(sys
.argv
[-1], "rb") as fh
:
93 with create_tcp_server(("127.0.0.1", int(PORT
)), fh
.read()) as server
:
98 ":".join((PORT
, REMOTE_HOST
, REMOTE_PORT
)),
103 f
"{sudo}bash -c '. <(cat </dev/tcp/{REMOTE_HOST}/{REMOTE_PORT})'",
107 server
.handle_request()
111 if __name__
== "__main__":