Skip to content

Instantly share code, notes, and snippets.

@geerteltink
Last active September 27, 2018 17:28
Show Gist options
  • Save geerteltink/c3aa3fd81c3bd68c021f to your computer and use it in GitHub Desktop.
Save geerteltink/c3aa3fd81c3bd68c021f to your computer and use it in GitHub Desktop.
Start ssh-agent and add missing keys from your home path. The included script in git-for-windows didn't work for me and this one does.
@ECHO OFF
:: Enable extensions, the `verify` call is a trick from the setlocal help
VERIFY other 2>nul
SETLOCAL EnableDelayedExpansion
IF ERRORLEVEL 1 (
ECHO Unable to enable extensions
GOTO failure
)
SET DEBUG=FALSE
:: Set home path if missing
IF NOT EXIST "%HOME%" SET HOME=%HOMEDRIVE%%HOMEPATH%
IF NOT EXIST "%HOME%" SET HOME=%USERPROFILE%
IF %DEBUG% == TRUE ECHO - HOME: %HOME%
:: Detect if git is available
FOR %%i IN ("git.exe") DO SET GIT=%%~$PATH:i
IF NOT EXIST "%GIT%" GOTO ssh-agent-done
IF %DEBUG% == TRUE ECHO - GIT: %GIT%
:: Detect ssh-agent
FOR %%i IN ("ssh-agent.exe") DO SET SSH_AGENT=%%~$PATH:i
IF NOT EXIST "%SSH_AGENT%" GOTO ssh-agent-done
IF %DEBUG% == TRUE ECHO - SSH_AGENT: %SSH_AGENT%
:: Get the ssh-add executable
FOR %%s IN ("!SSH_AGENT!") DO SET BIN_DIR=%%~dps
FOR %%s in ("!BIN_DIR!") DO SET BIN_DIR=!BIN_DIR:~0,-1!
FOR /D %%s in ("!BIN_DIR!\ssh-add.exe") DO SET SSH_ADD=%%~s
IF NOT EXIST "!SSH_ADD!" GOTO ssh-agent-done
IF %DEBUG% == TRUE ECHO - BIN_DIR: %BIN_DIR%
IF %DEBUG% == TRUE ECHO - SSH_ADD: %SSH_ADD%
:: Check if an ssh-agent is running
FOR /f "tokens=*" %%I IN ('ps ^| grep ssh-agent ^| sed "s/^ *\([0-9]\+\) .*/\1/"') DO SET SSH_AGENT_PID=%%I
IF %DEBUG% == TRUE ECHO - SSH_AGENT_PID: %SSH_AGENT_PID%
IF NOT "%SSH_AGENT_PID%" == "" ECHO Detected ssh-agent with pid %SSH_AGENT_PID%
IF NOT "%SSH_AGENT_PID%" == "" GOTO add-keys
:: Remove old ssh-agent socks
rm -rf /tmp/ssh-??????*/
rm -f /tmp/ssh-agent.sock
:: Start ssh-agent
FOR /f "tokens=*" %%J IN ('%SSH_AGENT% -a /tmp/ssh-agent.sock') DO FOR /f "tokens=*" %%K IN ('echo %%J ^| grep "SSH_AGENT_PID" ^| sed "s/^SSH_AGENT_PID=\([0-9]\+\); .*/\1/"') DO SET SSH_AGENT_PID=%%K
IF "%SSH_AGENT_PID%" == "" ECHO Failed to start ssh-agent
IF "%SSH_AGENT_PID%" == "" GOTO failure
ECHO Started ssh-agent with pid !SSH_AGENT_PID!
:add-keys
:: Set SSH_AUTH_SOCK -> ssh-add needs SSH_AGENT_PID and SSH_AUTH_SOCK
SET SSH_AUTH_SOCK=/tmp/ssh-agent.sock
IF %DEBUG% == TRUE ECHO - SSH_AGENT_PID: %SSH_AGENT_PID%"
IF %DEBUG% == TRUE ECHO - SSH_AUTH_SOCK: %SSH_AUTH_SOCK%"
FOR /F "tokens=*" %%I IN ('DIR /B %HOME%\.ssh\*_rsa') DO (
SET KEY=%HOME%\.ssh\%%I
IF %DEBUG% == TRUE ECHO Checking key !KEY!
FOR /F "usebackq tokens=2*" %%G IN (`ssh-keygen -lf !KEY!`) DO SET FINGERPRINT=%%G
IF %DEBUG% == TRUE ECHO Checking fingerprint !FINGERPRINT!
FOR /f "usebackq tokens=*" %%H IN (`ssh-add -l ^| grep "!FINGERPRINT!"`) DO SET KEY_EXISTS=%%H
IF "!KEY_EXISTS!" == "" ssh-add !KEY!
)
:ssh-agent-done
:failure
ENDLOCAL & SET "SSH_AUTH_SOCK=%SSH_AUTH_SOCK%" ^
& SET "SSH_AGENT_PID=%SSH_AGENT_PID%"
ECHO %cmdcmdline% | FINDSTR /l "\"\"" >NUL
IF NOT ERRORLEVEL 1 (
CALL cmd %*
)
@ECHO ON
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment