Как получить файлы журнала scp на указанную c дату с сервера - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь получить файлы журнала scp (только для указанной даты c) с сервера. Файлы журналов находятся по адресу /var/log/service.

например: ssh centos@Server "ls -lh /var/log/service | grep 'Oct 22'"

Показывает имя файла. Но я хочу посмотреть этот файл

1 Ответ

0 голосов
/ 28 апреля 2020

Короткая история:

$ 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'

Обратите внимание на небольшую разницу: вместо того, чтобы выполнять весь канал удаленно ( Ваша исходная удаленная команда встраивает символ "| в кавычки), теперь у вас есть | без кавычек и две связанные с ним команды

  1. ssh centos@Server "ls -lh /var/log/service". Он выполняет ls удаленно и выводит свой стандартный вывод через соединение s sh.
  2. 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, чтобы не выливать банку грязи в вашу гостиную.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...