shellscript mit scp und hinterlegtem Passwort

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
guidomkw
Beiträge: 20
Registriert: 13.04.2008 13:43:19

shellscript mit scp und hinterlegtem Passwort

Beitrag von guidomkw » 04.07.2008 13:02:02

Hallo Allerseits...

Ich muss über PHP auf eine Datenbank zugreifen um dort die IP + Passwort von bestimmten Rechnern zu erfahren. Die IP + Passwort soll an das Shellscript übergeben werden und zum transfer mehrerer Dateien via SCP genutzt werden.

Mir stellt sich die Frage, wie ich es schaffen könnte, das Passwort für den SCP-Befehl zur Verfügung zu stellen.
Abgesehen davon, gibt es teilweise Rechner, die "zum ersten mal" kontaktiert werden müssen. Das heißt ich habe deren Fingerprint noch nicht in meinen "known_hosts" und evtl. käme dann ja die Abfrage, ob man es zulassen wolle. Also müsste ich dann ggf. auch noch das "YES" mitgeben...

Funktioniert das auf diesem Wege eigentlich überhaupt.

Für eure Hilfe bedanke ich mich! :hail:

Gruß,
Guido

PS: Habe bereits in Google und in diesem Forum gesucht, leider ohne Erfolg...

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Re: shellscript mit scp und hinterlegtem Passwort

Beitrag von roli » 04.07.2008 15:44:24

Hi,

was du da beschreibst hoert sich spannend an. Fuer ssh&telnet habe ich das ganze mal mit Expect in einem Perlscript gemacht. Wobei "habe ich" stimmt nicht ganz, ich hab's irgendwo gefunden und an meine Beduerfnisse angepasst. Expect gibt's soweit ich weiss auch "stand alone". Hier mal mein Script, vielleicht hilft's dir:

Code: Alles auswählen

#!/usr/bin/perl

# Expect Perlmodule installieren:
# $ perl -MCPAN -e shell
# cpam> i /Expect/        # zeigt eine Trefferliste von Modulen die Expect "enthalten"
# cpan> install Expect    # Installiert das Modul Expect
# cpan> exit

use strict;
use Expect;

my $host = shift or die("use: lmi host");

my $pwdfile = $ENV{'HOME'}. "/.lmi";
my $timeout = 10;
my $user;
my $passwd;
my $prog;

# read password file
open IN, "<$pwdfile" or die("could not open $pwdfile!\n");
while (<IN>) {
  my $line = $_;
#  print $line;
  if ($line =~ m/$host\s/) {
#  (grep( /^$host\s/, 'ERROR[Unused arguments - too many, or wrong type] in:<IN>'))[0]
#    or die("no entry in $pwdfile!\n");
    ($user, $passwd, $prog) = (split( /\s+/, $line))[1,2,3];
  }
}
close(IN);

if (! $user){
  die("no entry in $pwdfile!\n");
}

my $exp;

if($prog =~ m/ssh/) {
print "ssh -------- \n";
  # start program
  my $connect_string = $user . "@" . $host;
  $exp = Expect->spawn($prog, $connect_string)
    or die("Cannot spawn $prog: $!\n");
}
else {
print "kein ssh -------- \n";
  # start program
  $exp = Expect->spawn($prog, $host)
    or die("Cannot spawn $prog: $!\n");
  
  # Wait for login prompt
  $exp->expect($timeout, 'ogin') or die("No 'login' prompt");
  $exp->send("$user\n");
}

# Wait for password prompt
$exp->expect($timeout, -re => '[Pp]assword')
  or die("No 'password' prompt");
$exp->send("$passwd\n");

# Wait for shell
$exp->expect($timeout, '$') or die("1No prompt!\n");

# Setup environment
$exp->send("PS1='MyPrompt:) '\n");
$exp->expect($timeout, 'MyPrompt') or die("2No prompt!\n");

# switch to interactive session
$exp->interact();
Das Script setzt eine .lmi Datei voraus, die pro Zeile die Daten eines Accounts enthaelt:
host user password tool(ssh/Telnet)
Das könntest du ja "reinpipen".
Was du allerdings machen muesstest waere die Strings/den Prompt, auf die das Script wartet anpassen.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

uname
Beiträge: 12427
Registriert: 03.06.2008 09:33:02

Re: shellscript mit scp und hinterlegtem Passwort

Beitrag von uname » 08.07.2008 08:23:09

Ich muss über PHP auf eine Datenbank zugreifen um dort die IP + Passwort von bestimmten Rechnern zu erfahren.
Alles klar. Vergebe doch gleich "passwort" als Passwort.

Generell würde ich in so einem Fall auf jeden Fall SSH-Keys benutzen. Damit kannst du dann kopieren ohne Benutzer und Passwort. Und vor allem ist das viel sicherer.

Wenn es doch so sein soll (Achtung unsicher) würde ich auch Perl und dann jedoch mit den zugehörigen SSH-Bibliotheken

http://search.cpan.org/dist/Net-SSH-Perl/

nutzen.Dort sollte man Passwörter als Parameter übergeben können.

Antworten