如何在不发送文件的情况下测试 scp?

如何在不发送文件的情况下测试 scp?

我有一个设置,其中只scp允许连接到远程服务器,并且ssh登录被禁用(即您无法进入该服务器的 shell),并且我正在寻找一种干净的方法来测试连接性无需传输实际文件

原因是服务器配置为在用户主目录中收到新文件时触发某些事件。因此,我希望在运行连接测试时避免触发此类事件。

我会发布我的解决方法作为答案(以防它对其他人有帮助)但我正在寻找我没有想到的更清洁的解决方案。


PS. 这个问题之前在Unix 和 Linux 论坛但尚未得到答复。

答案1

scp据我所知,如果没有远程 shell,旧版本将无法工作*。请阅读“历史记录、SCP 和 SFTP”我的这个答案

由于“您无法进入该服务器”并且您的scp工作仍然正常,因此它可能使用了 SFTP 协议。在服务器端,可以在不授予对 shell 的访问权限的情况下启用 SFTP。我猜是这样的。scp使用 SFTP 而不是 SCP 是现代方式。

如果您scp确实在连接到相关服务器时使用 SFTP,您也可以使用sftp进行连接。使用sftp它可以很容易地传输任何内容:

echo bye | sftp -b - user@server

退出状态 0 表示sftp成功访问服务器然后说再见。


* 除非没有远程端。如果要求从本地复制到本地,则将scp使用cp

答案2

rsync以模式考虑--dry-run

rsync -av --dry-run test.txt [email protected]:

--dry-run, -n 执行试运行,不做任何更改

答案3

OP说:

原因是,该服务器配置为在用户主目录中接收到新文件时触发某些事件,而我不想在测试时触发此类事件。

那么选项是:

  1. 您可以将其复制到其他地方,就在您的主目录之外,例如/tmp(通常具有 777 模式),或者像 OP 自己所做的那样,复制到/dev/null
  2. 您可以从服务器复制文件。有些文件 (几乎) 始终存在于 Unix/Linux 系统上,例如/etc/hostname
  3. 您也可以从服务器复制不存在的文件。显然,您的 SSH 客户端需要成功连接才能确定该文件不存在。客户端生成的错误消息会有所不同(“没有这样的文件或目录”)。
  4. 既然上面说了这么多,即使你的 SSH 禁用了你的登录,你仍然应该能够使用sshssh -v等,并在尝试连接时期待不同的错误消息,并通过解析错误消息来判断连接是否正常。

答案4

TL;DR。复制到/dev/null

由于在此特定用例中,我们试图避免写入用户的主目录,因此一种解决方案是将其用作/dev/null目标文件(因为所有用户都可以写入)并检查文件是否已成功传输。这样,可以在保持目录清洁的同时测试连接性。

scp test.txt [email protected]:/dev/null

输出应该看起来像

test.txt   100%   13   3.6KB/s   00:00

相关内容