« Einheitsnetzteil für Handys - UCSVim mal praktisch »

Paswortlos mit ssh keys

16.02.09 | von hoergen [mail] | Kategorien: Chiphead, Programme, Linux

OpenSSHDer normale Ablauf sich per ssh einzuloggen besteht darin den Befehl abzusetzen und danach den Benutzernamen und das Passwort einzugeben. Das heißt die Verbindung ist immer interaktiv und schliesst damit das Benutzen von scp zeitgesteuert aus. Mit Hilfe von ssh keys kann man das Problem aber lösen.

Hier eine kleine Anleitung mit folgendem Szenario: Ich möchte mich von meinem Notebook auf meinen Server mit Hilfe von ssh keys einloggen:

Notebook
Auf meinem Notebook erzeuge ich mit folgendem Befehl 2 Schlüssel (privat & öffentlich):

ssh-keygen -t rsa

Das Programm fordert nun eine Passworteingabe, die man einfach mit Enter 2x bestätigt, denn sonst muß man später wieder beim Verbindungsaufbau das Passwort eingeben. Danach befinden sich im Verzeichnis ~/.ssh/ 2 Dateien:

  • id_rsa privater Schlüssel
  • id_rsa.pub öffentlicher Schlüssel

Damit wäre die Arbeit auf meinem Notebook erledigt.

Server
Ich kopiere jetzt die Datei id_rsa.pub auf meinen Server in das Verzeichnis ~/.ssh/ und füge den Schlüssel mithilfe folgendem Befehls der Datei authorized_keys hinzu:

cat id_rsa.pub>>~/.ssh/authorized_keys

Dann versichere ich mich, dass die Datei mir (Benutzer) und meiner Gruppe gehört (bei Kubuntu) hoergen:hoergen (chown). Und schließlich muss die Datei die Rechte 0600 haben.

chmod 0600 ~/.ssh/authorized_keys

Beim nächsten Login werde ich dann nicht mehr nach meinem Passwort gefragt.

Dank gebührt dem Madeagle Kollektiv für die erneute Erinnerung.

Nachtrag: Wenn der Dateitransfer abbricht, üblicherweise bei 80%-90%, kann man leider mit scp kein resume (kein Fortsetzen) des Transfers anstossen. Man müßte die Datei komplett neu übertragen. Eine Lösung wäre der Einsatz eines ssh getunnelten rsync:

rsync –partial –progress –rsh=ssh {source} {destiantion}

Weiterer Nachtrag: Im Netz doch noch ein Script gefunden, das mit einem reinen ssh ohne den Einsatz von rsync ein resume macht:

#!/bin/sh
# Frequently used functions:
# $Id: functions.sh 57 2004-08-07 17:34:19Z taal $

debug() {
level=${1:-"0"}
msg="$2"
if [ "$DEBUG" -ge "$level" ]; then
echo "debug($level): [$msg]"
fi
}

remove_pattern() {
string="$1"
pattern="$2"
var="$3"
result=`echo "$string" | sed -e "s/${pattern}//g"`
eval ${var}=\"$result\"
}

debug_vars() {
for var in "$@"; do
eval contents=\$${var}
echo -n "${var} = [$contents], "
done
echo
}


konsole_title() {
CURDIR=$(pwd | sed -e 's#\(/[^\/]*/[^\/]*\)/.*/\([^\/]*/[^\/]*\)\$#\1...\2#g'); # Prepare nice directory
if [ -n "$SSH_CLIENT" -o -n "$KONSOLE_DCOP" ]; then # If we are in konsole or ssh
echo -e "\e]0; ::: $@ ::: | ${USER} @ ${HOSTNAME} | $CURDIR | \a"; # Set konsole window title
fi
"$@"
}

usage()
{
echo
echo "Usage: `basename $0` -u(pload) \$localfile \$remotefile"
echo " `basename $0` -d(ownload) \$remotefile \$localfile"
echo
echo " \$remotefile should be in the scp format, i.e.: user@host:filename"
echo " and can be user@host: for uploading"
echo
exit 1
}

[ -z "$1" -o -z "$2" -o -z "$3" ] && usage

option=$1
case $option in
-u*|-U*)
localfile=$2
remote=$3

remove_pattern "${remote}" ":.*$" userhost
remove_pattern "${remote}" "^.*:" remotefile

if [ ! -f "$localfile" ]; then
echo "File not found: $localfile"
usage
fi
if [ x"$userhost" = x"$remote" ]; then usage; fi
if [ x"$remotefile" = x"$remote" -o -z "$remotefile" ]; then remotefile=`basename "$localfile"`; fi


echo "Getting size of remote file:"
localsize=`ls -l "${localfile}" | awk '{ print $5 }'`
remotesize=`ssh "$userhost" "[ -f \"${remotefile}\" ] && ls -l \"${remotefile}\"" | awk '{ print $5 }' `

if [ -z "$remotesize" ]; then remotesize=0; fi

if [ $localsize -eq $remotesize ]; then
echo "Local size equals remote size, nothing to transfer."
exit 0;
fi

echo "Resuming upload of '$localfile' at byte $remotesize..."

dd bs=1 skip=$remotesize "if=${localfile}" | \
ssh -C -c arcfour "$userhost" "cat >> \"$remotefile\""

echo "done."
;;
-d*|-D*)
localfile=$3
remote=$2

remove_pattern "${remote}" ":.*$" userhost
remove_pattern "${remote}" "^.*:" remotefile

debug_var localfile remote userhost remotefile

if [ x"$localfile" = x"." ]; then localfile=`basename "$remotefile"`; fi
if [ ! -f "$localfile" ]; then
localsize=0;
else
localsize=`ls -l "${localfile}" | awk '{ print $5 }'`
fi
if [ x"$remotefile" = x"$remote" ]; then usage; fi


if [ -z "$localsize" ]; then localsize=0; fi

echo "Resuming download of '$localfile' at byte $localsize..."
ssh -C -c arcfour "$userhost" "dd bs=1 skip=$localsize \"if=${remotefile}\"" >> $localfile

;;
*)
usage
;;
esac

6 Kommentare

Kommentar von: zeroathome [Besucher] E-Mail · http://www.zeroathome.de
einfacher noch, geht das Kopieren des Schlüssels auf den Server mit
"ssh-copy-id -i ~/.ssh/id_rsa.pub user@server"
:-)
17.02.09 @ 00:11
Kommentar von: Wolfgang Claus [Besucher] E-Mail
Moin,moin,
danke für den Beitrag.
Wolfgang
17.02.09 @ 00:18
Kommentar von: Matze [Besucher] E-Mail
Kein Passwort einzugeben ist eine denkbar schlechte Möglichkeit, da beim Verlust des Schlüssels sofort der Zugang kompromittiert ist. Besser ist es, ein starkes Passwort zu wählen und einen SSH-Agent einzusetzen.
17.02.09 @ 00:51
Kommentar von: Piccolino81 [Besucher]
Bei mir hat das auf meinen Ubuntu 8.04 Systemen leider nicht geklappt:

ssh user@server
Permission denied (publickey)

Aber auch mit der Anleitung von

http://wiki.ubuntuusers.de/SSH#Authentifizierung-ueber-Public-Keys

wollte es leider nicht funktionieren :-(
17.02.09 @ 02:15
Kommentar von: Unki [Besucher] E-Mail · http://ruby-team.net
und noch einfacher mit:

ssh-copy-id user@server

Die Option -i ... ist sinnvoll, wenn man mehrere Schlüsseldateien hat.
17.02.09 @ 05:05
Kommentar von: hoergen [Mitglied] E-Mail · http://blog.hoergen.org
@Matze
Du hast recht, dass man den privaten Schlüssel nicht verlieren sollte, aber wenn ich ssh-agent richtig verstanden habe, dann müsste ich wieder ein Passwort eingeben .. zwar pro Session nur 1x aber ohne geht es nicht. Mir ging es primär darum, dass ich zeitgesteiert (nachts wenn ich schlafe) ein scp machen kann.

@Piccolino81
Die Fehlermeldung sagt, dass Du die falschen Rechte (chmod 0600) oder den falschen Besitzer (chown deinUser.deinUser authorized_keys) eingestellt hast.
17.02.09 @ 07:59

Einen Kommentar hinterlassen


Ihre E-Mail-Adresse wird nicht auf dieser Seite angezeigt.

Ihr URL wird angezeigt.
SchlechtExzellent
(Zeilenumbrüche werden zu <br />)
(Name, E-Mail-Adresse & Webseite)
(Benutzern erlauben, Sie durch ein Kontaktformular zu kontaktieren (Ihre E-Mail-Adresse wird nicht weitergegeben))