我正在尝试从服务器获取日志文件(仅针对特定日期)。日志文件位于/ var / log / service位置。
例如:ssh centos@Server "ls -lh /var/log/service | grep 'Oct 22'"
它显示了文件名。 但我想把那个文件
答案 0 :(得分:0)
短篇小说:
$ 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 -
长话:
继续阅读。
您使用ssh调用远程命令,
$ ssh centos@Server "ls -lh /var/log/service | grep 'Oct 22'"
在远程端centos@Server
,它是连接到您的ssh守护程序的
ssh / login连接执行管道,
$ ls -lh /var/log/service | grep 'Oct 22'
远程ssh仍使用它的标准输出
centos@Server
,通过ssh连接传输并输出
local ,在本地标准输出(您的终端)上。
您可能也这么说
$ ssh centos@Server "ls -lh /var/log/service" | grep 'Oct 22'
注意细微的差别:而不是执行整个管道
远程(您的原始远程命令将管道字符|
嵌入其中
引号),现在您已将|
取消了引号,并通过它连接了两个命令,
ssh centos@Server "ls -lh /var/log/service"
。这将执行ls
远程,并通过ssh连接提供其标准输出。grep 'Oct 22'
在本地运行,并像以前一样过滤ssh命令的输出。仅在本地。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
存档压缩到ssh连接中
输出。在本地方面,我们使用tar
解包该流/归档
从标准输入。 (在打开包装之前,您告诉tar
自行移动
进入/target/directory
,不要将一罐污垢倒入您的生活
房间。)