Автоматизуйте передачу файлів scp за допомогою сценарію оболонки


83

У мене є деяка кількість файлів у каталозі моєї системи Unix. Чи є спосіб написати оболонку, яка передаватиме всі ці файли через scp до вказаної віддаленої системи. Я вкажу пароль у сценарії, щоб мені не потрібно було вводити його для кожного файлу.


2
Скажіть, будь ласка, чи працював пароль у скрипті оболонки з rsync, чи ви пробували це? Дякую.

Відповіді:


88

Замість жорсткого кодування пароля в сценарії оболонки використовуйте 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
Навіть слідуючи цим інструкціям, мені все одно пропонується ввести пароль ... чи існує інший критерій, за яким я відсутній?
scottysseus

@ScottScooterWeidenkopf може бути кілька речей, які можуть бути неправильними, наприклад, .ssh dir або файли дозволених_кейсів можуть не мати належних дозволів (700).
Pradeep Pati

2
@PradeepPati Я зрозумів свою проблему. Ви маєте рацію, проблема полягала в дозволах. У наданому вами посиланні автор згадав деякі зміни дозволу. Я вніс ці зміни, і тепер все працює.
scottysseus

1
Просто щоб уникнути плутанини з використанням цього рішення рішення копіювання та вставлення, на даний момент ця відповідь, здається, переносить ВІД віддаленого в локальний - що протилежне тому, що OP намагається зробити.
Чіабарос,

@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

18

чому ти не спробуєш цього?

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

1
Хороша альтернатива #! /
Usr

16

Ви також можете використовувати 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 /

3
Приємна річ у scp полягає в тому, що вона використовує захищений канал. rsync цього не робить.

3
Ви можете змусити rsync використовувати ssh: 'rsync -avz -e ssh remoteuser @ remotehost: / remote / dir / this / dir /'

@flokra. Дякую, я був саме посередині, додавши це оновлення, і відволікся.
bsisco

9
Це все одно буде викликати інтерактивне запит на введення пароля. Я вважаю, що ОП хотіла повністю автоматизованого рішення
Том Оже

@Dimitri scp -r копіює файли рекурсивно. Це не має нічого спільного із збереженням пароля в сценарії та передачею його до виклику scp через скрипт bash! Я не дуже розумію ваш коментар.
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"

Чи можна використовувати для 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

ось баш-код для 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
Здається, це не стосується пароля.
Делісія Бруммітт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.