我有一个设置,其中只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
答案3
OP说:
原因是,该服务器配置为在用户主目录中接收到新文件时触发某些事件,而我不想在测试时触发此类事件。
那么选项是:
- 您可以将其复制到其他地方,就在您的主目录之外,例如
/tmp
(通常具有 777 模式),或者像 OP 自己所做的那样,复制到/dev/null
。 - 您可以从服务器复制文件。有些文件 (几乎) 始终存在于 Unix/Linux 系统上,例如
/etc/hostname
。 - 您也可以从服务器复制不存在的文件。显然,您的 SSH 客户端需要成功连接才能确定该文件不存在。客户端生成的错误消息会有所不同(“没有这样的文件或目录”)。
- 既然上面说了这么多,即使你的 SSH 禁用了你的登录,你仍然应该能够使用
ssh
或ssh -v
等,并在尝试连接时期待不同的错误消息,并通过解析错误消息来判断连接是否正常。
答案4
TL;DR。复制到/dev/null
由于在此特定用例中,我们试图避免写入用户的主目录,因此一种解决方案是将其用作/dev/null
目标文件(因为所有用户都可以写入)并检查文件是否已成功传输。这样,可以在保持目录清洁的同时测试连接性。
scp test.txt [email protected]:/dev/null
输出应该看起来像
test.txt 100% 13 3.6KB/s 00:00