SSH-протокол для передачи файлов и папок (SCP)

SCP (Secure Copy Protocol) — протокол RCP копирования файлов, использующий в качестве транспорта не RSH, а SSH.
В UNIX-подобных операционных системах существует одноимённая (scp) утилита удалённого копирования файлов (входит в состав openssh).

Наша задача по просьбе клиента форума: сделать удаленную переброску файлов с одного сервера на удаленный сервер по средствам SSH с заменой старых файлов или содержимого папки, а также с запуском по крону в определенное время.

Создание ключа аутентификации для SSH
Для начала нам надо организовать без парольный доступ к удаленной машине по средствам SSH протокола и ключа аутентификации.
Доступ SSH должен быть на обоих серверах.
Заходим по средствам SSH на сервер под своим пользователем (в нашем примере пользователь будет "userone") с которого будем передавать файлы. Сразу после входа пользователем userone, мы попадаем в его домашнюю папку /home/userone/ никуда из этой папки не выходим.
Создаем ключи без парольного доступа следующей командой:

ssh-keygen -t dsa

ssh-keygen запросит passphrase, которым можно дополнительно защитить ключи, однако в этом случае придётся каждый раз вводить пароль, а нам нужен без парольный доступ между серверами. Так что жмем три раза кнопу "Enter".
Теперь у нас в папке пользователя создалась папка .ssh и в ней ключи доступа.
Один из ключей доступа нам надо скопировать на удаленный сервер под Вашего пользователя (в нашем примере удаленный пользователь называется "usertwo" и удаленный сервер server2.ua).

Копирование ключа на удаленный сервер
Для CentOS, Debian, Fedora, Gentoo, Mandriva, Ubuntu:

ssh-copy-id -i ~/.ssh/id_dsa.pub usertwo@server2.ua

Если на удаленном сервере стоит порт на SSH не 22, а к примеру 222, то вводим команду так:

ssh-copy-id -i ~/.ssh/id_dsa.pub "-p 222 usertwo@server2.ua"

Для FreeBSD, NetBSD, OpenBSD требуется создать файл ssh-copy-id:
touch /usr/bin/ssh-copy-id
chmod 755 /usr/bin/ssh-copy-id

И вставить в этот файл следующий код:

#!/bin/sh
ID_FILE="${HOME}/.ssh/id_rsa.pub"
if [ "-i" = "$1" ]; then
  shift
  # check if we have 2 parameters left, if so the first is the new ID file
  if [ -n "$2" ]; then
    if expr "$1" : ".*\.pub" > /dev/null ; then
      ID_FILE="$1"
    else
      ID_FILE="$1.pub"
    fi
    shift         # and this should leave $1 as the target name
  fi
else
  if [ x$SSH_AUTH_SOCK != x ] && ssh-add -L >/dev/null 2>&1; then
    GET_ID="$GET_ID ssh-add -L"
  fi
fi
if [ -z "`eval $GET_ID`" ] && [ -r "${ID_FILE}" ] ; then
  GET_ID="cat ${ID_FILE}"
fi
if [ -z "`eval $GET_ID`" ]; then
  echo "$0: ERROR: No identities found" >&2
  exit 1
fi
if [ "$#" -lt 1 ] || [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
  echo "Usage: $0 [-i [identity_file]] [user@]machine" >&2
  exit 1
fi
{ eval "$GET_ID" ; } | ssh ${1%:} "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys" || exit 1
cat <<EOF
Now try logging into the machine, with "ssh '${1%:}'", and check in:
  .ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
EOF

После набрать:
/usr/bin/ssh-copy-id -i ~/.ssh/id_dsa.pub usertwo@server2.ua

Если на удаленном сервере стоит порт на SSH не 22, а к примеру 222, то вводим команду так:

/usr/bin/ssh-copy-id -i ~/.ssh/id_dsa.pub "-p 222 usertwo@server2.ua"

Если ранее Вы не заходили с сервера на сервер, то Вас попросит разрешить подключение, набираем yes, после запросит ввести пароль для пользователя usertwo на удаленный сервер.
Если соединение прошло успешно,то после увидим следующие:

Now try logging into the machine, with "ssh 'usertwo@server2.ua'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.

Что и означает, что ключ успешно скопирован на удаленный сервер.
Пробуем теперь зайти по SSH на удаленный сервер командой:

ssh usertwo@server2.ua

У Вас должно появиться приветствие удаленной системы, так как у меня на удаленной системе стоит FreeBSD, то я вижу следующее:

[userone@server1 ~]$ ssh usertwo@server2.ua
Last login: Sun Nov 29 03:23:19 2009 from 192.168.0.202
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
	The Regents of the University of California.  All rights reserved.
FreeBSD 6.3-RELEASE (GENERIC) #0: Wed Jan 16 04:18:52 UTC 2008
 
$ exit
Connection to server2.ua closed.
[userone@server1 ~]$ 

Теперь мы знаем, что у нас получилось создать без парольный доступ c server1 на server2 (с server2 на server1 доступа не будет). Выходим с удаленного сервера по команде exit.

И приступаем к главной задаче, копирование файлов и папок по протоколу SSH при помощи пакета SCP.

SCP - Безопасное копирование
1. Копирование на удаленный сервер.
Скопировать один файл на удаленный сервер (если файла нет, то он скопируется, если есть, то перезапишется):

scp /путь/к/файлу/от/корня/file.txt usertwo@server2.ua:/путь/к/файлу/от/корня/file.txt
Если нестандартный порт к примеру 222:
scp -P 222 /путь/к/файлу/от/корня/file.txt usertwo@server2.ua:/путь/к/файлу/от/корня/file.txt

Скопировать несколько файлов из папки по расширению файла на удаленный сервер:

scp /путь/к/файлам/от/корня/*.txt usertwo@server2.ua:/путь/куда/скопировать/файлы/от/корня/
Если нестандартный порт к примеру 222:
scp -P 222 /путь/к/файлам/от/корня/*.txt usertwo@server2.ua:/путь/куда/скопировать/файлы/от/корня/

Скопировать все файлы из указанной папки без вложенных папок, на удаленный сервер:

scp /путь/к/папке/от/корня/* usertwo@server2.ua:/путь/куда/скопировать/файлы/от/корня/
Если нестандартный порт к примеру 222:
scp -P 222 /путь/к/папке/от/корня/* usertwo@server2.ua:/путь/куда/скопировать/файлы/от/корня/

Скопировать совершенно все что есть в папке с сохранением структуры каталогов, на удаленный сервер:

scp -r /путь/к/папке/от/корня/ usertwo@server2.ua:/путь/куда/скопировать/от/корня/
Если нестандартный порт к примеру 222:
scp -rP 222 /путь/к/папке/от/корня/ usertwo@server2.ua:/путь/куда/скопировать/от/корня/

2. Копирование с удаленного сервера.
Скопировать один файл с удаленного сервера (если файла нет, то он скопируется, если есть, то перезапишется):
scp usertwo@server2.ua:/путь/к/файлу/от/корня/file.txt /путь/к/файлу/от/корня/file.txt
Если нестандартный порт к примеру 222:
scp -P 222 usertwo@server2.ua:/путь/к/файлу/от/корня/file.txt /путь/к/файлу/от/корня/file.txt

Скопировать несколько файлов из папки по расширению файла с удаленного сервера:

scp usertwo@server2.ua:/путь/откуда/скопировать/файлы/от/корня/ /путь/куда/скопировать/файлы/от/корня/*.txt
Если нестандартный порт к примеру 222:
scp -P 222 usertwo@server2.ua:/путь/откуда/скопировать/файлы/от/корня/ /путь/куда/скопировать/файлы/от/корня/*.txt

Скопировать все файлы из указанной папки без вложенных папок, с удаленного сервера:

scp usertwo@server2.ua:/путь/откуда/скопировать/файлы/от/корня/ путь/куда/скопировать/файлы/от/корня/*
Если нестандартный порт к примеру 222:
scp -P 222 usertwo@server2.ua:/путь/откуда/скопировать/файлы/от/корня/ путь/куда/скопировать/файлы/от/корня/*

Скопировать совершенно все что есть в папке с сохранением структуры каталогов, на удаленный сервер:

scp -r usertwo@server2.ua:/путь/откуда/скопировать/от/корня/ /путь/к/папке/от/корня/
Если нестандартный порт к примеру 222:
scp -rP 222 usertwo@server2.ua:/путь/откуда/скопировать/от/корня/ /путь/к/папке/от/корня/

Создаем ShellScript и устанавливаем его в cron (запланированные задачи по времени)
В пользователе userone создаем в его домашнем каталоге файл runscp.sh и выставляем права на запуск для пользователя:
touch ~/runscp.sh
chmod 755 ~/runscp.sh

Теперь нам требуется в этом shellscript-е указать что запускать.
К примеру если нам надо скачать один файл из одной папки и переписать другую папку на удаленный сервер, то вносим в файл runscp.sh следующие строки:
#!/bin/sh
# Копируем файл на удаленный сервер
/usr/bin/scp /home/userone/dirone/file.txt usertwo@server2.ua:dirone/file.txt
# Копируем структуру каталогов с файлами
/usr/bin/scp -r /home/userone/dirtwo/ usertwo@server2.ua:dirtwo/

usertwo@server2.ua:dirtwo/ - тут мы не ошиблись, после входа пользователя usertwo@server2.ua мы сразу попадаем в его домашний каталог, из за чего не обязательно начинать указывать путь от корня.

Теперь добавляем задание в cron, для автоматического запуска скрипта в нужное время (только из под супер пользователя root, если нет доступа root, то прописать через панель или попросить хостера прописать задание).
Для CentOS, Debian, Fedora, Gentoo, Mandriva, Ubuntu:

echo '0 */1 * * * /bin/sh /home/userone/runscp.sh' >> /var/spool/cron/userone

Для FreeBSD, NetBSD, OpenBSD:
echo '0 */1 * * * /bin/sh /home/userone/runscp.sh' >> /var/cron/tabs/userone

Вот и все...

Если есть вопросы, то просим Вас посетить наш форум, на котором Вы сможете попросить бесплатно описание...



Яндекс.Метрика
Счётчик ТЦ#65533;Ц LiveRSS: Каталог русскоязычных RSS-каналов