# Mix.install doesn't honour \`GIT\_SSH\_COMMAND\`

**URL:** <https://forum.elixirforum.com/t/mix-install-doesnt-honour-git-ssh-command/66590>\
**Category:** Questions\
**Tags:** ssh, git, livebook\
**Created:** [October 8, 2024, 10:54am UTC](https://forum.elixirforum.com/t/mix-install-doesnt-honour-git-ssh-command/66590 "2024-10-08T10:54:09Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![rlipscombe](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/rlipscombe/32/11250_2.png) [@rlipscombe](https://forum.elixirforum.com/u/rlipscombe)\
**Post date:** [October 8, 2024, 10:54am UTC](https://forum.elixirforum.com/t/mix-install-doesnt-honour-git-ssh-command/66590/1 "2024-10-08T10:54:09Z")

</div>

When I use `Mix.install` with a git dependency, using `git@github.com:...` how do I change the SSH identity used?

I’ve got two Github accounts – work and personal, and usually I’d specify `GIT_SSH_COMMAND=ssh -i path/to/private_key -o IdentitiesOnly=yes`.

This works fine when running, say, `iex` and `Mix.install` in my terminal. When I try the same in Livebook, I get the following error:

```elixir
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

```

I’ve tried editing `.livebookdesktop.sh` – and the env var is set properly according to `System.get_env`; didn’t work.

I’ve tried using `system_env: %{"GIT_SSH_COMMAND" => "ssh -i ...` in `Mix.install`; didn’t work.

How do I get `Mix.install` to use alternate SSH identities inside Livebook?

---

<div class="post-metadata">

**Author:** ![dimitarvp](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/dimitarvp/32/38664_2.png) [@dimitarvp](https://forum.elixirforum.com/u/dimitarvp)\
**Post date:** [October 8, 2024, 11:42am UTC](https://forum.elixirforum.com/t/mix-install-doesnt-honour-git-ssh-command/66590/2 "2024-10-08T11:42:13Z")

</div>

Why is using the `https://...` links not an option, by the way? You can just export the `GITHUB_TOKEN` env var and it should just work. At least it does for me locally in the OS, locally in a Docker container, and in GitHub’s workers (with the `.insteadOf` git setting on top).

---

<div class="post-metadata">

**Author:** ![rlipscombe](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/rlipscombe/32/11250_2.png) [@rlipscombe](https://forum.elixirforum.com/u/rlipscombe)\
**Post date:** [October 8, 2024, 12:08pm UTC](https://forum.elixirforum.com/t/mix-install-doesnt-honour-git-ssh-command/66590/3 "2024-10-08T12:08:31Z")

</div>

> [@dimitarvp](#):
>
> You can just export the `GITHUB_TOKEN` env var

I don’t want the extra step involved in managing a personal access token.

---

<div class="post-metadata">

**Author:** ![dimitarvp](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/dimitarvp/32/38664_2.png) [@dimitarvp](https://forum.elixirforum.com/u/dimitarvp)\
**Post date:** [October 8, 2024, 12:23pm UTC](https://forum.elixirforum.com/t/mix-install-doesnt-honour-git-ssh-command/66590/4 "2024-10-08T12:23:42Z")

</div>

Is that adding more friction than providing the extra step of a private key and the command to use it? Your call, seems to me the token would be a touch easier.

---

<div class="post-metadata">

**Author:** ![rlipscombe](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/rlipscombe/32/11250_2.png) [@rlipscombe](https://forum.elixirforum.com/u/rlipscombe)\
**Post date:** [October 8, 2024, 2:43pm UTC](https://forum.elixirforum.com/t/mix-install-doesnt-honour-git-ssh-command/66590/5 "2024-10-08T14:43:33Z")

</div>

I’ve already _got_ the extra private key, so: yes.

Moreover, in order to apply the `.insteadOf` option, I need a configuration file. And, because I’m keeping my personal and work configurations separate, it’s a separate configuration file.

And, if I could persuade `Mix.install` to use a separate configuration file, I wouldn’t need the env var – because the configuration file already specifies `core.sshCommand`, but that doesn’t seem to do anything here either.

---

<div class="post-metadata">

**Author:** ![josevalim](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/josevalim/32/1787_2.png) [@josevalim](https://forum.elixirforum.com/u/josevalim)\
**Post date:** [October 8, 2024, 3:05pm UTC](https://forum.elixirforum.com/t/mix-install-doesnt-honour-git-ssh-command/66590/6 "2024-10-08T15:05:54Z")

</div>

We don’t do anything special here, so my only suspicion is that the environment variable is not making its way to `git`. You could try creating a simple git script, put it on top of your $PATH, and call `env` to inspect all of the environment variables. If the `GIT_SSH_COMMAND` you set at .livebookdesktop.sh is missing, that would explain it.

---

<div class="post-metadata">

**Author:** ![rlipscombe](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/rlipscombe/32/11250_2.png) [@rlipscombe](https://forum.elixirforum.com/u/rlipscombe)\
**Post date:** [October 9, 2024, 10:30am UTC](https://forum.elixirforum.com/t/mix-install-doesnt-honour-git-ssh-command/66590/7 "2024-10-09T10:30:12Z")

</div>

> [@josevalim](#):
>
> You could try creating a simple git script, put it on top of your $PATH, and call `env` to inspect all of the environment variables.

I did this. The `GIT_SSH_COMMAND` environment variable _is_ present, but seems to be ignored by the real `git` command.

Ah! I wonder whether it’s because it can’t talk to the running ssh agent, so it can’t unlock the private key…?

---

<div class="post-metadata">

**Author:** ![rlipscombe](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/rlipscombe/32/11250_2.png) [@rlipscombe](https://forum.elixirforum.com/u/rlipscombe)\
**Post date:** [October 9, 2024, 10:39am UTC](https://forum.elixirforum.com/t/mix-install-doesnt-honour-git-ssh-command/66590/8 "2024-10-09T10:39:54Z")

</div>

> [@rlipscombe](#):
>
> Ah! I wonder whether it’s because it can’t talk to the running ssh agent, so it can’t unlock the private key…?

Yes, probably this. `System.get_env()` includes `"SSH_AUTH_SOCK" => "/private/tmp/com.apple.launchd.BlahBlah/Listeners"`.

This is _not_ the `SSH_AUTH_SOCK` that my shell’s using – `SSH_AUTH_SOCK=/var/folders/bunch/of/letters/and/numbers/agent.1234`

I’ve got two `ssh-agent` processes running, and Livebook’s talking to the one that doesn’t have my keys loaded.

I wonder how to get `oh-my-zsh` to talk to the launchd-started one, instead of starting a new one…? That’s a problem for a different forum, however.

Thanks for the pointers.

---

<div class="post-metadata">

**Author:** ![rlipscombe](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/rlipscombe/32/11250_2.png) [@rlipscombe](https://forum.elixirforum.com/u/rlipscombe)\
**Post date:** [October 9, 2024, 10:44am UTC](https://forum.elixirforum.com/t/mix-install-doesnt-honour-git-ssh-command/66590/9 "2024-10-09T10:44:52Z")

</div>

Summary:

- `Mix.install` uses the `git` command normally, so environment variables and configuration settings should _just work_.
- If you’re using SSH, it will need access to your private keys. This requires access to a running `ssh-agent` with those keys.
- If you’re managing your `ssh-agent` with a login script, etc., you’ve probably got more than one `ssh-agent` running.
- On macOS (at least), Livebook will be talking to the `launchd`-started `ssh-agent`.
- This one won’t have your keys.
- Sad times.
