Danke, Arek für die Inspiration ...
Anstatt einen anderen Shell-Prozess auszuführen, ist dies nur eine Funktion, die in der aktuellen Bash-Shell ausgeführt wird. Es führt einen einzelnen awk
Befehl aus, um die Konfigurationsdatei zu analysieren und herauszufinden, ob das Kennwort aus einer Shell-Variablen oder aus dem im Klartext geschriebenen Kennwort in die ssh-Konfigurationsdatei übernommen werden soll (mit awk
einer eval
anstelle von describe
aufgrund von Problemen getroffenen Verwendung describe
).
Ich habe so viele Möglichkeiten ausprobiert, ProxyCommand sshpass
direkt in einer ssh
Konfigurationsdatei zu verwenden, aber nichts schien wie erwartet zu funktionieren, außer wenn ich mich über RSA an einer Box anmelden konnte. Aber dann musste ich ein Passwort senden, um mein verschlüsseltes Verzeichnis zu öffnen. Die folgende Funktion scheint jedoch in allen Fällen für mich zu funktionieren, auch für Cygwin.
# In your .bash_profile
function ssh(){
host=$1;
unset PASSWORD
unset PASSVAR
eval $(awk "/ *#[Pp]assvar / && inhost { printf \"PASSVAR=%s\",\$2; exit 1 } / *#[Pp]assword / && inhost { printf \"PASSWORD=%s\",\$2; } /^#?[Hh][oO][sS][tT] / && inhost { inhost=0; exit 1 } /^[Hh][oO][sS][tT] $host\$/ { inhost=1 }" ~/.ssh/config)
if [[ -z "$PASSWORD" ]] && [[ -z "$PASSVAR" ]]; then
/usr/bin/ssh -q $* 2>/dev/null
else
if [[ -n "$PASSVAR" ]]; then
PASSWORD=$(TMP=${!PASSVAR-*};echo ${TMP##*-})
fi
/usr/local/bin/sshpass -p"$PASSWORD" /usr/bin/ssh -q $* 2>/dev/null
fi
}
# and setup your passwords (perhaps in .bashrc instead...)
MYPASS_ENVVAR=SomePassword
MYPASSWD_FROM_FILE=$(</home/me/.passwd_in_file)
Dann ~/.ssh/config
sieht ein Abschnitt so aus:
Host MyHostname
Port 22
Hostname 2.1.2.2
User merrydan
#Passvar MYPASS_ENVVAR
#Password Some!Password
Wenn #Passvar
im Konfigurationsabschnitt ein vorhanden ist, wird das überschrieben #Password
.
$MYPASS_ENVVAR
ist die Umgebungsvariable, die Ihr Passwort enthält.
Genießen!