Mehrmalige Passworteingabe in Bash-Script vermeiden

  • Ersteller Ersteller Ochse
  • Erstellt am Erstellt am
O

Ochse

Gast
Hallo,

ich habe vor ein Bash-Script zu erstellen, in dem mehrere scp-Befehle vorkommen. Das Problem ist nun, dass ich bei jedem scp ein Passwort eingeben muss.
Ich könnte natürlich sshpass verwenden, das sähe dann ungefähr so aus:

#!/bin/bash
...
...
read -p "Passworteingabe :" -s SSHPASS
export SSHPASS
sshpass -e scp -r user1@server1:/pfad/ user2@server2:/pfad/
...
...


Bei dieser Variante kann das Passwort einfach aus der Variable SSHPASS gelesen werden. Folglich scheint das sehr unsicher zu sein.
Gibt es eine sicherere Möglichkeit die mehrfache Passworteingabe zu umgehen OHNE SSH-Keys zu verwenden?
Hoffe jemand kann mir helfen.
 
Das Passwort ist ja nur in der Variable SSHPASS zwischengespeichert. Wenn du die Variable mit "unset" wieder wegschmeißt ist ja alles OK.

Sonst müsste es vom Syntax her zumindest passen. So Pi-mal-Daumen zumindest, bin gerade unter Win7 unterwegs.

Was sprichte eigentlich gegen SSH-Keys das du es schon so kategorisch ausschließt?
 
Ich hab keine Zugriffrechte bzw. darf das auf dem Zielserver nicht ändern.

Wenn ich die Variable mit unset 'vernichte', könnte man sie doch trotzdem während des Kopiervorganges auslesen, oder?
 
Zuletzt bearbeitet: (Rechksreibung)
Hmm, für ssh-keys muss man ja eigentlich nicht viel ändern. Nur ein Verzeichnis und eine Datei anlegen (bzw. wenn schon vorhanden nur die .ssh/authorized_keys ergänzen). Aber wenn du es nicht darfst ist es schon doof. Technisch wäre es am saubersten. In der man-page vom sshpass stehen nicht ohne Grund einige Sicherheitshinweise unter "Security Considerations".

Nöö, die Variable ist nur in deinem Shellfenstern und auch nur während der Scriptausführung aktiv. In anderen Shell-Fenstern ist diese Variable nicht gefüllt.
 
Leider wird sie doch angezeigt, habs grad getestet :( .
'ps -xe | grep SSHPASS' zeigt mir sofort die Variable samt Inhalt an, jedenfalls bis ich sie lösche oder das Skript beende.
Aber wenns nicht anders geht, muss ich es wohl so machen.
 
Zuletzt bearbeitet: (Inhaltliche Ergänzung)
Bist du dir sicher? Ich habe es jetzt mal versucht nachzustellen. Aber erfolglos. Was für ein Linux bzw Unix hast du da?

Vielleicht ist es eine Eigenheit vom sshpass? Habe ich aber nicht installiert.
 
Es handelt sich um Ubuntu 12.04. Habs grad aber nochmal unter Scientific Linux 6 probiert mit einer anderen Variable und da verhält es sich genauso. Es ist also unabhängig von sshpass.

Im Netz fand ich noch eine Variante, in der das Passwort mit openssl verschlüsselt wurde. Weiß aber grad nicht wo. Möglicherweise ließe sich damit etwas anstellen.
 
Zuletzt bearbeitet: (Rechtksreibung)
Hmm, ich habe hier gerade ein Ubuntu 14.04 LTS zur Verfügung. Das sollte daran aber nichts ändern. Es sollte schon vergleichbar sein.

Ich habe mal ein Testscript geschrieben:

Code:
#!/bin/bash
read -p "Passworteingabe :" -s SSHPASS
echo "$SSHPASS"
sleep 190

Und während des sleep 190 finde ich mit dem "ps -xe | grep SSHPASS" nichts. Also eigentlich nichts, den grep-Befehl sieht man natürlich schon. Aber der wird ja gerade nach der Pipe ausgeführt.

Falls du auf deinem Linux alleine unterwegs bist ist es aber eigentlich egal? Weil dann kann ja keiner mit ps -xe die Prozesses ansehen.
 
Naja mit
Code:
echo "$VarName"
seh ich natürlich auch nichts, mit
Code:
export VarName
hingegen schon.

Ja, eigentlich ist es egal, d.h. es ist abhängig vom Grad der Paranoia :D .
 
Gut, ich hatte die Variable nicht exportiert ... das wird es wohl sein. Muss man aber in Shellscripten eigentlich nicht. Lass das mal bitte weg und teste es nochmal.

Oder hast du einen bestimmten Grund die zu exportieren? Dauerhaft brauchst du die ja sicher nicht?


Ochse schrieb:
Ja, eigentlich ist es egal, d.h. es ist abhängig vom Grad der Paranoia :D .

Nein, ist es nicht. Wenn dann richtig sauber programmiert :)
 
Nunja richtig sauber wäre ja nur SSH-Keys aber das geht leider nicht...

Also keine Ahnung warum ich das mit dem Export nicht gleich weggelassen habe, wie du vorschlägst. sshpass bietet auch eine Option an, bei der man keinen Export durchführen muss:

Code:
#!/bin/bash
read -p "Passworteingabe :" -s VarName
sshpass -p $VarName scp -r user1@server1:/pfad/ user2@server2:/pfad/

Das Einzige was mich daran irritiert, ist, dass hinter der Option -p der Kommentar "security unwise" steht aber bei der Passwortübergabe mittels Umgebungsvariable nichts, obwohl das doch unsicherer sein sollte.
Aber wie auch immer danke für deine Hilfe.
 
Zuletzt bearbeitet: (Rekschriebung)
Wenn das Passwort als Parameter übergeben wird, kann es jeder in der Prozessliste sehen. Daher doof.

Wenn das Passwort in einer Umgebungsvariablen steht, sieht es nur der Prozess in der entsprechenden Umgebung. Daher nicht doof. Du vermurkst es hier schon sehr. Es ist quasi unmöglich, das falsch zu machen.
 
Zuletzt bearbeitet:
Wenn das Passwort als Parameter übergeben wird, kann es jeder in der Prozessliste sehen.

Wie würde man die lesen können? Mit dem ps Befehl?

Wenn das Passwort in einer Umgebungsvariablen steht, sieht es nur der Prozess in der entsprechenden Umgebung.

Aber dann muss ich sie exportieren um sie in sshpass zu nutzen.
 
Warum exportierst du die Variable aus der Umgebung heraus? Das hat keinen Sinn und du machst dir damit dein Problem selbst. Wie bist du überhaupt auf diese bescheuerte Idee gekommen?

Frage 2: Ja, ps gibt die Prozessliste aus, aber das ist nicht die einzige Möglichkeit.
 
Wie denn ohne Exportieren? sshpass -e funktioniert nicht wenn man vorher nicht die Variable SSHPASS exportiert hat.

Kann man 'export' nutzen ohne das es gleich global sichtbar ist?

Und wie genau liest man das aus? Konnte es nicht finden mit ps .

Oder mal ganz anders gefragt - wie würde man es richtig machen?
 
Zuletzt bearbeitet:
Ochse schrieb:
Wie denn ohne Exportieren?
z.B. so:
Code:
asdf@chelloveck:~/src/cdbscript$ cat scr1.sh
#!/bin/sh

KARLHEINZ=horst
PETER=$KARLHEINZ ./scr2.sh
exit 0
asdf@chelloveck:~/src/cdbscript$ cat scr2.sh
#!/bin/sh
echo $PETER
exit 0
asdf@chelloveck:~/src/cdbscript$ ./scr1.sh
horst
asdf@chelloveck:~/src/cdbscript$

sshpass -e funktioniert nicht wenn man vorher nicht die Variable SSHPASS exportiert hat.
Lüg mich hier mal bitte nicht so an! :(

Kann man 'export' nutzen ohne das es gleich global sichtbar ist?
Nein, denn nur und ganz allein dafür ist export da.

Und wie genau liest man das aus? Konnte es nicht finden mit ps .
Code:
asdf@chelloveck:~/src/cdbscript$ ps aux
[...]
root     23938  0.0  0.0   4248   476 ?        Ss    2013  12:25 gpg-agent --daemon --write-env-file --use-standard-socket --default-cache-ttl 43200..............
 
Zuletzt bearbeitet:
Lüg mich hier mal bitte nicht so an!

Tut mir leid seh da grad noch nicht so ganz durch. Bei mir steht dann nur '-e option given but SSHPASS enviroment variable not set'.

Muss ich mir mal dein Script anschauen. Versteh noch nicht genau was du da tust.

'ps aux' findet bei mir nicht das Passwort, wenn ich meine alte Variante benutze.

Ich fürchte ich kann deine Antwort nicht nachvollziehen, sorry. So wie ich die verstanden habe soll ich 'sshpass -e' verwenden, richtig?

Edit:
Okay habs verstanden danke. Muss jetzt nur noch überprüfen ob man es nicht auslesen kann.

Edit2:
Mit deiner Version benötige ich das Wort 'export' nicht aber denoch wird alles exportiert und kann gelesen werden.
 
Zuletzt bearbeitet:
Kopier dir die beiden Skripte mal und guck, was sie machen, wenn du sie einzeln ausführst und wie sich das Verhalten ändert, wenn du sie modifizierst. Ich glaube, dann sollte dir ein Licht aufgehen und es ist auch weniger Arbeit für mich, als dir eine Vorlesung über die Shell zu geben. Für Letzteres werde ich hier auch viel zu schlecht bezahlt :(

Was das ps angeht, ging es doch darum, dass man das Passwort als Parameter übergeben kann und das sieht man dann in der Prozessliste. Von Variablen war in dem Fall keine Rede.
 
Ich denke das wird heut nichts mehr mit mir^^. Bevor mir ein Licht aufgeht, geht eher die Sonne auf. Ich versteh auch nicht was das mit den Scripten soll. Script 1 übertragt PETER an Script 2 und löst dafür sowas wie ein export aus, ja und?
 
Zurück
Oben