From d6ba30980a567f23e88f827be63cc0a577c309be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakobus=20Sch=C3=BCrz?= Date: Thu, 6 Jul 2023 17:28:33 +0200 Subject: [PATCH] =?UTF-8?q?wei=C3=9F=20nicht?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/ssh-startagent | 166 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100755 bin/ssh-startagent diff --git a/bin/ssh-startagent b/bin/ssh-startagent new file mode 100755 index 0000000..fca0630 --- /dev/null +++ b/bin/ssh-startagent @@ -0,0 +1,166 @@ +#!/bin/bash + +FILELOGLEVEL=DEBUG +. $(dirname $0)/../logging +# loggerfactory +LANG=C + +ssh_runinagent () { + # run ssh-* commands in wanted agent + + if [ check_identity ] + then + local SSH_AUTH_SOCK + local SSH_AGENT_PID + local agentfile=$(get_agentfile) + shift + local sshcommand=${@} + + logtrace "run command »$sshcommand« in agent $agentfile" + if [ -e "$agentfile" ]; then + . $agentfile + fi + logdebug "SSH_AUTH_SOCK: ${SSH_AUTH_SOCK:-x}" + if [ "${SSH_AUTH_SOCK:-x}" = "x" ] + then + start_or_restart_agent + . $agentfile + fi + $sshcommand + ret=$? + fi +} + +check_identity () { + # is ssh-identity existing? + if [ -e ${SSH_IDENTITIES_DIR}/${ssh_identity} ] + then + return 0 + else + logerr "Identity ${ssh_identity} is not definded. Create identity-directory ${SSH_IDENTITIES_DIR}/${ssh_identity}" + exit 1 + fi +} + +get_agentfilename () { + printf "%s" "${SSH_AGENTS_DIR}/agent-${ssh_identity}" +} +get_agentsocketname () { + printf "%s" "${SSH_AGENT_SOCKETS_DIR}/socket-${ssh_identity}" +} + +start_or_restart_agent () { + if check_identity + then + check_agent + ret=$? + logdebug "check_agent returncode $ret" + case $ret in + 0) + logdebug "agent is running" + ret=0 + ;; + 1) + logdebug "agent is running, but:" + ret=1 + ;; + 2) + logdebug "former agent is not running -> start it" + logdebug "SSH_AGENT_OPTIONS: $SSH_AGENT_OPTIONS" + startagent=true + ;; + 3) + logwarning "Agent is not ok" + startagent=true + ;; + *) + logwarning "Something else with agent" + ret=99 + ;; + esac + if ${startagent:-false} + then + ssh-agent -a $(get_agentsocketname) ${SSH_AGENT_OPTIONS} > $(get_agentfilename) + ret=$? + fi + ssh_runinagent ${ssh_identity} ssh-add -l >/dev/null 2>&1 + if [ $? -eq 0 ] + then + printf "%s\n" "$(get_agentfilename)" + else + ret=92 + fi + fi +} + +check_agent () { + if [ -e $(get_agentsocketname) ] + then + ssh_runinagent ${ssh_identity} ssh-add -l >/dev/null 2>&1 + return $? + fi + logdebug "agent socketname: $(get_agentsocketname)" + return 3 +} + +get_agentfile () { + if check_identity + then + printf "%s" "$(get_agentfilename)" + fi +} + +get_agentsocket () { + if check_identity + then + printf "%s" "$(get_agentsocketname)" + fi +} + +agent_load_identity_keys () { + + # If DISPLAY is set, ssh-add calls ssh-askpass, and if its in remote-terminal, it wont work + # So remember and unset DISPLAY, and set it at the end again, if it was set before + [ $DISPLAY ] && local DISPLAY_ORIG=$DISPLAY + [ $DISPLAY ] && logtrace "unset DISPLAY: $DISPLAY" + [ $DISPLAY ] && unset DISPLAY + + +} + +ssh_identity=${1:-default} +identitydir=${SSH_IDENTITIES_DIR}/${ssh_identity} +[ -z "${SSH_IDENTITIES_DIR+x}" ] && { export SSH_IDENTITIES_DIR="${SSH_IDENTITIES_DEFAULT_DIR-${HOME}/.ssh/identities}"; } +[ -z "${SSH_AGENTS_DIR+x}" ] && { export SSH_AGENTS_DIR=${SSH_AGENTS_DEFAULT_DIR-~/.ssh/agents}; } +[ -z "${SSH_AGENT_SOCKETS_DIR+x}" ] && { export SSH_AGENT_SOCKETS_DIR=${SSH_AGENT_SOCKETS_DEFAULT_DIR-~/.ssh/agents}; } +[ -z "${SSH_AGENT_OPTIONS+x}" ] && { export SSH_AGENT_OPTIONS=${SSH_AGENT_DEFAULT_OPTIONS--t 7200 }; } + +export SSH_IDENTITIES_DIR SSH_AGENTS_DIR SSH_AGENT_SOCKETS_DIR SSH_AGENT_OPTIONS + +#logdebug "<< EOF +# ssh identity: ${ssh_identity} +# identidies dir: $SSH_IDENTITIES_DIR +# agents dir: $SSH_AGENTS_DIR +# agents sockets dir: $SSH_AGENT_SOCKETS_DIR +# agents options: $SSH_AGENT_OPTIONS +# agentfile: $(get_agentfile ${ssh_identity}) +# agentsocket: $(get_agentsocket ${ssh_identity}) +#EOF +#" +#logtrace "Keys in your shells agent ${SSH_AUTH_SOCK}: $(ssh-add -l)" +logtrace "Keys in agent ${ssh_identity}: $(ssh_runinagent bmi ssh-add -l)" + + +createonly=false + +if [[ $SSH_TTY || $X2GO_SESSION ]] ; then + logdebug "Shell running with forwarded ssh-agent. Please add local token manually" + check_token + res=1 +else + logdebug "run with local ssh-agent" + start_or_restart_agent + ! $createonly && agent_load_identity_keys $ssh_identity + res=0 +fi +#exit $res