基本上,我想记录服务器上通过 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,则可以使用以下三种方法:
调查替代的(换句话说,商业的)SSH/SFTP/SCP 服务器。它们通常应该支持记录文件传输。
scp
将服务器上的实用程序替换为记录所需数据的实用程序。OpenSSH 是开源的。知道如何使用 C 语言为 Unix 编程的人可以下载源代码并进行修改。用“包装器”替换该
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)