将 Linux stat(1) 命令转换为 BSD stat(1) 命令

将 Linux stat(1) 命令转换为 BSD stat(1) 命令

背景

克利翁的远程项目功能目前不支持 FreeBSD 作为远程主机操作系统,但我想做一些黑客攻击,看看它是否有效。通过阅读日志文件,我想我已经发现了(其中一个)问题。

2019-04-10 00:13:55,850 [2221079]  DEBUG -         #com.jetbrains.ssh.nio - UnixSshFS:: SshCommandRunner.execute: test -e "/tmp" 
2019-04-10 00:13:55,851 [2221080]  DEBUG - ellij.ssh.SshConnectionService - Executing SSH command: env "LC_ALL"="C" "JETBRAINS_REMOTE_RUN"="1" test -e "/tmp" within SSH session @3aa57c95 to <user>@<host>::22 
2019-04-10 00:13:55,963 [2221192]  DEBUG -         #com.jetbrains.ssh.nio - UnixSshFS:: SshCommandRunner.execute: stat --printf "%W%i%F%F%F%F%X%Y%s" "/" 
2019-04-10 00:13:55,963 [2221192]  DEBUG - ellij.ssh.SshConnectionService - Executing SSH command: env "LC_ALL"="C" "JETBRAINS_REMOTE_RUN"="1" stat --printf "%W%i%F%F%F%F%X%Y%s" "/" within SSH session @3aa57c95 to <user>@<host>:22 
2019-04-10 00:13:56,071 [2221300]   INFO -         #com.jetbrains.ssh.nio - 
Exit code 1 

基本上,stat(1)行为不同Linux等等自由BSD,因此以下命令在 FreeBSD-12.0 上失败,从而停止整个设置过程:

$ stat --printf "%W%i%F%F%F%F%X%Y%s" "/"
stat: illegal option -- -
usage: stat [-FLnq] [-f format | -l | -r | -s | -x] [-t timefmt] [file|handle ...]

我以为gstat中的实用程序coreutils是 GNU 版本的stat,但结果证明我错了;它们是两个不同的命令。我也尝试过自己翻译,但最终得到了一些奇怪的结果:

$ stat -f "%B%i%T%T%T%T%a%Y%z" "/"
15006030802////15041781781024

问题

是否可以重写stat --printf "%W%i%F%F%F%F%X%Y%s" "/"FreeBSD 的命令,使其工作方式与 GNU/Linux 上的对应命令相同?

答案1

stat -f 0%i%HT%HT%HT%HT%a%m%z /

在 FreeBSD 上应该非常类似于

stat --printf %W%i%F%F%F%F%X%Y%s /

在 Linux 上,除了%HT将扩展为Directory而不是directory%F在 Linux 上一样。

我只是插入了一个0而不是%W(出生时间),因为在大多数 Linux 系统上都是0(未知)。如果您确实想要出生时间,请将 替换0为。%B

不过这种格式很奇怪,我不明白它的目的;我想它可以替换为基于文件元数据的任何“独特”垃圾;-)


我以为 coreutils 中的 gstat 实用程序是 stat 的 GNU 版本,但事实证明我错了;它们是两个不同的命令。

gstat在 FreeBSD 上是另一个程序 ( /usr/sbin/gstat, gstat(8))。您正在寻找gnustat

gnustat --printf %W%i%F%F%F%F%X%Y%s /

就像任何其他包一样,pkg info -l coreutils | grep stat它会告诉您该包安装的文件coreutils

相关内容