(Selbstverständlich lassen sich die Skripte auf — nahezu — beliebigen Rechnern installieren. Da ich mir angewöhnt habe — nach Möglichkeit — von meinem Rechner aus in einem eigenen Fenster auf den jeweiligen Zielrechner zu gehen, hatte ich das nur während der Entwicklungsphase mal exemplarisch ausprobiert.)
Der vermeintlich schwierige Teil war ein Skript mit Namen ssh zu schreiben, das nach einigen Vorbereitungen dann das originale ssh-Kommando aufruft. Frühere Erfahrungen bei der Benutzung verschiedener Rechner mit unterschiedlichen Betriebssystemen (SunOS/Solaris, HP-UX, AIX, NeXTStep, Linux, ...) haben gezeigt, dass ein hart kodierter Pfad zum originalen ssh-Kommando gern Ärger verursacht.
In Wirklichkeit war dieser Teil jedoch der harmloseste; einzige Einschränkung: wird die ssh-Option -i verwendet, muss sie dem Wrapper-Skript als erste übergeben werden. (Wem es Spaß macht einen Parser für alle Optionen der diversen Versionen aller ssh-Kommandos zu basteln, sollte sich keinen Zwang antun ...)
Das Wrapper-Skript
Für jede Identität wird der “pass phrase” bei der ersten Benutzung einmal abgefragt und dann im ssh-agent hinterlegt. Danach kann die Identität ohne weitere Eingabe des “pass phrase”s benutzt werden, bis der ssh-agent “stirbt” oder die Identität(en) aus dem ssh-agent gelöscht werden. (Passiert bei mir abends per crontab mit “ssh-add -D”.)
Das Wrapper-Skript sollte sich jeder am besten in seinen $HOME/bin-Katalog legen. Spätestens bei der nächsten Anmeldung wird dieser Katalog mit in den Suchpfad aufgenommen.
Jedes Mal beim Anmelden wird in meiner .profile folgende Sequenz abgearbeitet:
# start ssh-agent [ -r $HOME/.do_start_ssh-agent ] && . $HOME/.spec/start_ssh-agentDamit ist die Login-Shell mit dem ssh-agent verbunden und alle weiteren, von hier aus aufgerufenen Programme/Kommandos erben diese Verbindung.
Wer sich nicht wie ich an der ASCII-Konsole anmeldet, sondern einen Login via X bevorzugt, wird obigen Code an anderer Stelle (“.xinitrc”? o. ä.) hinterlegen müssen.
Die eigentliche Arbeit erledigt das Skript in $HOME/.spec/start_ssh-agent. Wird es mit dem Argument connect_only aufgerufen, wird nur versucht zu einem laufenden ssh-agent eine Verbindung aufzubauen. Ohne dieses Argument wird ggf. ein neuer ssh-agent gestartet.
Die für den Verbindungsaufbau zu diesem ssh-agent notwendigen Daten werden pro Rechner in einer eigenen Datei in $HOME/.ssh/agent hinterlegt. So überschreiben sich auch in NFS-montierten Heimatkatalogen die ssh-agents verschiedener Rechner nicht gegenseitig ihre Verbindungsdaten.
#
# start ssh-agent once per host
#
#: ${SHLIB:=/client/scripts/lib/shf}
#. ${SHLIB}/makeHOST
# up to now we do not have '/client/scripts' on all machines ...
: ${HOST:=`uname -n`}
SSHA_CONNECT_ONLY="$1"
SSH_AGENT_DIR=$HOME/.ssh/agent
[ -t 0 ] || exec > /dev/null
# directory if it does not exist:
[ -d "$SSH_AGENT_DIR" ] || mkdir -p "$SSH_AGENT_DIR"
# leftover from a former agent process?
[ -r "$SSH_AGENT_DIR/$HOST" ] && . "$SSH_AGENT_DIR/$HOST" >/dev/null 2>/dev/null
# is it still responding?
ssh-add -l > /dev/null 2> /dev/null
case "$?"
in 2) # man ssh-add: ... unable to contact the ... agent
if [ "$SSHA_CONNECT_ONLY" != "connect_only" ] ; then
ssh-agent > "$SSH_AGENT_DIR/$HOST"
. "$SSH_AGENT_DIR/$HOST"
fi
;; *) # we assume another agent is still running
grep echo "$SSH_AGENT_DIR/$HOST" 2> /dev/null |
grep -i agent | sh
esac
unset SSH_AGENT_DIR
unset SSHA_CONNECT_ONLY
# is there a responding agent?
ssh-add -l > /dev/null 2> /dev/null
Das ist das ursprüngliche Skript zum Aufruf der ssh.
#! /bin/sh
IDENTITY=`
while : ; do
case "$1"
in "") break
;; -i) shift
echo "$1"
esac
shift
done
`
if [ -n "$SSH_AGENT_PID" ] ; then # there is a ssh-agent running
if ssh-add -l |
egrep "${IDENTITY:-(RSA1)|$HOME/.ssh/id_[rd]sa}" > /dev/null
then
: identity found, nothing left to do
else
ssh-add ${IDENTITY}
fi
fi
FOUND_PATH=`dirname $0`
#SEARCH_PATH=`echo :$PATH | sed -e "s/:$FOUND_PATH:/:/" -e "s/^://"`
#SSH=`export PATH=$SEARCH_PATH; type ssh`
for i in `IFS=:; echo $PATH` ; do
[ x"$i" = x"$FOUND_PATH" ] && continue
SSH="$i/ssh"
[ -x "$SSH" ] && break
SSH=no-ssh-found
done
$SSH "$@"
Für meine eigenen Zwecke habe ich es inzwischen etwas aufgebohrt;
diese Erweiterungen sind m. E. hier aber nicht von Interesse.
Die auf diesen Seiten zum Ausdruck gebrachten Meinungen sind die meinigen, nicht notwendigerweise die der Universität Osnabrück. (Es sei denn, sie würden zufällig übereinstimmen oder wären entsprechend gekennzeichnet.)
Zum Thema "Links":
Bei "Links" handelt es sich stets um "lebende" (dynamische) Verweisungen. Gernot Skalla hat bei der erstmaligen Verknüpfung zwar den fremden Inhalt daraufhin überprüft, ob durch ihn eine mögliche zivilrechtliche oder strafrechtliche Verantwortlichkeit ausgelöst wird. Er überprüft aber die Inhalte, auf die er in seinem Angebot verweist, nicht ständig auf Veränderungen, die eine Verantwortlichkeit neu begründen könnten. Wenn er feststellt oder von anderen darauf hingewiesen wird, daß ein konkretes Angebot, zu dem er einen Link bereitgestellt hat, eine zivil- oder strafrechtliche Verantwortlichkeit auslöst, wird er den Verweis auf dieses Angebot aufheben.
(Quelle: Impressum/Disclaimer des Berliner Beauftragten für Datenschutz und Informationsfreiheit Stand: 09/2002)
Last change: Wed Jun 7 15:44:58 CEST 2017