Выполнение команд на удаленном сервере возвращает результат локальному для обработки и запуска другой команды на удаленном сервере. - PullRequest
0 голосов
/ 06 февраля 2019

Мне очень трудно это обернуть.

Я пытаюсь сделать что-то очень простое - периодически копировать файлы из одной системы Linux в другую через скрипт на локальной машине.

Удаленная система очень ограничена в памяти и поэтому не поддерживает cron или многие из общих библиотек.Единственный способ - запустить скрипт навсегда, чего я бы предпочел не делать.На нем есть scp и ssh для подключения к нему

Я хочу ssh с локального компьютера на удаленный компьютер, запустите команду find для всех файлов моложе дня.

Я хочузатем использовать этот результат и обработать его в виде

scp someone@somewhere.com:"file1.sh file2.txt file3.jpg" /destination

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

Редактировать 1:

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

ssh root@192.168.0.3 'cd /tmp && find -name *.mp4 -mtime -1'

Я должен ввести пароль вручную, хотя это может выполняться как часть скрипта

1 Ответ

0 голосов
/ 07 февраля 2019

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.Вот способ настройки:

  1. создать пару ключей на 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, которая извлекает файлы.

...