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.

Argelbargel
quelle
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).

Pat Notz
quelle
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 [email protected]:/some/remote/path /some/local/path

oder so wird das Passwort nicht im Bash-Verlauf angezeigt

sshpass -f "/path/to/passwordfile" scp -r [email protected]:/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
KevinS
quelle
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 "[email protected]"

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

Mustafaturan
quelle
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.

gWay
quelle
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/
MBerg
quelle
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.

Prabhjeet
quelle
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;
}
Espo
quelle
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"
Shen JI
quelle
3

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

scp -i ~/.ssh/id_rsa /local/path/to/file [email protected]:/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 [email protected]:/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.

hi15
quelle
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

Kevin Chui
quelle
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 [email protected]:./install.sh .'
    sleep 5
    echo 'scp-passwd'
    sleep 5
    echo 'exit'
) |

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

Ausgabe:

scp [email protected]:install.sh .
bash-4.2$ scp [email protected]:install.sh .
Password: 
install.sh                                 100%   15KB 236.2KB/s   00:00    
bash-4.2$ exit
exit
JohnMudd
quelle
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.

rjray
quelle
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/

Yash
quelle
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

Lange
quelle
-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.

valk
quelle
22
und wie genau geben Sie hier das Passwort ein?
Infografnet