SSH без ввода паролей
Чтобы выполнить передачу без ввода пароля, вы должны решить, какой машине следует доверять другой.Если двумя хостами являются SRC (хост с файлами) и DEST (хост, куда будут отправляться копии), то либо SRC должен доверять DEST, либо DEST должен доверять SRC (или обоим!).
Допустим, чтоSRC будет доверять DEST, но мы не хотим, чтобы DEST доверял SRC.
Чтобы подключить и запустить копию без взаимодействия с пользователем, вам нужно будет сохранить в DEST эквивалент незашифрованного пароля.По понятным причинам, это не очень хорошая идея, но есть способы минимизировать риск.
Один из вариантов - установить команду типа sshpass
, но тогда вам действительно нужно будет оставить незашифрованный пароль,поэтому я рекомендую не использовать этот метод, если только вам это не нужно.
Лучший способ - настроить аутентификацию с открытым ключом между двумя компьютерами.Обычно при этом вы генерируете закрытый ключ, который хранится в зашифрованном виде.Вы вводите парольную фразу, чтобы разблокировать ее, когда хотите ее использовать, или разблокируете ее один раз и загружаете в такую программу, как ssh-agent
.Последний, вероятно, является предпочтительным подходом (ключ хранится в незашифрованном виде в памяти, но злоумышленник должен уже получить root-доступ, чтобы использовать его. Очевидно, что кто-то с root-доступом может просто записать, как вы вводите свой пароль).
Мы можем избежать начальной записи ключевой фразы, храня закрытый ключ в незашифрованном виде.Если мы не предпримем особых мер предосторожности, очевидно, что хранение секретного ключа в незашифрованном виде в DEST эквивалентно оставлению пароля для SRC.Это плохо.Чтобы минимизировать риск, мы можем настроить SRC так, чтобы он не позволял DEST подключаться и выполнять произвольные команды.Мы можем указать, что должна быть разрешена только одна команда (назовем это COMMAND).Если мы будем осторожны, это несколько снижает риски.
Настройка OpenSSH
Итак, мы решили настроить DEST, чтобы иметь возможность запускать COMMAND на SRC без ввода пароля.Поскольку мы находимся на Linux, мы, вероятно, используем openssh
.Вот способ настройки:
- создать пару ключей на DEST:
dest:~$ cd ~/.ssh
dest:~/.ssh$ ssh-keygen -b 2048 -t rsa -N '' -f src-cmd
копировать открытый ключ в SRC, ограничивая использование определенной командой:
dest:~/.ssh$ ( echo -n 'command="/home/usr/mkfilelist" '; cat src-cmd.pub ) |\
ssh usr@src 'mkdir -p .ssh; cat >> .ssh/authorized_keys'
Теперь из DEST можно выполнить команду
/home/usr/mkfilelist
на SRC (если она существует!) Без запроса пароля:
dest$ ssh usr@src -i ~/.ssh/src-cmd
Для еще большей безопасности рассмотрите возможность использованияfrom=DEST,command=...
так что разрешены только подключения из DEST.Для получения более подробной информации см. Author_keys (5).
Сбор файлов
Теперь нам нужно написать /home/usr/mkfilelist
.
В наши дни rsync
- это хорошопрограмма для синхронизации файлов между двумя наборами папок, но я собираюсь предположить, что SRC предоставляет этот основной продукт UNIX: cpio
!
cpio
читает список имен файлов в stdin и выводит «архив»или читает «архив» и создает файлы.Это будет очень хорошо работать с вашей командой find:
#!/bin/bash
cd /PATH/TO/SRCFILES
find . -mtime -1 -name '*.mp4' -type f -print | cpio -o
Важно отметить, что это изменит «архив» на стандартный вывод (поэтому не пытайтесь запускать его, пока вы не перенаправите в файл),Также обратите внимание, что вы должны убедиться, что find не выводит любые пути к файлам, начинающиеся с /
(отсюда cd
и использование .
).
Измените критерии поиска так, чтобыПопробуйте и сохраните как /home/usr/mkfilelist
на SRC.
Сделайте его исполняемым (chmod +x /home/usr/mkfilelist
).
Соберите все вместе
Теперь мы можем взять эти кусочки и собратьскрипт, который вы можете запустить из cron в DEST:
#!/bin/bash
cd /PATH/TO/DESTFILE
ssh usr@src -i ~/.ssh/src-cmd | cpio -i
Это соединяется с SRC, вызывая генерацию "архива".Он передается в cpio
, запущенный в соответствующей папке DEST, которая извлекает файлы.