Automatisieren Sie die Übertragung von SCP-Dateien mithilfe eines Shell-Skripts

83

Ich habe einige n Dateien in einem Verzeichnis auf meinem Unix-System. Gibt es eine Möglichkeit, ein Shellscript zu schreiben, das alle diese Dateien über scp auf ein bestimmtes Remote-System überträgt? Ich werde das Passwort im Skript angeben, damit ich es nicht für jede Datei eingeben muss.

Pradeep Pati
quelle
2
Können Sie mir bitte sagen, ob die Verwendung eines Passworts in einem Shell-Skript mit rsync funktioniert hat oder ob Sie das versucht haben? Vielen Dank.

Antworten:

88

Verwenden Sie SSH-Schlüssel, anstatt das Kennwort in einem Shell-Skript fest zu codieren. Dies ist einfacher und sicherer.

$ scp -i ~/.ssh/id_rsa devops@myserver.org:/path/to/bin/*.derp .

Angenommen, Ihr privater Schlüssel ist bei ~/.ssh/id_rsa

So generieren Sie ein öffentliches / privates Schlüsselpaar:

$ ssh-keygen -t rsa

Das obige generiert 2 Dateien, ~/.ssh/id_rsa(privater Schlüssel) und ~/.ssh/id_rsa.pub(öffentlicher Schlüssel)

So richten Sie den SSH - Schlüssel für die Nutzung (einmalige Aufgabe): Kopieren Sie den Inhalt ~/.ssh/id_rsa.pubund in einer neuen Linie von Paste ~devops/.ssh/authorized_keysin myserver.orgServer. Wenn ~devops/.ssh/authorized_keyses nicht existiert, können Sie es erstellen.

Eine übersichtliche Anleitung finden Sie hier .

Pradeep Pati
quelle
1
Selbst nachdem ich diese Anweisungen befolgt habe, werde ich immer noch zur Eingabe eines Passworts aufgefordert. Gibt es ein anderes Kriterium, das mir fehlt?
Scottysseus
@ScottScooterWeidenkopf Es kann einige Dinge geben, die falsch sein können, wie das .ssh-Verzeichnis oder die autorisierten_keys-Dateien, die möglicherweise nicht die richtigen Berechtigungen haben (700).
Pradeep Pati
1
@PradeepPati Ich habe mein Problem herausgefunden. Sie haben Recht, das Problem waren die Berechtigungen. In dem von Ihnen angegebenen Link erwähnte der Autor einige Berechtigungsänderungen. Ich habe diese Änderungen vorgenommen und jetzt funktioniert alles.
Scottysseus
42
#!/usr/bin/expect -f

# connect via scp
spawn scp "[email protected]:/home/santhosh/file.dmp" /u01/dumps/file.dmp
#######################
expect {
  -re ".*es.*o.*" {
    exp_send "yes\r"
    exp_continue
  }
  -re ".*sword.*" {
    exp_send "PASSWORD\r"
  }
}
interact

http://blogs.oracle.com/SanthoshK/entry/automate_linux_scp_command

JohnA
quelle
Hinweis für Windows-Benutzer: Das expectin MSYS2 gepackte Paket stimmt mit der gesamten Ausgabe überein, sodass die erste Regel immer übereinstimmt. Wenn Sie die Reihenfolge beider Regeln austauschen, erhalten Sie das gewünschte Verhalten.
fzbd
18

warum versuchst du das nicht

password="your password"
username="username"
Ip="<IP>"
sshpass -p "$password" scp /<PATH>/final.txt $username@$Ip:/root/<PATH>
Veerendra Kakumanu
quelle
1
Schöne Alternative zu #! / Usr / bin /
require
16

Sie können auch rsync verwenden. Es scheint für mehrere Dateien besser zu funktionieren als scp IMHO.

rsync -avzh / path / to / dir / user @ remote: / path / to / remote / dir /

Aktualisieren

Sie können rsync über ssh verwenden, indem Sie den Schalter '-e' hinzufügen:

rsync -avzh -e ssh / path / do / dir / user @ remote: / path / to / remote / dir /
bsisco
quelle
3
Das Schöne an scp ist, dass es einen sicheren Kanal verwendet. rsync nicht.
3
Sie können rsync zwingen, ssh zu verwenden: 'rsync -avz -e ssh remoteuser @ remotehost: / remote / dir / this / dir /'
@ Flokra. Danke, ich war gerade dabei, dieses Update hinzuzufügen und wurde abgelenkt.
Bsisco
9
Dadurch wird weiterhin eine interaktive Kennwortabfrage aufgerufen. Ich glaube, das OP wollte eine vollautomatische Lösung
Tom Auger
@Dimitri scp -r kopiert Dateien rekursiv. Es hat nichts damit zu tun, ein Passwort im Skript zu speichern und es über ein Bash-Skript an den scp-Aufruf weiterzuleiten! Ich verstehe Ihren Kommentar nicht wirklich.
Tom Auger
9
#!/usr/bin/expect -f
spawn scp -r BASE.zip abhishek@192.168.1.115:/tmp
expect "password:"
send "wifinetworks\r"
expect "*\r"
expect "\r"
Abhinav Gupta
quelle
Kann erwartet werden, für rsync verwendet zu werden? Ich versuche etwas zu tun und meine RSA-Schlüsselmethode funktioniert nicht. Es fragt mich immer wieder nach dem Passwort für den Remote-Computer.
5

Was ist mit Platzhaltern oder mehreren Dateien?

scp file1 file2 more-files* user@remote:/some/dir/

quelle
4

rsync ist ein Programm, das sich ähnlich wie rcp verhält, jedoch viel mehr Optionen bietet und das Remote-Aktualisierungsprotokoll rsync verwendet, um die Dateiübertragung beim Aktualisieren der Zieldatei erheblich zu beschleunigen.

Mit dem rsync-Remote-Update-Protokoll kann rsync nur die Unterschiede zwischen zwei Dateigruppen über die Netzwerkverbindung übertragen. Dabei wird ein effizienter Prüfsummen-Suchalgorithmus verwendet, der im technischen Bericht zu diesem Paket beschrieben ist.


Ordner von einem Speicherort an einen anderen kopieren

   #!/usr/bin/expect -f   
   spawn rsync -a -e ssh username@192.168.1.123:/cool/cool1/* /tmp/cool/   
   expect "password:"   
   send "cool\r"   
   expect "*\r"   
   expect "\r"  
K. Govind Anupam
quelle
3

Wenn Sie Ihr Kennwort bei jeder Ausführung des Skripts einmal eingeben können, können Sie dies problemlos über eine SSH-Master-Verbindung tun.

#!/usr/bin/env bash

USER_AT_HOST="user@host"  # use "$1@$2" here if you like
SSHSOCKET=~/".ssh/$USER_AT_HOST"

# This is the only time you have to enter the password:
# Open master connection:
ssh -M -f -N -o ControlPath="$SSHSOCKET" "$USER_AT_HOST"

# These do not prompt for your password:
scp -o ControlPath="$SSHSOCKET" file1.xy "$USER_AT_HOST":remotefile1.xy
scp -o ControlPath="$SSHSOCKET" file2.xy "$USER_AT_HOST":remotefile2.xy

# You can also use the flag for normal ssh:
ssh -o ControlPath="$SSHSOCKET" "$USER_AT_HOST" "echo hello"
ssh -o ControlPath="$SSHSOCKET" "$USER_AT_HOST" "echo world"

# Close master connection:
ssh -S "$SSHSOCKET" -O exit "$USER_AT_HOST"
Felix Rabe
quelle
2

Sie können dies nur mit öffentlichen / privaten SSH-Schlüsseln tun. Oder verwenden Sie Kitt, in dem Sie das Passwort festlegen können. scp unterstützt die Eingabe eines Passworts in der Befehlszeile nicht.

Anweisungen für öffentliche / private Schlüssel finden Sie hier: http://www.softpanorama.org/Net/Application_layer/SSH/scp.shtml

Vereb
quelle
1

Das wird funktionieren:

#!/usr/bin/expect -f

spawn scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no file1 file2 file3 user@host:/path/
expect "password:"
send "xyz123\r"
expect "*\r"
expect "\r"
interact
Rishi Sinha
quelle
1

Hier ist Bash-Code für SCP mit einer .pem-Schlüsseldatei. Speichern Sie es einfach in einer script.sh-Datei und führen Sie es mit 'sh script.sh' aus.

Genießen

#!/bin/bash
#Error function
function die(){
echo "$1"
exit 1
}

Host=ec2-53-298-45-63.us-west-1.compute.amazonaws.com
User=ubuntu
#Directory at sent destination
SendDirectory=scp
#File to send at host
FileName=filetosend.txt
#Key file
Key=MyKeyFile.pem

echo "Aperture in Process...";

#The code that will send your file scp
scp -i $Key $FileName $User@$Host:$SendDirectory || \
die "@@@@@@@Houston we have problem"

echo "########Aperture Complete#########";
Chief_Arbiter
quelle
0

Versuchen Sie es mit lftp

lftp -u $user,$pass sftp://$host << --EOF--

cd $directory

put $srcfile

quit

--EOF--
Azazil
quelle
-1

Der Befehl scpkann wie ein traditionelles UNIX verwendet werden cp. Also, wenn Sie dies tun:

scp -r myDirectory/ mylogin@host:TargetDirectory

wird funktionieren

Dimitri
quelle
1
Dies scheint das Passwort nicht zu adressieren.
Delicia Brummitt