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.


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 .


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 "user@example.com:/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


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>

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 /

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"

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/

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"  

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"


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

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#########";

0

Versuchen Sie es mit lftp

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

cd $directory

put $srcfile

quit

--EOF--

-1

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

scp -r myDirectory/ mylogin@host:TargetDirectory

wird funktionieren


1
Dies scheint das Passwort nicht zu adressieren.
Delicia Brummitt
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.