Wie übergebe ich ein Passwort an scp?


297

Ich weiß, dass es nicht empfohlen wird, aber ist es überhaupt möglich, das Passwort des Benutzers an scp zu übergeben?

Ich möchte eine Datei als Teil eines Stapeljobs über scp kopieren, und der empfangende Server benötigt natürlich ein Kennwort, und nein, ich kann das nicht einfach in eine schlüsselbasierte Authentifizierung ändern.


2
Siehe auch (spätere) Frage: stackoverflow.com/questions/1462284/…, wobei in einer Antwort ein anderer möglicher Weg erwähnt wird, dies zu tun. (NB: Dies ist keine doppelte Frage - es ist das Original, das die anderen duplizieren.)
Jonathan Leffler

Antworten:


35

Sie können Skript es mit einem Tool wie Expect (es gibt praktisch Bindungen auch, wie Pexpect für Python).


1
Der Link zu expected.nist.gov ist defekt. Vielleicht das?: Expect.sourceforge.net
Katapofatico

sudo apt-get install erwarten
SDsolar

>> brauen info sshpass Fehler: Keine verfügbare Formel mit dem Namen "sshpass" Wir werden sshpass nicht hinzufügen, da es für unerfahrene SSH-Benutzer zu einfach ist, die Sicherheit von SSH zu ruinieren. ;)
Lukas NP Egger

528

Verwenden Sie sshpass :

sshpass -p "password" scp -r user@example.com:/some/remote/path /some/local/path

oder so wird das Passwort nicht im Bash-Verlauf angezeigt

sshpass -f "/path/to/passwordfile" scp -r user@example.com:/some/remote/path /some/local/path

Das obige kopiert den Inhalt des Pfads vom Remote-Host zu Ihrem lokalen.

Installieren :

  • Ubuntu / Debian
    • apt install sshpass
  • Centos / Fedora
    • yum install sshpass
  • Mac mit Macports
    • port install sshpass
  • Mac mit Gebräu
    • brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb

14
Unter Ubuntu 12.04 funktionierte es bei mir nur mit einfachen Anführungszeichen über dem Passwort (zB 'Passwort' anstelle von "Passwort").
odedfos

6
@odedfos, ja, Sie müssen einfache Anführungszeichen verwenden, da einige kennwortgenerierte Zeichen eine spezielle Interpretation bei der Interpolation von Zeichenfolgen in doppelten Anführungszeichen haben können
TerryE

7
So installieren Sie sshpassapt-get install sshpass
Jan-Terje Sørensen

6
Auf CentOS ist esyum -y install sshpass
jgritty

19
Der sicherste Weg dies zu tun ist mit einem Passwort - Datei , wie folgt aus : sshpass -f passwdfile` scp [...] . This way, the password won't show up in ps` Inserate etc. und Sie können das Passwort mit Dateiberechtigungen schützen.
Christopher Schultz

50

Generieren Sie einfach einen SSH-Schlüssel wie:

ssh-keygen -t rsa -C "your_email@youremail.com"

Kopieren Sie den Inhalt von ~/.ssh/id_rsa.pub und fügen Sie ihn zuletzt zu den Remotecomputern hinzu~/.ssh/authorized_keys

Stellen Sie sicher, dass der Remote-Computer über die Berechtigungen 0700 for ~./ssh folderund verfügt0600 for ~/.ssh/authorized_keys


35
Wie ich schrieb: Nein, ich kann nicht einfach zur schlüsselbasierten Authentifizierung wechseln.
Argelbargel

3
Meinen Sie eher .authorized_keys als. authorisation_keys?
HelloWorld

2
Eine gültige Verwendung hierfür wäre ein Bash-Skript, das mehrere scp / ssh-Aufrufe an einen Server ausführt, auf dem Sie den Benutzer nach dem Kennwort für den Remote-Server fragen möchten. Das Passwort wird dann nicht in der Historie angezeigt und Sie haben immer noch die Möglichkeit, das Passwort herauszufordern ... aber nur einmal. Ich möchte keine Schlüsseldatei verwenden, da ich den Skriptbenutzer weiterhin authentifizieren möchte.
Wes Grant

2
Eine andere gültige Verwendung wäre, wenn Sie die schlüsselbasierte Authentifizierung auf dem Ziel nicht einfach aktivieren können. Beispiel: Einer der wichtigsten NAS-Hersteller - Synology mit seinem DSM 6.0 - unterstützt es auch 2016 nicht. Sicher, Sie könnten mit Konfigurationsdateien herumspielen und hoffen, dass ein Update es nicht einfach wieder überschreibt (das Aktualisieren von DSM führt häufig zu benutzerdefinierten Änderungen ). Manchmal - besonders wenn das OP ausdrücklich schreibt, dass es bereits nicht optimal ist - brauchen die Leute nur eine Lösung.
Aaa

3
Sie sollten verwenden, ssh-copy-id -i ~/.ssh/id_rsa.pub <remote_server>um den Schlüssel auf dem Remote-Server zu kopieren
RousseauAlexandre

39

Wenn Sie von Windows aus eine Verbindung zum Server herstellen, können Sie mit der Putty-Version von scp ("pscp") das Kennwort mit dem -pwParameter übergeben.

Dies wird in der Dokumentation hier erwähnt.


1
Zeigen Sie bitte ein Beispiel.
SDsolar

Möglicherweise möchten Sie Ihrem Pfad auch C: \ Programme (x86) \ PuTTY hinzufügen, um diese Befehle zu verwenden.
SDsolar

1
@ SDDsolar hier ist ein Syntaxbeispiel: pscp -pw 'MyPa$$word' username@servername:/somedir/somefile ~/somedest(Ich hasse es, Kitt wie diesen zu verwenden, aber es funktioniert)
Genorama

29

curl kann als Alternative zu scp zum Kopieren einer Datei verwendet werden und unterstützt ein Kennwort in der Befehlszeile.

curl --insecure --user username:password -T /path/to/sourcefile sftp://desthost/path/

Es ist ziemlich langsamer als 'scp', aber es macht den Job gut.
Victor

Ich fand dies schneller, wenn das Ziel mit einer großen Verzögerung bei der Passwortabfrage konfiguriert ist. scpmuss mehr als 30 Sekunden warten, damit ich ein Passwort eingeben kann, hat aber curlsofort funktioniert.
Ghost8472

@ Ghost8472 ja konfiguriert, aber manchmal löst diese Verzögerung den Hostnamen auf und tritt auch für SFTP auf.
McKenzm

1
Ich habe "curl: (1) Protokoll" sftp "in libcurl nicht unterstützt oder deaktiviert"
kronuus

21

Sie können das Skript "erwarten" unter Unix / Terminal verwenden

Erstellen Sie zum Beispiel 'test.exp':

#!/usr/bin/expect
        spawn scp  /usr/bin/file.txt root@<ServerLocation>:/home
        set pass "Your_Password"
        expect {
        password: {send "$pass\r"; exp_continue}
                  }

Führen Sie das Skript aus

expect test.exp 

Ich hoffe das hilft.


7
Voraussetzung: sudo apt-get install erwarten
SDsolar

10

Hier ist ein Beispiel, wie Sie es mit dem expectTool machen:

sub copyover {
    $scp=Expect->spawn("/usr/bin/scp ${srcpath}/$file $who:${destpath}
+/$file");
    $scp->expect(30,"ssword: ") || die "Never got password prompt from
+ $dest:$!\n";
    print $scp 'password' . "\n";
    $scp->expect(30,"-re",'$\s') || die "Never got prompt from parent 
+system:$!\n";
    $scp->soft_close();
    return;
}

2
Das ist in Perl, sorry, das habe ich nicht geschrieben. (Vor 5 Jahren :))
Espo


3

Sie können verwenden ssh-copy-id, um den SSH-Schlüssel hinzuzufügen:

$which ssh-copy-id #check whether it exists

Wenn vorhanden:

ssh-copy-id  "user@remote-system"

3

Sobald Sie ssh-keygenwie oben beschrieben eingerichtet haben, können Sie dies tun

scp -i ~/.ssh/id_rsa /local/path/to/file remote@ip.com:/path/in/remote/server/

Wenn Sie die Eingabe jedes Mal verringern möchten, können Sie Ihre .bash_profileDatei ändern und einfügen

alias remote_scp='scp -i ~/.ssh/id_rsa /local/path/to/file remote@ip.com:/path/in/remote/server/

Dann von Ihrem Terminal aus tun source ~/.bash_profile. Wenn Sie anschließend remote_scpIhr Terminal scpeingeben, sollte der Befehl ohne Kennwort ausgeführt werden.


2
  1. Stellen Sie sicher, dass Sie das Tool "Erwarten" haben, wenn nicht, tun Sie es

    # apt-get install expect

  2. Erstellen Sie eine Skriptdatei mit folgendem Inhalt. (# vi / root / scriptfile)

    spawn scp /path_from/file_name user_name_here@to_host_name:/path_to

    expect "password:"

    send put_password_here\n;

    interact

  3. Führen Sie die Skriptdatei mit dem Tool "erwarten" aus

    # expect /root/scriptfile


1

Hier ist das Linux / Python / Expect-ähnliche Beispiel eines armen Mannes, das auf diesem Blog-Beitrag basiert: Upgrade einfacher Shells auf vollständig interaktive TTYs . Ich brauchte dies für alte Maschinen, auf denen ich Expect nicht installieren oder Python keine Module hinzufügen kann.

Code:

(
    echo 'scp jmudd@mysite.com:./install.sh .'
    sleep 5
    echo 'scp-passwd'
    sleep 5
    echo 'exit'
) |

python -c 'import pty; pty.spawn("/usr/bin/bash")'

Ausgabe:

scp jmudd@mysite.com:install.sh .
bash-4.2$ scp jmudd@mysite.com:install.sh .
Password: 
install.sh                                 100%   15KB 236.2KB/s   00:00    
bash-4.2$ exit
exit

0

Eine Alternative wäre, die öffentliche Hälfte des Benutzerschlüssels zur Datei mit den autorisierten Schlüsseln auf dem Zielsystem hinzuzufügen. Auf dem System, von dem aus Sie die Übertragung initiieren, können Sie einen ssh-agent-Daemon ausführen und dem Agenten die private Hälfte des Schlüssels hinzufügen. Der Stapeljob kann dann so konfiguriert werden, dass der Agent den privaten Schlüssel abruft, anstatt nach dem Kennwort des Schlüssels zu fragen.

Dies sollte entweder auf einem UNIX / Linux-System oder auf einer Windows-Plattform mit pageant und pscp möglich sein.


4
Die Frage besagte, dass er keine schlüsselbasierte Authentifizierung verwenden kann.
Barmar

2
Wenn ich es wäre, kann ich den anderen Server vermutlich nicht ändern. Ich möchte lediglich eine Datei kopieren.
SDsolar

-1

Alle oben genannten Lösungen können nur funktionieren, wenn Sie die App installiert haben oder die Administratorrechte für die Installation außer oder sshpass haben sollten.

Ich fand diesen sehr nützlichen Link, um den scp einfach im Hintergrund zu starten.

$ nohup scp file_to_copy user@server:/path/to/copy/the/file > nohup.out 2>&1

https://charmyin.github.io/scp/2014/10/07/run-scp-in-background/


1
Wie würde das Ausführen des scp im Hintergrund das Passwort eingeben?
thomas.han

-3

schritte um sshpass zu bekommen Für rhel / centos 6:

# wget http://epel.mirror.net.in/epel/6/i386/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm
# yum install sshpass

Quelle: https://community.mapr.com/thread/9040


-9

Ich fand diese wirklich hilfreiche Antwort hier .

rsync -r -v --progress -e ssh user@remote-system:/address/to/remote/file /home/user/

Sie können dort nicht nur das Passwort übergeben, sondern auch den Fortschrittsbalken beim Kopieren anzeigen. Wirklich großartig.


22
und wie genau geben Sie hier das Passwort ein?
Infografnet
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.