Last active
September 27, 2018 17:28
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@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