Скрипт копирования файлов по сети linux

Automate scp file transfer using a shell script

I have some n number of files in a directory on my unix system. Is there a way to write a shellscript that will transfer all those files via scp to a specified remote system. I’ll specify the password within the script, so that I don’t have to enter it for each file.

Can you please tell me if using a password in shell script with rsync worked or if you tried that? thanks.

14 Answers 14

Instead of hardcoding password in a shell script, use SSH keys, its easier and secure.

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

assuming your private key is at ~/.ssh/id_rsa and the files you want to send can be filtered with *.derp

To generate a public / private key pair :

The above will generate 2 files, ~/.ssh/id_rsa (private key) and ~/.ssh/id_rsa.pub (public key)

To setup the SSH keys for usage (one time task) : Copy the contents of ~/.ssh/id_rsa.pub and paste in a new line of ~devops/.ssh/authorized_keys in myserver.org server. If ~devops/.ssh/authorized_keys doesn’t exist, feel free to create it.

A lucid how-to guide is available here.

Even after following these instructions, I am still prompted for a password. are there other criterion that I am missing?

@ScottScooterWeidenkopf there could be a few things that could be wrong, like the .ssh dir or the authorized_keys files may not have right permissions (700).

@PradeepPati I figured out my problem. You’re right, the problem was the permissions. In the link you provided, the author mentioned some permission changes. I made those changes, and now everything works.

Just to help avoid confusion with copy-paste usage of this solution, currently this answer seems to transfer FROM remote TO local — which is opposite to what the OP is looking to do.

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

Note for windows users: The expect packaged in MSYS2 will match against the whole output, so the 1st rule will always be matched. If you exchange the order of both rules, you get the desired behaviour.

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

you could also use rsync. It seems to work better for multiple files than scp IMHO.

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

You can use rsync via ssh by adding the ‘-e’ switch:

rsync -avzh -e ssh /path/do/dir/ user@remote:/path/to/remote/dir/

This will still invoke an interactive password prompt. I believe the OP wanted a fully automated solution

Читайте также:  Ipsec vpn туннель linux

@Dimitri scp -r copies files recursively. It has nothing to do with storing a password within the script and passing it to the scp call via a bash script! I don’t really understand your comment.

#!/usr/bin/expect -f spawn scp -r BASE.zip abhishek@192.168.1.115:/tmp expect "password:" send "wifinetworks\r" expect "*\r" expect "\r" 

Can expect be used for rsync? I am trying to do something and my RSA key method is not working. It keeps asking me the password for the remote machine.

rsync is a program that behaves in much the same way that rcp does, but has many more options and uses the rsync remote-update protocol to greatly speed up file transfers when the destination file is being updated.

The rsync remote-update protocol allows rsync to transfer just the differences between two sets of files across the network connection, using an efficient checksum-search algorithm described in the technical report that accompanies this package.

Copying folder from one location to another

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

If you are ok with entering your password once for every run of the script, you can do so easily using an SSH master connection.

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

What about wildcards or multiple files?

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

You can do it with ssh public/private keys only. Or use putty in which you can set the password. scp doesn’t support giving password in command line.

There are 2 quick ways of achieving this:

#!/usr/bin/env bash password="YOURPASSWORD" username="YOURUSERNAME" dir_origin="YOURSOURCEDIRECTORY" dir_destination="REMOTEDESTINATION" Ip="SERVERIP" echo "Uploading files to remote server. " sshpass -p "$password" scp -rC $dir_origin $username@$Ip:$dir_destination echo "File upload to remote server completed! ;)" 
#!/usr/bin/env bash password="YOURPASSWORD" username="YOURUSERNAME" dir_origin="YOURSOURCEDIRECTORY" dir_destination="REMOTEDESTINATION" Ip="SERVERIP" echo "Uploading files to remote server. " sshpass -p "$password" rsync -avzh $dir_origin $username@$Ip:$dir_destination echo "File upload to remote server completed! ;)" 

**NOTE :**You need to install sshpass (eg by running apt install sshpass for deb like os eg Ubuntu ) that will enable you to auto upload files without password prompts

Читайте также:  Secret chat telegram linux

Источник

HOW-TO: Скрипт для копирования файлов по сети

Работая в большой компании меня попросили скопировать файл размером 1Мб на удаленные машины под управление Windows XP Pro.

Все было бы хорошо, если бы не количество ПК, на которые необходимо было копировать файл. Их оказалось около 800!. Хорошей новостью было то, что на всех ПК были идентичные настройки, т.е. на каждом ПК был прописан пользователь с правами администратора и разрешен доступ к дискам по сети. У меня имеется рабочий ноутбук, на котором утановлена Xubuntu 10.4, его-то я и задумал использовать, так как много раз читал и слышал о скриптах в Linux и ни разу не доводилось писать их самому.

Перебирая в голове возможные варианты я сразу отмел на последний план вариант с монтированием сетевого каталога, т.к хотелось какой-то легкости и универсальности. Посоветовавшись в IRC на канале #ubuntu-ru, мне было предложено использовать smbclient. Как я и поступил.

Проверка сетевого доступа.

Для начала я посмотрел синтаксис smbclient.

# smbclient Использование: smbclient [-?EgBVNkPe] [-?|--help] [--usage] [-R|--name-resolve=NAME-RESOLVE-ORDER] [-M|--message=HOST] [-I|--ip-address=IP] [-E|--stderr] [-L|--list=HOST] [-t|--terminal=CODE] [-m|--max-protocol=LEVEL] [-T|--tar=c|x>IXFqgbNan] [-D|--directory=DIR] [-c|--command=STRING] [-b|--send-buffer=BYTES] [-p|--port=PORT] [-g|--grepable] [-B|--browse] [-d|--debuglevel=DEBUGLEVEL] [-s|--configfile=CONFIGFILE] [-l|--log-basename=LOGFILEBASE] [-V|--version] [-O|--socket-options=SOCKETOPTIONS] [-n|--netbiosname=NETBIOSNAME] [-W|--workgroup=WORKGROUP] [-i|--scope=SCOPE] [-U|--user=USERNAME] [-N|--no-pass] [-k|--kerberos] [-A|--authentication-file=FILE] [-S|--signing=on|off|required] [-P|--machine-pass] [-e|--encrypt] service password>

Меня интересовали параметры -U и -c. В параметре -U передается имя пользователя, от чьего имени будем выполнять действия. В параметре -c передается строка, состоящая из команд smbclient’а, разделенных знаком «;». Поиграв немного с различными вариантами я нашел свой вариант:

smbclient ///D$/ -U -c 'cd Data; put test.rar; exit'

После тестирования на 2-3 удаленных ПК я озадачился мыслью: «Как же имея список IP адресов в текстовом файле я буду подставлять значения в терминал?». И тут же понял, что необходимо приступать к написанию скритпа.

Пишем скрипт

Имея в запасе немного времени и огромное желание научиться работать со скриптами, я начал осваивать «Bash-Scripting». Посмотрев примеры я сразу для наглядности выделил переменные.

cmdline1='cd Data; put test.rar; exit' share_drive='D$' #диск на удаленной машине login='admin' #логин удаленного пользователя pass='password' #пароль удаленного пользователя

Далее, полистав руководство по Баш-Скриптингу, я нашел как осуществить чтение строк из файла, что давало мне возможность редактировать список хостов независимо от основного скрипта:

Вместо вывода на экран я подставил выполнение команды smbclient с аргументами.

while read line #читаем строку из файла data-file в переменную line и do #и используем ее в скрипте. smbclient //"$line"/D$/ password -U admin -c 'cd Data; put test.rar; exit' done file_ip

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

В итоге я пришел к такому варианту, при котором аргументы передаются из переменных:

#!/bin/bash # IP брать из файла file_ip #команды, которые надо выполнить при логине SmbClient'a на удаленной машине cmdline1='cd Data; put test.rar; exit' share_drive='D$' #диск на удаленной машине login='admin' #логин удаленного пользователя pass='password' #пароль удаленного пользователя while read share_ip #читаем построчно файл с ip адресами (одна строка = один ip адрес) #при таком построении цикла последняя строка в файле помещается в переменную и цикл завершается, #т.е. переменная не используется. Для этого в конце файла я поместил строку 'EoF'. do #используя SMBClient заходим по логину паролю на удаленную машину и выполняем команды, переданные в cmdline1 echo "$share_ip" # для тестирования чтения я использовал вывод значения переменной на экран. smbclient //"$share_ip"/"$share_drive"/ "$pass" -U "$login" -c "$cmdline1" done file_ip echo "All done. "

Заключение

После написания данного скрипта я получил хороший инструмент для сравнительно быстрого копирования файлов по сети. Со временем в скрипт можно добавлять различные проверки (к примеру: убирать дубликаты IP адресов в списке), добавлять команды… Список ограничевается только вашими потребностями и фантазией.

Надеюсь данное руководство найдет своего читателя и поможет приобрести первый опыт по написанию Bash-Script’ов, как помог мне.

  • Сайт
  • Об Ubuntu
  • Скачать Ubuntu
  • Семейство Ubuntu
  • Новости
  • Форум
  • Помощь
  • Правила
  • Документация
  • Пользовательская документация
  • Официальная документация
  • Семейство Ubuntu
  • Материалы для загрузки
  • Совместимость с оборудованием
  • RSS лента
  • Сообщество
  • Наши проекты
  • Местные сообщества
  • Перевод Ubuntu
  • Тестирование
  • RSS лента

© 2018 Ubuntu-ru — Русскоязычное сообщество Ubuntu Linux.
© 2012 Canonical Ltd. Ubuntu и Canonical являются зарегистрированными торговыми знаками Canonical Ltd.

Источник

Оцените статью
Adblock
detector