Автоматизируйте передачу файлов scp с помощью сценария оболочки - PullRequest
80 голосов
/ 28 августа 2009

У меня есть некоторое количество файлов в каталоге в моей системе Unix. Есть ли способ написать сценарий оболочки, который будет передавать все эти файлы через scp в указанную удаленную систему. Я укажу пароль в скрипте, чтобы мне не приходилось вводить его для каждого файла.

Ответы [ 13 ]

83 голосов
/ 25 апреля 2013

Вместо жесткого ввода пароля в сценарии оболочки используйте ключи SSH, это проще и безопаснее.

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

при условии, что ваш закрытый ключ находится на ~/.ssh/id_rsa

Для создания пары открытый / закрытый ключ:

$ ssh-keygen -t rsa

Приведенное выше сгенерирует 2 файла: ~/.ssh/id_rsa (закрытый ключ) и ~/.ssh/id_rsa.pub (открытый ключ)

Чтобы настроить ключи SSH для использования (одноразовая задача): Скопируйте содержимое ~/.ssh/id_rsa.pub и вставьте новую строку ~devops/.ssh/authorized_keys на myserver.org сервер. Если ~devops/.ssh/authorized_keys не существует, не стесняйтесь его создавать.

Справочник с ясным руководством доступен здесь .

40 голосов
/ 16 декабря 2011
#!/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

15 голосов
/ 16 ноября 2015

почему бы вам не попробовать это?

password="your password"
username="username"
Ip="<IP>"
sshpass -p "$password" scp /<PATH>/final.txt $username@$Ip:/root/<PATH>
15 голосов
/ 28 августа 2009

вы также можете использовать rsync. Кажется, он работает лучше для нескольких файлов, чем scp IMHO.

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

Обновление

Вы можете использовать rsync через ssh, добавив ключ -e:

rsync -avzh -e ssh /path/do/dir/ user@remote:/path/to/remote/dir/
9 голосов
/ 12 июля 2010
#!/usr/bin/expect -f
spawn scp -r BASE.zip abhishek@192.168.1.115:/tmp
expect "password:"
send "wifinetworks\r"
expect "*\r"
expect "\r"
5 голосов
/ 28 августа 2009

А как насчет подстановочных знаков или нескольких файлов?

scp file1 file2 more-files* user@remote:/some/dir/
4 голосов
/ 17 августа 2011

rsync - это программа, которая ведет себя почти так же, как и rcp, но имеет гораздо больше опций и применений. протокол удаленного обновления rsync, чтобы значительно ускорить передачу файлов, когда файл назначения обновлен.

Протокол удаленного обновления rsync позволяет rsync передавать только различия между двумя наборами файлов. через сетевое соединение, используя эффективный алгоритм поиска контрольной суммы, описанный в техническом отчет, который сопровождает этот пакет.


Копирование папки из одного места в другое

   #!/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 голосов
/ 02 июля 2014

Если вы можете вводить пароль один раз для каждого запуска скрипта, вы можете легко сделать это, используя главное соединение SSH.

#!/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"
2 голосов
/ 16 сентября 2009

Вы можете сделать это только с помощью открытых / закрытых ключей ssh. Или используйте замазку, в которой вы можете установить пароль. scp не поддерживает ввод пароля в командной строке.

Инструкции для открытых / закрытых ключей вы можете найти здесь: http://www.softpanorama.org/Net/Application_layer/SSH/scp.shtml

1 голос
/ 04 апреля 2019

вот код bash для SCP с файлом ключа .pem. Просто сохраните его в файле script.sh, затем запустите 'sh script.sh'

Наслаждайтесь

#!/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#########";
...