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 [email protected]
Если на удаленном сервере стоит порт на SSH не 22, а к примеру 222, то вводим команду так:
ssh-copy-id -i ~/.ssh/id_dsa.pub "-p 222 [email protected]"
Для 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 [email protected]
Если на удаленном сервере стоит порт на SSH не 22, а к примеру 222, то вводим команду так:
/usr/bin/ssh-copy-id -i ~/.ssh/id_dsa.pub "-p 222 [email protected]"
Если ранее Вы не заходили с сервера на сервер, то Вас попросит разрешить подключение, набираем yes, после запросит ввести пароль для пользователя usertwo на удаленный сервер.
Если соединение прошло успешно,то после увидим следующие:
Now try logging into the machine, with "ssh '[email protected]'", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting.
Что и означает, что ключ успешно скопирован на удаленный сервер.
Пробуем теперь зайти по SSH на удаленный сервер командой:
У Вас должно появиться приветствие удаленной системы, так как у меня на удаленной системе стоит FreeBSD, то я вижу следующее:
[userone@server1 ~]$ ssh [email protected] 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 [email protected]:/путь/к/файлу/от/корня/file.txt Если нестандартный порт к примеру 222: scp -P 222 /путь/к/файлу/от/корня/file.txt [email protected]:/путь/к/файлу/от/корня/file.txt
Скопировать несколько файлов из папки по расширению файла на удаленный сервер:
scp /путь/к/файлам/от/корня/*.txt [email protected]:/путь/куда/скопировать/файлы/от/корня/ Если нестандартный порт к примеру 222: scp -P 222 /путь/к/файлам/от/корня/*.txt [email protected]:/путь/куда/скопировать/файлы/от/корня/
Скопировать все файлы из указанной папки без вложенных папок, на удаленный сервер:
scp /путь/к/папке/от/корня/* [email protected]:/путь/куда/скопировать/файлы/от/корня/ Если нестандартный порт к примеру 222: scp -P 222 /путь/к/папке/от/корня/* [email protected]:/путь/куда/скопировать/файлы/от/корня/
Скопировать совершенно все что есть в папке с сохранением структуры каталогов, на удаленный сервер:
scp -r /путь/к/папке/от/корня/ [email protected]:/путь/куда/скопировать/от/корня/ Если нестандартный порт к примеру 222: scp -rP 222 /путь/к/папке/от/корня/ [email protected]:/путь/куда/скопировать/от/корня/
2. Копирование с удаленного сервера.
Скопировать один файл с удаленного сервера (если файла нет, то он скопируется, если есть, то перезапишется):
scp [email protected]:/путь/к/файлу/от/корня/file.txt /путь/к/файлу/от/корня/file.txt Если нестандартный порт к примеру 222: scp -P 222 [email protected]:/путь/к/файлу/от/корня/file.txt /путь/к/файлу/от/корня/file.txt
Скопировать несколько файлов из папки по расширению файла с удаленного сервера:
scp [email protected]:/путь/откуда/скопировать/файлы/от/корня/ /путь/куда/скопировать/файлы/от/корня/*.txt Если нестандартный порт к примеру 222: scp -P 222 [email protected]:/путь/откуда/скопировать/файлы/от/корня/ /путь/куда/скопировать/файлы/от/корня/*.txt
Скопировать все файлы из указанной папки без вложенных папок, с удаленного сервера:
scp [email protected]:/путь/откуда/скопировать/файлы/от/корня/ путь/куда/скопировать/файлы/от/корня/* Если нестандартный порт к примеру 222: scp -P 222 [email protected]:/путь/откуда/скопировать/файлы/от/корня/ путь/куда/скопировать/файлы/от/корня/*
Скопировать совершенно все что есть в папке с сохранением структуры каталогов, на удаленный сервер:
scp -r [email protected]:/путь/откуда/скопировать/от/корня/ /путь/к/папке/от/корня/ Если нестандартный порт к примеру 222: scp -rP 222 [email protected]:/путь/откуда/скопировать/от/корня/ /путь/к/папке/от/корня/
Создаем 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 [email protected]:dirone/file.txt # Копируем структуру каталогов с файлами /usr/bin/scp -r /home/userone/dirtwo/ [email protected]:dirtwo/
[email protected]:dirtwo/ - тут мы не ошиблись, после входа пользователя [email protected] мы сразу попадаем в его домашний каталог, из за чего не обязательно начинать указывать путь от корня.
Теперь добавляем задание в 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
Вот и все...
Если есть вопросы, то просим Вас посетить наш форум, на котором Вы сможете попросить бесплатно описание...
- Show paged
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- Страница для печати