Автоматизация передачи файлов 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

JohnA
источник
Примечание для пользователей 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 /
bsisco
источник
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#########";
Главный арбитр
источник
0

Попробуйте lftp

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

cd $directory

put $srcfile

quit

--EOF--
азазил
источник
-1

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

scp -r myDirectory/ mylogin@host:TargetDirectory

заработает

Дмитрий
источник
1
Это не похоже на пароль.
Delicia Brummitt