{"id":15400500,"url":"https://github.com/whisperity/distcc-driver","last_synced_at":"2026-04-07T08:32:14.427Z","repository":{"id":241129467,"uuid":"799929217","full_name":"whisperity/distcc-driver","owner":"whisperity","description":"Driving DistCC-based distributed C/C++ compilation in a smarter way: without having to deal with DISTCC_HOSTS intricacies and without accidentally stalling your development machine.","archived":false,"fork":false,"pushed_at":"2024-06-17T11:44:58.000Z","size":106,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-28T00:41:52.809Z","etag":null,"topics":["bash","bash-script","c","clang","compiler","compiler-frontend","cplusplus","cpp","developer-environment","developer-tools","distcc","distributed-computing","driver","gcc","linux","load-balancing","zsh","zsh-script"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/whisperity.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-05-13T11:30:41.000Z","updated_at":"2024-06-17T11:42:57.000Z","dependencies_parsed_at":"2024-05-22T15:50:45.957Z","dependency_job_id":"0a02b6ca-9d51-4314-9678-9f2baa112e79","html_url":"https://github.com/whisperity/distcc-driver","commit_stats":{"total_commits":41,"total_committers":1,"mean_commits":41.0,"dds":0.0,"last_synced_commit":"fb429b7b76c99e9a4751cf06f85e281d7f1f7ff4"},"previous_names":["whisperity/distcc-driver"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/whisperity/distcc-driver","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whisperity%2Fdistcc-driver","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whisperity%2Fdistcc-driver/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whisperity%2Fdistcc-driver/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whisperity%2Fdistcc-driver/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/whisperity","download_url":"https://codeload.github.com/whisperity/distcc-driver/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whisperity%2Fdistcc-driver/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31506562,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T03:10:19.677Z","status":"ssl_error","status_checked_at":"2026-04-07T03:10:13.982Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bash","bash-script","c","clang","compiler","compiler-frontend","cplusplus","cpp","developer-environment","developer-tools","distcc","distributed-computing","driver","gcc","linux","load-balancing","zsh","zsh-script"],"created_at":"2024-10-01T15:54:03.740Z","updated_at":"2026-04-07T08:32:14.400Z","avatar_url":"https://github.com/whisperity.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"Smart [DistCC](http://distcc.org) driver\n========================================\n\n`distcc.sh` \u0026mdash; DistCC remote auto-job script\n\n\nSummary\n-------\n\nAutomatically distribute a C/C++ compilation over a DistCC-based cluster with job-count load balancing.\n\n\n```bash\nexport DISTCC_AUTO_HOSTS=\"worker-1 worker-2 worker-3\"\nsource distcc.sh; distcc_build make target1 target2 ...\n```\n\n\n\nDescription\n-----------\n\nThis script allows remotely building C/C++ projects through a _`distcc`_ cluster.\nHowever, instead of requiring the user to manually configure `DISTCC_HOSTS`, which has a required and non-trivial format (such as specifying the number of jobs to dispatch to a server) and making sure that the called build system is also given an appropriate `--jobs N` parameter, this script automatically balances the available server list, prevents dispatching to servers that do not reply to jobs, and selects the appropriate job count to drive the build with.\n\nIt is expected to call this script by prefixing a build command with the wrapper function's name, and specifying the hosts where _`distccd`_ servers are listening.\nThe called build tool should allow receiving a `-j` parameter, followed by a number.\n\n\n```bash\nDISTCC_AUTO_HOSTS=\"server-1 server-2\" distcc_build make foo\n```\n\n\nIn this case, the real call under the hood will expand to something appropriate, such as:\n\n\n```bash\nDISTCC_HOSTS=\"localhost/8 server-1/16,lzo server-2/8,lzo\" make foo -j 32\n```\n\n\n\nInstallation\n------------\n\nFirst, download the contents of this repository and put it to a location where it is out of view.\nIn this guide, `~/.local/lib/distcc-driver` will be used.\nThe _DistCC_ client binary, _`distcc`_, should be available in **`PATH`** as well.\n\n\n```bash\ngit clone http://github.com/whisperity/DistCC-Driver.git ~/.local/lib/distcc-driver\nsudo apt-get -y install --no-install-recommends distcc\n```\n\n\nThen, add the **wrapper script** appropriate for the Shell you are using to your Shell's configuration file.\nYou might also set the default for [`DISTCC_AUTO_HOSTS`](#configuration-environment-variables) in this file as well.\n\nLoading the wrapper script into your Shell makes it expose the **`distcc_build`** function, which should be used as a prefix to the build system invocation when executing builds.\n\n\n### [Bash](http://gnu.org/software/bash)\n\nAdd the following to the end of `~/.bashrc`:\n\n\n```bash\nsource \"~/.local/lib/distcc-driver/distcc.sh\"\n\n# Example:\nexport DISTCC_AUTO_HOSTS=\"worker-1.mycompany.com worker-2.mycompany.com\"\n```\n\n\n\n### [Zsh](http://zsh.org)\n\nAdd the following to the end of `~/.zshrc`:\n\n\n```bash\nsource \"~/.local/lib/distcc-driver/distcc.zsh\"\n\n# Example:\nexport DISTCC_AUTO_HOSTS=\"worker-1.mycompany.com worker-2.mycompany.com\"\n```\n\n\n\nConfiguring C/C++ projects for using `distcc`\n---------------------------------------------\n\n\n\u003e [!TIP]\n\u003e\n\u003e Compilation with a _DistCC_ cluster works best if you have sufficient storage space to afford [_CCache_](http://ccache.dev) as well.\n\u003e [Read further instructions one § later!](#with-ccache)\n\n\nUnfortunately, just having `distcc` installed will not \"magically\" make an actual execution of a build, especially when ran through a build system, _use `distcc`_.\nThe local environment must be configured to take the compilers through _DistCC_'s path.\n\nFirst, ensure that you have the compilers you intend to use installed on the system.\nThen, execute `sudo update-distcc-symlinks`, which will emit symbolic links under `/usr/lib/distcc`, each bearing the name of a compiler.\nThe easiest way to then configure your build is adding this directory to the _`PATH`_ **prior to** the _\"`configure`\"_ execution:\n\n\n```bash\nsudo update-distcc-symlinks\nexport PATH=\"/usr/lib/distcc:${PATH}\"\n\n# When the tools query the path of \"gcc\" or something else, they will find it in\n# the /usr/lib/distcc directory.\n\n# For autotools-based projects:\nconfigure\n\n# For CMake-based projects:\ncmake ../path/to/source\n\n\n# To drive the build after configuring:\nDISTCC_AUTO_HOSTS=\"...\" distcc_build make my_target\n```\n\n\nWith this approach, the build systems and tools (_`autoconf`_, _`cmake`_, _`make`_, _`ninja`_, etc.) will believe `/usr/lib/distcc/gcc` is **the** compiler (whereas this path actually points to the `distcc` binary, which will do the right thing by dispatching to the compiler!), and, **in general, no other, build-system-specific changes are needed** to successfully compile the project.\n\nAlternatively, you may specify the path of the _\"masqueraded\"_ compiler manually.\n(See _§ MASQUERADE_ in _`man 1 distcc`_ for further details.)\n\n\n```bash\n# For autotools-based projects:\nCC=\"/usr/lib/distcc/gcc\" CXX=\"/usr/lib/distcc/g++\" configure\n\n# For CMake-based projects:\ncmake ../path/to/source \\\n  -DCMAKE_C_COMPILER=\"/usr/lib/distcc/gcc\" \\\n  -DCMAKE_CXX_COMPILER=\"/usr/lib/distcc/g++\"\n\n\n# To drive the build after configuring:\nDISTCC_AUTO_HOSTS=\"...\" distcc_build make my_target\n```\n\n\n\n### With [`ccache`](http://ccache.dev)\n\nIt is **very recommended** to use `distcc` together with [`ccache`](http://ccache.dev) in order to prevent the distribution of compilations of files that did not change to remote workers.\n\nIn order to use this feature, **both** _CCache_ and _DistCC_ have to be installed, and, just like in the previous example, the project needs to be configured with the appropriate paths to the compilers.\nHowever, **_CCache_ must take priority** for this combined pipeline to work.\n\nFirst, ensure that you have the compilers you intend to use installed on the system.\nThen, execute `sudo update-ccache-symlinks` **and** `sudo update-distcc-symlinks`, which will emit symbolic links under both `/usr/lib/ccache` and `/usr/lib/distcc`, each bearing the name of a compiler.\nThe easiest way to then configure your build is adding _CCache_'s directory to the _`PATH`_ **prior to** the _\"`configure`\"_ execution.\n_DistCC_'s directory should be left out of `PATH` in this case.\n\n\n```bash\nsudo apt-get -y install --no-install-recommends ccache distcc\nsudo update-ccache-symlinks\nsudo update-distcc-symlinks\nexport PATH=\"/usr/lib/ccache:${PATH}\"\n\n# For autotools-based projects:\nconfigure\n\n# For CMake-based projects:\ncmake ../path/to/source\n\n\n# To drive the build after configuring:\nDISTCC_AUTO_HOSTS=\"...\" distcc_build make my_target\n```\n\n\nSimilarly to _DistCC_, _CCache_ employs the compiler _masquerading_ feature (see _§ RUN MODES_ in _`man 1 ccache`_), and you may specify the path to the symbolic link of compiler manually:\n\n\n```bash\n# For autotools-based projects:\nCC=\"/usr/lib/ccache/gcc\" CXX=\"/usr/lib/ccache/g++\" configure\n\n# For CMake-based projects:\ncmake ../path/to/source \\\n  -DCMAKE_C_COMPILER=\"/usr/lib/ccache/gcc\" \\\n  -DCMAKE_CXX_COMPILER=\"/usr/lib/ccache/g++\"\n\n\n# To drive the build after configuring:\nDISTCC_AUTO_HOSTS=\"...\" distcc_build make my_target\n```\n\n\n\nConfiguration environment variables\n-----------------------------------\n\n| Variable | Explanation | Default |\n|:-------- |:------------|:-------:|\n| _`DISTCC_HOSTS`_ | The original, official remote worker _\"HOST SPECIFICATION\"_ as used by DistCC.\u003cbr /\u003e\u003cbr /\u003e**⚠️ This variable is _IGNORED_ and _OVERWRITTEN_ by this script!** | _(Inoperative.)_ |\n| **`DISTCC_AUTO_HOSTS`** | The list of hosts to check and balance the number of running compilations against. See the exact format below, under [_HOST SPECIFICATION_](#host-specification). Compared to _`DISTCC_HOSTS`_ (**NOT** used by this script!), the number of available job slots on the server need not be specified. | _(Nothing, **must** be specified.)_ |\n| `DISTCC_AUTO_COMPILER_MEMORY` | The amount of memory **in MiB** that is expected to be consumed by a **single** compiler process, on average.\u003cbr /\u003e\u003cbr /\u003eThis value is used to scale the number of jobs dispatched to a worker, if such calculation is applicable. It is usually not necessary to tweak this value prior to encountering performance issues.\u003cbr /\u003e\u003cbr /\u003e💡 Set to `0` to _disable_ the automatic scaling. | `1024`\u003cbr /\u003e(**1 GiB** of memory)\u003cbr /\u003e\u003cbr /\u003e💡 This value was empirically verified to be sufficient during the compilation of a large project such as [_LLVM_](http://github.com/llvm/llvm-project). |\n| `DISTCC_AUTO_EARLY_LOCAL_JOBS` | The number of jobs to run in parallel **WITHOUT** distributing them to a worker, entirely on the local machine. The local invocation of the compilers will take priority over any remote compilation, which enables not loading the network with jobs if only a few actual compilations would be executed by the build system.\u003cbr /\u003e\u003cbr /\u003eIt is recommended to set this to a small value, e.g., `2` or `4`, depending on project-specific conditions.\u003cbr /\u003e\u003cbr /\u003eℹ️ This configuration is respected only if **at least one** remote worker is available. | `0`\u003cbr /\u003e(**NO** local compilations, except for _fallback_ or _failed-job-retry_, as employed by _`distcc`_.) |\n| `DISTCC_AUTO_FALLBACK_LOCAL_JOBS` | The number of jobs to run in parallel locally (without distributing them to a worker) in case **NO REMOTE WORKERS** are available at all.\u003cbr /\u003eSet to `0` to completely **DISABLE** local-only builds and trigger an error exit instead. | _`$(nproc)`_\u003cbr /\u003e(The number of CPU threads available on the local machine.) |\n| `DISTCC_AUTO_PREPROCESSOR_SATURATION_JOBS` | In case there is **AT LEAST ONE** remote worker available, add the specified number of additional jobs that can be spawned in parallel by the build system. These jobs will run the compilation up to the successful preprocessing phase, at which point DistCC will block them until a local worker thread (see _`DISTCC_AUTO_EARLY_LOCAL_JOBS`_) is available to compile them, or a remote machine returns a job and can be sent the next job.\u003cbr /\u003eThis setting allows the local computer to keep a constant supply of pending jobs ready to be dispatched, instead of waiting for an actual compilation (local or remote) to finish before starting the preparation of the next job.\u003cbr /\u003e\u003cbr /\u003e💡 Set to `0` to _disable_ local preprocessor saturation.\u003cbr /\u003e\u003cbr /\u003e⚠️ As preprocessing is cheap in terms of CPU use and has a barely noticeable overhead on memory, disabling this feature is **NOT RECOMMENDED**, unless the local machine is known to be very weak. It is recommended to keep this feature enabled if the local machine stores source code on a slow-to-access device, e.g., [_HDDs_](http://en.wikipedia.org/wiki/Hard_disk_drive) or [_NFS_](http://en.wikipedia.org/wiki/Network_File_System). | _`$(nproc)`_\u003cbr /\u003e(The number of CPU threads available on the local machine.) |\n\n\nHost specification\n------------------\n\nThe contents of the **`DISTCC_AUTO_HOSTS`** environment variable is the primary configuration option that **MUST** be set by the user prior to using this script.\nThe host list is a white-space separated list of individual worker host specification entries, which are composed of (usually) a host name and, optionally, the remote server's port number.\n\nThe value is expected to adhere to the following syntax:\n\n\n~~~~\nDISTCC_AUTO_HOSTS = AUTO_HOST_SPEC ...\nAUTO_HOST_SPEC    = TCP_HOST\n                  | SSH_HOST\nTCP_HOST          = [tcp://]HOSTNAME[:DISTCC_PORT[:STATS_PORT]]\nSSH_HOST          = ssh://[SSH_USER@]HOSTNAME[:SSH_PORT][/DISTCC_PORT[/STATS_PORT]]\nHOSTNAME          = ALPHANUMERIC_HOSTNAME\n                  | IPv4_ADDRESS\n                  | IPv6_ADDRESS\n~~~~\n\n\nIn the above grammar, the meaning of the individual non-terminals are as described below, with examples.\n\n| Grammar element | Description | Example |\n|:----------------|:------------|:-------:|\n| `ALPHANUMERIC_HOSTNAME` | A \"string\" hostname identifying the address of a worker machine. The address is resolved naturally and in the _`resolv.conf`_ context of the local machine, as if by the _`ping`_, [_`wget`_](http://gnu.org/software/wget), [_`curl`_](http://curl.se) utilities. | `\"server\"`\u003cbr /\u003e`\"compiler-worker-1.internal.mycompany.org\"` |\n| `IPv4_ADDRESS` | The literal [_IPv4_](http://en.wikipedia.org/wiki/IPv4) address. | `192.168.1.8` |\n| `IPv6_ADDRESS` | The literal [_IPv6_](http://en.wikipedia.org/wiki/IPv6) address, enclosed in _square brackets_ (`[]`). | `[ff06::c3]` |\n| `DISTCC_PORT` | The port of the DistCC daemon's TCP job socket. | `3632` |\n| `STATS_PORT` | The port of the DistCC daemon's statistics response socket.\u003cbr /\u003e**⚠️ The _DistCC_ server _MUST_ support and be started with the `--stats` and optional `--stats-port PORT` arguments!** | `3633` |\n| `SSH_USER` | The username to use when logging in over [SSH](http://en.wikipedia.org/wiki/Secure_Shell) to the specified server. | _Nothing._\u003cbr /\u003e\u003cbr /\u003eThe _`ssh`_ client will default it to the `User` set in the SSH configuration file, or falls back to the current user's login name. |\n| `SSH_PORT` | The port where the remote server's [SSH](http://en.wikipedia.org/wiki/Secure_Shell) daemon, _`sshd`_, is listening for connections. | _Nothing._\u003cbr /\u003e\u003cbr /\u003eThe _`ssh`_ client will default it to the `Port` set in the SSH configuration file, or use the global default `22`. |\n\n\nExit codes\n----------\n\nWhen not indicated otherwise, the script will exit with the exit code of the build invocation command which was passed to **`distcc_build`**.\n(In the above examples, this is the exit code of _`make`_.)\nThe actual build system might have and define various non-zero exit codes for error conditions, which should be looked up from the specific tool's documentation.\n\nIn addition, the main script may generate, prior to the execution of the\nbuild tool, the following exit codes for error conditions:\n\n| Exit code | Explanation |\n|:---------:|:------------|\n| `96` | Indicates an issue with the configuration of the execution environment, such as the emptiness of a mandatory configuration variable, or the lack of required system tools preventing normal function. |\n| `97` | There is not enough system memory (RAM) available on the local computer to run the requested number of local compilations, and no remote workers were available. |\n\n\nConnecting to servers using [SSH](http://en.wikipedia.org/wiki/Secure_Shell) tunnels\n------------------------------------------------------------------------------------\n\nSupport for [`SSH_HOST`s](#host-specification) is conditional on having the [_`ssh`_](http://en.wikipedia.org/wiki/Secure_Shell) client installed, and successful execution depends on server-side configuration as well.\n\nIn most cases, the remote _`distccd`_ servers are available through the local network and can be used via raw TCP communication to dispatch jobs.\nThis is the preferred approach, as this allows for doing the work with the least overhead (communication, compression, etc.).\n\nIn certain scenarios, however, the \"naïve\" or \"raw\" DistCC ports might not be available directly from the client: such is often the case if the servers are in a separate network zone, location, data-centre, than the client machine \u0026emdash; or firewalls could be purposefully or by accident restricting access.\nIn this case, tunnelling over _`ssh`_ can be a feasible solution to expose the ports on the local machine for _`distcc`_ to consume, without having to reconfigure the network.\n\n_`distcc`_ natively supports an _\"SSH Mode\"_ and connects to remote servers built-in, but that mode's method is to spawn the **_`distccd`_ server** using the connection, and communicates with the server via a pipe.\n\n**ℹ️ Note** that _SSH tunnelling_, as done by this script, is purposefully **DIFFERENṪ** from _`distcc`_'s aforementioned _\"SSH tunnelling\"_ mode.\n\n**ℹ️📖 From `man distcc`:**\n\n\u003e For SSH connections, `distccd` must be installed, but should **not** be listening for connections.\n\nThis is not always feasible, as it would spawn a server under the name of the user connecting, which may not have the necessary privileges, the running server would not be capable of locking down the total job count across multiple users (i.e., two users spawning two `-j $(nproc)` servers and saturating them fully would overload the remote machine), and might not even have the right set of compilers available.\nThis is especially the case if the remote servers are [running _`distccd`_ in a containerised environment](http://github.com/whisperity/DistCC-Docker).\n\n\n### Setting up SSH tunnels\n\nThe `distcc-driver` script supports a different approach, which **REQUIRES** a _`distccd`_ (and _`sshd`_) servers to be running on the remote machine, and the existence of the _`ssh`_ client locally.\nThe remote server must allow the creation of tunnels, especially `AllowTcpForwarding` should be set to `yes`, `all`, or `local`, see _`sshd_config(5)`_.\nNaturally, the _`distccd`_ server's \"job\" (main) and \"stats\" port must be accessible from the _`sshd`_ server, i.e., if it is running in a containerised namespace, it needs to be exposed thereto.\n\nSpecifying an [`SSH_HOST`](#host-specification) will instruct the script to transform the provided `SSH_HOST` internally to a (local machine) `TCP_HOST` that points to a tunnel.\nThe local ports of the tunnel are selected **randomly**.\nThis tunnel is **kept alive** throughout the entire execution of the script, and destroyed after.\nIn case the script fails to establish the tunnel, or the tunnel is created but the remote server does not communicate appropriately, the host is eliminated from the list of potential workers.\n\nNote that from the eventually called _`distcc`_ clients' purview, the tunnelled connections will appear as if compiling on a server running on the local machine (usually with the host IP address `127.0.0.1` or `[::1]`).\nImportantly, _`distccmon-text`_ and similar tools will show the _loopback_ address under the remote worker's \"name\".\n\n\n### Specifying and customising SSH hosts\n\nThe _\"hostname\"_ part of the [SSH_HOST](#host-specification) might be a trivial hostname `example.com`, or one infixed between a `username@` and/or a `:port` number.\nThe value is understood as passed to _`ssh`_, similarly to how a \"natural\" remote terminal connection is made.\nAs such, the provided hostname component might also be a user-customised `Host` entry's name, see _`ssh_config(5)`_ for details.\n\nThe tunnels are created as if by executing:\n\n\n```bash\nssh \\\n  -L random-port-1:localhost:DISTCC_PORT \\\n  -L random-port-2:localhost:STATS_PORT \\\n  \\\n  (... additional necessary keep-alive options ...) \\\n  (... additional internally required detail options ...) \\\n  (... additional options that disable unneeded features ...) \\\n  \\\n  SSH_HOST\n```\n\n\nIn certain scenarios, such as if the authentication to the machine is\ndone via [_PKI_ or identity files](http://en.wikipedia.org/wiki/Public-key_cryptography), and the connection should use a key that is not the default for the **CURRENT** user (e.g., because the entire team is using a dedicated _\"CI\"_ or _\"compiler\"_ user on the servers), then this customisation **MUST** be done in the SSH configuration file at `~/.ssh/config`.\n\nFor example, you might use an `ssh://worker-1` [host specification](#host-specification) with the following _SSH config_:\n\n\n```ssh-config\nHost worker-1\n  HostName compiler-machine-1234.internal.mycompany.com\n  User cpp-compiler-team\n  IdentityFile ~/.ssh/compiler_team_key\n  # ... Additional options such as 'Port' (SSH server port), and other\n  # non-randomised 'LocalForward's\n```\n\n\nIt is **recommended** to set the server up with key-based authentication instead of requiring the typing in of the remote user's password every time, **and** to run the script in an environment where an _`ssh-agent`_ is available in order to lessen the number of times the potentially password-protected key has to be unlocked over and over again.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwhisperity%2Fdistcc-driver","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwhisperity%2Fdistcc-driver","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwhisperity%2Fdistcc-driver/lists"}