Короткая история:
$ ssh centos@Server '(cd /var/log/service && find . -newermt 2020-10-22 -a ! -newermt 2020-10-23 | tar -T - -jcf -)' | tar -C /target/directory -j -x -f -
Длинная история:
Продолжение чтения.
S SH Пульт ДУ Вызов команды
Вы используете s sh для вызова удаленной команды,
$ ssh centos@Server "ls -lh /var/log/service | grep 'Oct 22'"
На удаленной стороне, centos@Server
, демон s sh, подключенный к вашему ssh / login соединение выполняет конвейер,
$ ls -lh /var/log/service | grep 'Oct 22'
Пульт s sh принимает стандартный его вывод, все еще включенный centos@Server
, передает его через соединение s sh и выводит его локально , на локальном стандартном выходе (ваш терминал).
Вы могли бы точно так же сказать,
$ ssh centos@Server "ls -lh /var/log/service" | grep 'Oct 22'
Обратите внимание на небольшую разницу: вместо того, чтобы выполнять весь канал удаленно ( Ваша исходная удаленная команда встраивает символ "|
в кавычки), теперь у вас есть |
без кавычек и две связанные с ним команды
ssh centos@Server "ls -lh /var/log/service"
. Он выполняет ls
удаленно и выводит свой стандартный вывод через соединение s sh. grep 'Oct 22'
работает локально и фильтрует вывод команды s sh, как и прежде. Только локально.
find
и tar
Войдите в систему интерактивно в centos@Server
и выполните следующие команды:
$ cd /var/log/service
$ find . -newermt 2020-10-22 -a ! -newermt 2020-10-23
Вы увидите список файлов (и каталогов, и других записей, которые могут существовать), которые вы хотите скопировать. man find
расскажет вам, что делает опция -newermt
и как настроить критерии выбора.
Именно этот список записей можно использовать как список ввода с tar,
$ cd /var/log/service
$ find . -newermt 2020-10-22 -a ! -newermt 2020-10-23 > /tmp/filelist
$ tar -T /tmp/filelist -c -j -f /tmp/archive.tar.bz2
Еще лучше, не используя временный файл, который останется,
$ cd /var/log/service
$ find . -newermt 2020-10-22 -a ! -newermt 2020-10-23 | tar -T - -c -j -f /tmp/archive.tar.bz2
Или, что еще лучше, использовать подоболочку, чтобы вообще не изменять текущий рабочий каталог для вызывающая оболочка (тем самым повышая безопасность задания),
$ (cd /var/log/service && find . -newermt 2020-10-22 -a ! -newermt 2020-10-23 | tar -T - -c -j -f /tmp/archive.tar.bz2)
Эта единственная команда теперь создает файл /tmp/archive.tar.bz2
в удаленной системе.
В качестве варианта, для демонстрации: другая команда может использоваться (по-прежнему в интерактивном режиме) для подсчета количества байтов в архиве - без фактического создания архива:
$ (cd /var/log/service && find . -newermt 2020-10-22 -a ! -newermt 2020-10-23 | tar -T - -c -j -f -) | wc -c
Вместо использования -f ...
для создания файла вы используете -f -
вместо этого писать в стандартный вывод; wc -c
затем подсчитывает символы из стандартного ввода.
Объединяя все вместе
Тем не менее, команда
$ ssh centos@Server '(cd /var/log/service && find . -newermt 2020-10-22 -a ! -newermt 2020-10-23 | tar -T - -jcf -)' | tar -C /target/directory -j -x -f -
вызывает наш странный конвейер удаленно, с целью записи bzip2
сжатого tar
архива в соединение s sh в качестве стандартного вывода. На локальной стороне мы используем tar
, чтобы распаковать этот поток / архив из стандартного ввода. (Перед распаковкой вы говорите tar
переместиться в /target/directory
, чтобы не выливать банку грязи в вашу гостиную.)