Вы можете использовать сце-нарий, описанный в этом разделе, для пересылки файла или директории файлов (включая все подкаталоги) от одной системы к другой, используя в каждой из сис-тем сессии оболочки. Сценарий в ходе работы создает демон rsync (рассматривает-ся в главе 11) на фоне процесса для пересылки указанного файла или директории. Он отображает слегка отличающиеся друг от друга формы команд rsync, которые могут быть использованы для получения этого файла или директории. Сценарий может не существовать в системе-адресате, поэтому он даже может применяться для пересылки самого себя. Пакет rsync должен быть установлен на обе системы.
. Uy-.l Передающая система должна иметь открытый сетевой доступ для номера порта, который используется для соединения с rsync. Номер порта случайным образом выбирается из об-ласти от 12 288 до 28 671. Вы можете обойти случайный выбор порта путем использования параметра -р, за которым указывается номер порта. Если ваш брандмауэр разрешает со-единение только через один или небольшое количество портов, вы должны использовать со сценарием эти номера портов.
Для передачи данных сначала запустите сценарий на передающей системе. Когда он выведет образцы команд, выберите подходящую, основываясь на IP-адресе или имени хоста, которые могут достигнуть принимающей системы. Кроме того, опре-делите целевое место назначения, где на принимающей системе должны быть сохра-нены файл или директория. Скопируйте выбранную командную строку и вставьте команду в оболочку принимающей системы для выполнения демона rsync, полу-чающего данные. Демон продолжит работу, когда передача будет закончена. Он позволит вам пересылать файл или директорию несколько раз на несколько ком-пьютеров. Остановите демон по завершении передач, нажав сочетание клавиш Ctrl+C в окне оболочки передающей системы.

  • Us?-] Этот сценарий небезопасен. Любой, кто может получить адрес и номер порта, на котором ожидает сценарий, может перехватить передаваемые данные. Вы не должны использовать сценарий для передачи конфиденциальных или секретных данных. Вместо него попробуйте scp или sftp. Убедитесь в ликвидации демона после окончания передачи желаемых дан-ных.

Рекомендуемое имя для этого сценария — rsend.

  1. !/bin/bash #
  2. Copyright © 2006 - Philip Howard - All rights reserved
[li]# # script rsend[/li] [li]# # purpose To start an rsync daemon in the shell foreground[/li]
  1. to send a specified directory or file when
  2. retrieved using one of the rsync command lines
  3. shown, by pasting it in a shell session on another
  4. host.
[li]# # usage rsend [options] directory | file[/li]

  1. -d change daemon to the specified directory
  2. -n include dryrun in the rsync command lines
  3. -p use the specified port number, else random
  4. -s include sparse in the rsync command lines
  5. -u user to run as, if started as root
  6. -v show extra information


dryrun="n"
( х-р | x--port ) shift port="${l}"
( x--port=* ) port="${l:7}"
( x-s | x--sparse ) sparse="S"
( x-u | x--user ) shift uid="${l}"
( x--user=* ) uid="${l:7}"
( x-v | x--verbose )
verbose=l
:: esac shift
done #

  1. Получаем случайное число для порта.
[li]#

if [[ -z ,,${port}" || ..${port}" = 0 || ,,${port}" = . ]]; then port=$( dd if=/dev/urandom ibs=2 obs=2 count=l 2>/dev/null \
[/li] | od -An -tu2 | tr -d 1 ' ) port=$[ Sport % 16384 ] port=$[ Sport + 12288 ]
fi #

  1. Составляем имена для временных файлов.
[li]#

conffi1e="/tmp/rsync- ${whoami}-S{port}-$$.conf"
[/li] 1ockfi1e="/tmp/rsync- ${whoami}- ${port}-$S.1ock" #

  1. Эта функция добавляет кавычки к строке, которой они нужны.
  2. Добавляет одинарную кавычку, если указано: пробел $ "
  3. Добавляет двойные кавычки, если указано: '
  4. : не все комбинации будут работать.
[li]#

function strquote { local str
[/li] str-$( echo "${1}" | tr -d 1 ) if [[ "${str}" != "S{1}" ]]; then echo "'${1Г return fi
str=$( echo "${1}" | tr -d )
if [[ "S{str}" != "${1}" ]]; then
echo S{1}
return fi
echo "${1}" return О
} #

  1. Только одно имя может быть обработано.
[li]#

if [[ $# -gt 1 ]]; then echo "Only one паше (directory or file)" 1>&2 exit 1
[/li] elif [[ $# -eq 1 ]]: then
name-"${l}" else
name-$( exec pwd )
fi #

  1. Устанавливаем временный файл конфигурации.
[li]# # Аргументы:[/li]
  1. $1 Директория передается или указывается, откуда начинается передача
  2. $2 Не используется (АО: должна быть переименована)
  3. $3 Файл перемешается (если задан одиночный файл)
[li]#

function configout {
[/li] echo "lock file = ${lockfile}"
echo "log file - /dev/stderr"
echo "use chroot = false"
echo "max connections - 32"
echo "socket options = SOJCEEPALIVE"
echo "list - yes"
echo "[.]"
echo "path - ${1}"
echo "read only = yes"
echo "uid = ${uid}"
echo "comment = ${2}" if [[ -n "${3}" ]]; then
echo "include = **/${3}"
echo "exclude - **" fi
} #

  1. Получаем директорию и файл.

Ф
if [[ ! -е "${name}" ]]; then echo "does not exist:" $( strquote "${name}" ) 1>&2 exit 1
elif [[ -d "${name}" ]]; then p=$( exec dirname "${name}" ) b-$( exec basename "${name}" )
d="${name}" f=„„
r-$( cd "${name}" && exec pwd ) announce="${d}"
rsyncopt="-a${checksum}${dryrun}H${sparse}vz${delete}" configout "${d}/." "directory:${d}/" >"${conffile}" elif [[ -f "${name}" ]]; then p-$( exec dirname "${name}" ) b=$( exec basename "${name}" ) d="${p}" f="${b}"
r-$( cd "${p}" && exec pwd )
r="${r}/${b}"
announce="${d}/${f}"
rsyncopt-'-a${checksum}${dryrun}${sparse}vz" configout "${d}/." "fi 1e:${d}/${f}" >,,${conffile}" elif [[ -L "${name}" ]]; then p=$( exec dirname "Sfname}" ) b=$С exec basename "${name}" ) d="${p}" f="${b}"
r-$( cd "${p}" && exec pwd ) r="${r}/${b}" announce="S{d}/${f}" rsyncopt="-a${checksum)v"
configout "${d}/." "symlink:${d}/${f}" "${f}" >"${conffile}"
fi #

  1. Отображаем файл конфигурации, если просят.
[li]#

if [[ -п "${verbose}" ]]; then echo "${bar2}" Is -Id "${conffile}" echo "${bar2}" cat "${conffile}"
[/li] fi #

  1. Эта функция выводит пример принимаемой команды. #—-

function showrsync { echo -n "rsync ${rsyncopt} " if [[ -n "${oldfmt}" ]]; then
echo "--port=${port}" J( strquote "${1}::S{2}" ) $( strquote "${3}" ) else
echo $( strquote "rsync://$;i}:${port}/${2}" ) $( strquote "${3}" )
fi
return
}

[li]# # Эта функция показывает команду rsync для имени хоста и IP-адреса.[/li] [li]#

function getip { case $( exec uname -s ) in ( SunOS )
[/li] netstat -i -n | awk '{print $4;}' ( Linux )
ifconfig -а | awk '{if(Jl="inet")print substrC$2.6);}'
Г* )
netstat -i -n | awk '{print $4;}'
Esac return
}
function ipaddr { getip \
| egrep ,A[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$' \
| egrep -v IA0\.|A127\.1 \
| head -2 \
j while read ipv4 more ; do
showrsync "${ipv4}"
done
return
}
function showcmd { ipaddr "${2}" "${3}" showrsync "${1}" "${2}" "${3}" return
} #

  1. Объявляем команды оболочки для получения их данных.
[li]#

echo "${bar2}"
[/li] echo "# sending ${announce}"
echo "# paste ONE of these commands in a remote shell to receive" if [[ -d "${name}" ]]: then echo "${barl}" showcmd "${hostname}" . . echo "${barl}"
showcmd "${hostname}" . "${b}"
if [[ "${d}" !- "${b}" && "${d}" !- "${r}" ]]; then
echo "${barl}"
showcmd "${hostname}" . "${d}" fi
echo "${barl}"
showcmd "${hostname}" "${r}" else echo "${barl}"
showcmd "${hostname}" "./${f}" "${b}" s=$( exec basename "J{d}" ) s-"${s}/${f}"
if [[ "${s}" != "${b}" ]]; then echo "${barl}"
showcmd "$(hostnameJ" ",/${f}" "${s}" fi
if [[ "${name}" != "${b}" \
&& "${name}" != "${s}" \ && "${name}" != "${r}" ]]; then
echo "${barl}"
showcmd "${hostname}" ",/${f}" "${name}" fi
echo "${barl}"
showcmd "${hostname}" ",/${f}" "${r}"
fi
echo "${barl}"
echo "# press ЛС here when done"
echo "${bar2}" #

  1. Запускаем rsync в режиме демона.
[li]#

s="D0NE"
[/li] trap 's="SIGINT ... DONE"' INT trap 's="SIGTERM ... DONE"' TERM
rsync --daemon --no-detach "--config=${conffile}" "--port=${port}" rm -f "${conffile}" "${lockfile}" echo "${s}"