scp mit Passwort-Übergabe

Antworten
BerLin
Beiträge: 50
Registriert: So 17. Jun 2007, 16:51

scp mit Passwort-Übergabe

Beitrag von BerLin »

Hallo Forum,

ich versuche jetzt schon eine ganze Zeit scp mit Passwort-Übergabe zu realisieren, so dass ich den Output in einem Logfile mitschreibe. Die Datenquelle ist ein schwaches Linux Embedded System.
Ohne die Logdatei habe ich das Ganze über ein Shell-Script realisiert, aber da mir die Logdatei wichtig ist,...
Inhalt des Shell-Scripts:
/usr/bin/sshpass -p "123456" scp -P 22 usr01@192.168.178.104:/tmp/result.txt /tmp/result.txt

Leider bleibt das Programm in der Shell bei der Passwort-Abfrage stehen.

Hier mein Code:

Code: Alles auswählen

procedure Tf_main.btn_scpClick(Sender: TObject);
const
  MyPass: string = '123456';
  //+LineEnding;
var
  AProcess: TProcess;
  ResLst: TStringList;
  s, PassStr: string;
  i: integer;
begin
  AProcess := TProcess.Create(nil);
  ResLst := TStringList.Create;
  s := '/usr/bin/scp';
  AProcess.Executable := '/usr/bin/scp';
  AProcess.Parameters.Add('-P');
  AProcess.Parameters.Add('22');
  AProcess.Parameters.Add('usr01@192.168.178.104:/tmp/result.txt');
  AProcess.Parameters.Add('/tmp/result.txt');
  for i := 0 to AProcess.Parameters.Count - 1 do
    s := s + ' ' + AProcess.Parameters[i];
  ed_cmd.Text := s;
  Application.ProcessMessages;
  //AProcess.Options:=[poUsePipes,poWaitOnExit,poStderrToOutPut];
  AProcess.Options := [poUsePipes, poStderrToOutPut];
  AProcess.Execute;
  PassStr := 'echo ' + MyPass;
  AProcess.Input.Write(PassStr[1], Length(PassStr));
  //AProcess.Input.Write(MyPass[1],Length(MyPass));
  ResLst.LoadFromStream(AProcess.Output);
  AProcess.Free;
  ResLst.SaveToFile('ResLst.txt');
end;                          
VG
BerLin

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: scp mit Passwort-Übergabe

Beitrag von af0815 »

Geht es auf der Kommandozeile oder wird dort auch das Passwort (extra) verlangt ?! Weil manche System verlangen das das Passwort 'real' eingeben werden muss, damit Robots ausgesperrt werden :-)

IMHO wird das 'echo' + passwd nicht funktionieren. Entweder geht es ohne echo oder man hat echt Probleme damit. Der Hintergrund ist, das TProzess keine echte shell ist, damit geht zum Beispiel pipeing nicht über das man das Passwort injizieren kann.

Beispiel für Passwortübergabe, wenn es direkt nicht aktzeptiert wird.

Code: Alles auswählen

#!/bin/bash
PASSWD="1234"
echo -e $PASSWD | sudo -S mycommand
Zuletzt geändert von af0815 am Mi 30. Mär 2022, 17:10, insgesamt 1-mal geändert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: scp mit Passwort-Übergabe

Beitrag von Winni »

Hi!

Passwortabfrage gibt es per Design nicht automatisiert bei scp.

ssh und seine Helferlein ohne Passwort sondern mit Key:

Auf Deinem Rechner einen public key erzeugen

Den Public Key in die Liste der erlaubten Rechner auf dem Zielrechner eintragen. Dabei wird ein letztes Mal das Passwort abgefragt.

Und nun auch per Script oder fpc in den remote Rehner einloggen.

Dazu gibt es unzählige Webseiten wie zb
https://otremba.net/wiki/SSH_ohne_Passwort

Winni

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: scp mit Passwort-Übergabe

Beitrag von Socke »

BerLin hat geschrieben:
Mi 30. Mär 2022, 16:12
Inhalt des Shell-Scripts:
/usr/bin/sshpass -p "123456" scp -P 22 usr01@192.168.178.104:/tmp/result.txt /tmp/result.txt
Möglicherweise macht es einen Unterschied, ob du -p "123456" oder "-p123456" schreibst. Die

Code: Alles auswählen

Manpage
sieht kein Leerzeichen vor.

Dort gibt es auch einen interessanten Abschnitt zum Thema Sicherheit:
scp fragt das Kennwort interaktiv ab, damit nicht jeder Systemuser das Kennwort aus der Prozessliste auslesen kann. Als Lösung werden unnamed pipes angegeben. Du müsstest aber wie in deinem Shell-Script sshpass statt scp starten.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Warf
Beiträge: 1909
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: scp mit Passwort-Übergabe

Beitrag von Warf »

af0815 hat geschrieben:
Mi 30. Mär 2022, 17:03
Geht es auf der Kommandozeile oder wird dort auch das Passwort (extra) verlangt ?! Weil manche System verlangen das das Passwort 'real' eingeben werden muss, damit Robots ausgesperrt werden :-)
Genau dafür ist eigentlich sshpass da. Normalerweise müsste das auch so gehen, hab vor ein paar jahren das mal gemacht, sogar mit leerzeichen. Ich hab mal meinen alten command gefunden:

Code: Alles auswählen

sshpass -p PASSWORD scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=3 FILE:TARGET

BerLin
Beiträge: 50
Registriert: So 17. Jun 2007, 16:51

Re: scp mit Passwort-Übergabe

Beitrag von BerLin »

Hallo Zusammen,

grundsätzlich funktioniert es mit dem Script, aber ich bekomme keinen Output zurück, den ich gerne für die Diagnose hätte. Für jedes Endgerät mit dem Schlüssel zu hinterlegen, macht bei über 1000 Endgeräten keinen Sinn und es müsste für einige Computer gemacht werden.

Zurück Testprogramm:
Starte ich ich das Programm bleibt an der Stelle hängen, welche das Passwort verlangt. Starte ich in der Shell, so werde ich zur Passworteingabe aufgefordert.

VG
BerLin

Warf
Beiträge: 1909
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: scp mit Passwort-Übergabe

Beitrag von Warf »

BerLin hat geschrieben:
Do 31. Mär 2022, 19:15
grundsätzlich funktioniert es mit dem Script, aber ich bekomme keinen Output zurück, den ich gerne für die Diagnose hätte. Für jedes Endgerät mit dem Schlüssel zu hinterlegen, macht bei über 1000 Endgeräten keinen Sinn und es müsste für einige Computer gemacht werden.
Registrier einfach einen key den du dann mit dem Programm mitlieferst und über ssh -i angibst:

Code: Alles auswählen

# Generation
$> ssh-keygen -f deployment.key
$> ssh-copy-id -i deployment.key user@host
# Usage
$> ssh -i deployment.key user@host
BerLin hat geschrieben:
Do 31. Mär 2022, 19:15
grundsätzlich funktioniert es mit dem Script, aber ich bekomme keinen Output zurück, den ich gerne für die Diagnose hätte.
Du musst natürlich auch den StdErr lesen, nicht nur den StdOut für den vollständigen output
BerLin hat geschrieben:
Do 31. Mär 2022, 19:15
Starte ich ich das Programm bleibt an der Stelle hängen, welche das Passwort verlangt. Starte ich in der Shell, so werde ich zur Passworteingabe aufgefordert.
Du musst in deinem Pascal programm natürlich auch sshpass benutzen. SSH liest das passwort nicht von STDIN sondern direkt aus dem terminal. sshpass löst das problem indem es ein terminal für ssh emuliert. sshpass hat 500 zeilen C code ich würde dir nicht empfehlen das in Pascal nachzubauen sondern einfach sshpass direkt zu benutzen

Warf
Beiträge: 1909
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: scp mit Passwort-Übergabe

Beitrag von Warf »

Aber mal ne ganz dumme Frage: Warum kann dein shell script keine Log datei haben?

Code: Alles auswählen

#!/bin/bash
set -e
LOG_FILE="$1"
USER="$2"
PASS="$3"
HOST="$4"
FILE="$5"

function download_file() {
  echo Downloading file $FILE
  SCPOUT=$(sshpass -p $PASS scp "$USER@$HOST:$FILE" $FILE 2>&1)
  SCPRET=$?
  if [[ $SCPRET == 0 ]]; then
    echo Success
  else
    echo Failed with output
    echo $SCPOUT
  fi
  return $SCPRET
}

download_file 2>&1 | ts | tee $LOG_FILE
Fürt den SCP download aus und schreibt das inklusive timestamp in den log file (wird angehängt, nicht überschrieben), wenn ein fehler aufkommt wird der fehleroutput von scp mit in das log geschrieben und auf STDOUT asugegebn

Zum aufrufen einfach in deinem Pascal program:

Code: Alles auswählen

if not RunCommand('bash', ['./download_and_log.sh', '/var/log.txt', 'username', 'password',  '192.168.178.104', '/tmp/result.txt'], output) then
  ShowMessage('Error uploading the file, output has been logged to /var/log.txt');
// außerdem steht der output in der variable output

BerLin
Beiträge: 50
Registriert: So 17. Jun 2007, 16:51

Re: scp mit Passwort-Übergabe

Beitrag von BerLin »

Hallo Warf,

vielen Dank für deine Lösung!
Es funktioniert einwandfrei!

Schönes Wochenende
BerLin

Antworten