У мене є деяка кількість файлів у каталозі моєї системи Unix. Чи є спосіб написати оболонку, яка передаватиме всі ці файли через scp до вказаної віддаленої системи. Я вкажу пароль у сценарії, щоб мені не потрібно було вводити його для кожного файлу.
У мене є деяка кількість файлів у каталозі моєї системи Unix. Чи є спосіб написати оболонку, яка передаватиме всі ці файли через scp до вказаної віддаленої системи. Я вкажу пароль у сценарії, щоб мені не потрібно було вводити його для кожного файлу.
Відповіді:
Замість жорсткого кодування пароля в сценарії оболонки використовуйте 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
його не існує, сміливо створюйте його.
Світлий посібник із керівництвом доступний тут .
#!/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
expect
упакований у MSYS2 збігатиметься з усім результатом, тому перше правило завжди буде відповідати. Якщо ви обміняєтеся порядком обох правил, ви отримаєте бажану поведінку.
чому ти не спробуєш цього?
password="your password"
username="username"
Ip="<IP>"
sshpass -p "$password" scp /<PATH>/final.txt $username@$Ip:/root/<PATH>
Ви також можете використовувати 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 /
#!/usr/bin/expect -f
spawn scp -r BASE.zip abhishek@192.168.1.115:/tmp
expect "password:"
send "wifinetworks\r"
expect "*\r"
expect "\r"
А як щодо узагальнюючих знаків або декількох файлів?
scp file1 file2 more-files* user@remote:/some/dir/
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"
Якщо ви в порядку введення пароля один раз для кожного запуску сценарію, ви можете зробити це легко, використовуючи головне з'єднання 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"
Ви можете зробити це лише за допомогою відкритого / приватного ключів ssh. Або використовуйте шпаклівку, в якій ви можете встановити пароль. scp не підтримує введення пароля в командному рядку.
Інструкції щодо відкритих / закритих ключів можна знайти тут: http://www.softpanorama.org/Net/Application_layer/SSH/scp.shtml
Це буде працювати:
#!/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
ось баш-код для 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#########";
Команда scp
може використовуватися як традиційний UNIX cp
. Отже, якщо ви це зробите:
scp -r myDirectory/ mylogin@host:TargetDirectory
буду працювати