Для этого вы можете использовать OpenSSL
. Ниже показано с OpenSSL 1.1.1 11 сентября 2018 г. из Ubuntu 18.10.
OpenSSL> help
...
Message Digest commands (see the `dgst' command for more details)
blake2b512 blake2s256 gost md4
md5 rmd160 sha1 sha224
sha256 sha3-224 sha3-256 sha3-384
sha3-512 sha384 sha512 sha512-224
sha512-256 shake128 shake256 sm3
Как видите, он поддерживает sha3-{224,256,384,512}
.
Для проверки контрольной суммы файла
openssl dgst -sha3-512 /bin/echo
SHA3-512(/bin/echo)= c9a3baaa2aa3d667a4ff475d893b3e84eb588fb46adecd0af5f3cdd735be88c62e179f98dc8275955da4ee5ef1dc7968620686c6f7f63f5b80f10e43bc1f00fc
Вы можете проверить сумму строки с помощью
printf "foobar" | openssl dgst -sha3-512
Вы также можете изменить формат вывода
-c
Распечатать дайджест с разделительными двоеточиями -r
Распечатать дайджест в формате coreutils Если вы можете использовать stat
(, который не требуется POSIX )и он достаточно богат параметрами, тогда эта команда:
stat --format=%m /mnt/btrfs-subvol/some/dir
покажет вам, что вы хотите. Примечание dir
может быть любым типом файла , не обязательно каталогом.
Примечания:
В руководстве сказано, что %m
обозначает точку монтирования; это несколько вводит в заблуждение в случае Btrfs. Мои тесты в Kubuntu 18.04.5 LTS показывают, что даже если /mnt/btrfs-subvol/
не является явной точкой монтирования (, т.е. mount whatever /mnt/btrfs-subvol/
никогда не было ), но это подтом (внутри подтома, явно смонтированного как /
или /mnt/
), то команда будет рассматривать его как точку монтирования. Кажется, это то, что вы хотите в любом случае.
Выводом является путь, действительный в структуре каталогов в ОС, а не в каталоге Btrfs (и подтомах )дерева на устройстве (, если вы не уверены, в чем разница, то прочитайте этот вопрос и мой ответ там ). Опять же кажется, что это поведение, что вы хотите.
Команда действительна для файловых систем, отличных от Btrfs (, например. stat --format=%m /dev/null
печатает /dev
в моем Kubuntu ). Очевидно, что другие файловые системы вообще не имеют концепции подтомов. Возможно, вам следует сначала проверить, находится ли файл, который вы ищете, в файловой системе Btrfs:
stat --file-system --format=%T /mnt/btrfs-subvol/some/dir
Если вы видите btrfs
, выполните основную команду, чтобы найти подтом. К сожалению, один вызов stat
не может напечатать обе части информации (, вы можете использовать либо --file-system
, либо без ).
Приведенный выше вывод означает, что вам нужно запустить stat
два раза.Нет никакой гарантии, что они увидят тот же dir
по пути /mnt/btrfs-subvol/some/dir
. Что, если между ними произойдёт (и )монтирование? Сравните TOCTOU . В Linux я могу надежно запустить два stat
в одном файле без TOCTOU, используя дескриптор файла:
( stat --dereference --file-system --format=%T /proc/self/fd/3
stat --dereference --format=%m /proc/self/fd/3 ) 3</mnt/btrfs-subvol/some/dir
Обратите внимание, что если dir
сама по себе является символической ссылкой, команды будут следовать за ней.
Тем не менее, вы, вероятно, захотите узнать подобъем, чтобы потом что-то с ним сделать. Вы все равно получите это как путь. Прежде чем вы его используете, ситуация может измениться, и TOCTOU может ударить вас.
Если вы уверены, что соответствующие пути не изменят своего значения без вашего согласия, просто работайте с stat
и их результатами простым способом.
В моих тестах stat --file-system …
ведет себя как stat --file-system --dereference …
. Это означает, что stat
с и без--file-system
(и без явного--dereference
)могут привести к противоречивым результатам, если целевой файл является символической ссылкой.