Автоматизация передачи файлов scp с помощью сценария оболочки


84

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


2
Не могли бы вы сказать мне, сработало ли использование пароля в сценарии оболочки с rsync или вы пробовали это? Благодарю.

Ответы:


90

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

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

предполагая, что ваш закрытый ключ находится в ~/.ssh/id_rsaи файлы, которые вы хотите отправить, могут быть отфильтрованы с помощью*.derp

Чтобы создать пару открытого и закрытого ключей:

$ 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не существует, смело создавайте его.

Подробное руководство доступно здесь .


1
Даже после выполнения этих инструкций мне все равно предлагается ввести пароль ... Есть ли еще один критерий, который мне не хватает?
Скоттиссей 07

@ScottScooterWeidenkopf может быть несколько вещей, которые могут быть неправильными, например, каталог .ssh или файлы authorized_keys могут не иметь правильных разрешений (700).
Прадип Пати

2
@PradeepPati Я понял свою проблему. Вы правы, проблема была в разрешениях. В предоставленной вами ссылке автор упомянул некоторые изменения разрешений. Я внес эти изменения, и теперь все работает.
Скоттиссей 08

1
Просто, чтобы избежать путаницы с использованием этого решения для копирования и вставки, в настоящее время этот ответ, похоже, передается ОТ удаленного к локальному, что противоположно тому, что хочет сделать OP.
Ciabaros

@Ciabaros хороший улов! Я обновил ответ. благодаря!
Прадип Пати

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


Примечание для пользователей Windows: expectупакованные в MSYS2 будут совпадать со всем выводом, поэтому первое правило всегда будет совпадать. Если вы поменяете порядок обоих правил, вы получите желаемое поведение.
fzbd

19

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

password="your password"
username="username"
Ip="<IP>"
sshpass -p "$password" scp /<PATH>/final.txt $username@$Ip:/root/<PATH>

1
Хорошая альтернатива #! / Usr / bin / expect -f
TH_ 02

16

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

rsync -avzh / путь / к / каталогу / пользователю @ удаленный: / путь / к / удаленному / каталогу /

Обновить

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

rsync -avzh -e ssh / путь / do / dir / user @ remote: / path / to / remote / dir /

3
Самое приятное в scp ist то, что он использует безопасный канал. rsync - нет.

3
Вы можете заставить rsync использовать ssh: 'rsync -avz -e ssh remoteuser @ remotehost: / remote / dir / this / dir /'

@flokra. Спасибо, я как раз добавлял это обновление и отвлекся.
bsisco,

9
Это все равно вызовет интерактивный запрос пароля. Я считаю, что OP хотел полностью автоматизированное решение
Том Аугер

@Dimitri scp -r рекурсивно копирует файлы. Это не имеет ничего общего с хранением пароля внутри сценария и передачей его в вызов scp через сценарий bash! Я не совсем понимаю ваш комментарий.
Том Аугер

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"

Можно ли использовать для rsync? Я пытаюсь что-то сделать, но мой метод ключа RSA не работает. Он постоянно спрашивает меня пароль для удаленной машины.

5

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

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

4

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

Если вы согласны вводить пароль один раз при каждом запуске скрипта, вы можете легко сделать это, используя главное соединение 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

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

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


1

Это будет работать:

#!/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

вот 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#########";


-1

Команду scpможно использовать как в традиционной UNIX cp. ТАК, если вы это сделаете:

scp -r myDirectory/ mylogin@host:TargetDirectory

заработает


1
Это не похоже на пароль.
Delicia Brummitt
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.