如何获取远程服务器上的 scp 日志

如何获取远程服务器上的 scp 日志

基本上,我想记录服务器上通过 SCP 发送或接收的每个文件。

假设用户从服务器 1 向服务器 2 执行 SCP。我找到了在发送方获取日志的方法,但是接收方如何获取已经传输的内容呢?

我希望接收方的日志包含通过 SCP 传输给它的文件的名称。

另外,为了在发送方获取日志,我使用我的 bash 脚本,该脚本首先将文件名保存到日志文件,然后使用 SCP 进行传输。有没有更好的方法可以做到这一点。

提前感谢任何建议。

答案1

我刚刚发现了一个其他人可能会感兴趣的有趣解决方案:

使用scp它时实际上也会使用标志调用服务器上的二进制文件-f。这意味着可以为服务器端编写一个简单的包装器scp,如下所示:

首先更改原来的scp名称:

mv /usr/bin/scp /usr/bin/scp-org

然后以其名称创建一个简单的脚本:

sudo nano /usr/bin/scp

内容如下:

#/bin/bash

scp-org $@ | tee >(grep -aEo "[CD][0-7]{4} [0-9]* .*$" --line-buffered >> /var/log/scp.log)

当然,这可以改进,但作为示例,它很有用。现在,您可以使用tail -f /var/log/scp.log并实时查看正在传输的所有文件

答案2

您可以尝试用执行scp您需要的修改版本替换服务器上的命令。scp是一个非常简单的程序,向其中添加一些日志代码不应该是一项艰巨的任务。

答案3

您可能正在使用 OpenSSH 软件包。OpenSSHscp实用程序不记录任何内容。它支持底层 SSH 会话的调试输出,但不会记录正在进行的实际文件传输。

类似地,可以将 OpenSSH 服务器设置为记录其正在执行的操作的详细信息,也可以将其设置为记录用户连接和运行的事实scp,但它不会记录正在进行的实际文件传输。

如果您无法让这些用户改用 SFTP,则可以使用以下三种方法:

  1. 调查替代的(换句话说,商业的)SSH/SFTP/SCP 服务器。它们通常应该支持记录文件传输。

  2. scp将服务器上的实用程序替换为记录所需数据的实用程序。OpenSSH 是开源的。知道如何使用 C 语言为 Unix 编程的人可以下载源代码并进行修改。

  3. 用“包装器”替换该scp实用程序,该包装器启动原始 scp 程序并监视其操作。Unix 有调试工具可以监视另一个进程正在做什么。

我需要记录scp一次传输,因此我使用了第三种方法。我编写了一个 Perl 脚本,在斯特拉斯。strace 将输出 scp 进程打开和关闭的文件的名称。Perl 脚本解析 strace 输出并找出正在传输的文件。

答案4

我认为建议在服务器上对二进制文件进行包装的解决方案scp不适用于最近的scp客户端。

Since OpenSSH 8.8 (8.7 in Red Hat/Fedora builds), scp has use the SFTP protocol for transfers by default.

对于此类较新的客户端,只有客户端使用标志调用(以强制执行旧协议)时,这种scp在服务器上包装的机制才会起作用。scp-O

对于这样的需求,也许使用rsync而不是scp可以帮助?rsync似乎具有记录文件访问的能力:来自rsyncd.conf手册页:

log format
This parameter allows you to specify the format used for logging file transfers when transfer logging is enabled.
[..]
%f the filename (long form on sender; no trailing lq/rq)

相关内容