【问题标题】:Latest version of libssh2 and libssl2 using bash command?使用 bash 命令的最新版本的 libssh2 和 libssl2?
【发布时间】:2022-06-14 16:55:57
【问题描述】:

我正在尝试使用我自己的 bash 脚本来参考 https://github.com/Frugghi/iSSH2 来为苹果平台生成 libssl 和 libssh 库。我想尝试自己的 bash 脚本的原因是获取最近的库并保持更新。

我有两个 bash 脚本来检测最新版本的 openssl 和 libssh2 库:

    getLibssh2Version () {
  if type git >/dev/null 2>&1; then
    LIBSSH_VERSION=`git ls-remote --tags https://github.com/libssh2/libssh2.git | egrep "libssh2-[0-9]+(\.[0-9])*[a-zA-Z]?$" | cut -f 2 -d - | sort -t . -r | head -n 1`
    LIBSSH_AUTO=true
}

    getOpensslVersion () {
  if type git >/dev/null 2>&1; then
    LIBSSL_VERSION=`git ls-remote --tags git://git.openssl.org/openssl.git | egrep "OpenSSL(_[0-9])+[a-zA-Z]?$" | cut -f 2,3,4 -d _ | sort -t _ -r | head -n 1 | tr _ .`
    LIBSSL_AUTO=true

}

但是第一个脚本获取的是 1.9.0 版本的 Libssh2 而不是 1.10.0,第二个脚本获取的是 1.1.1n 系列的 OpenSSL 而不是 3.0.2。我想这与定义的正则表达式有关。有人能解决这个脚本错误吗?

【问题讨论】:

    标签: grep


    【解决方案1】:

    在你的第一个 sn-p 中:

    • 您正在使用(\.[0-9])* 过滤egrep 中的1.10.0 版本,(\.[0-9]+)*
    • 对于这些子版本的数字排序,sort 需要更多选项:-t. -k 1,1n -k 2,2n
    • 我已切换为不进行反向排序,而是使用tail 而不是head,因为反向排序在某种程度上不适用于其他选项(至少在我的机器上)。

    解决方案:

    git ls-remote --tags https://github.com/libssh2/libssh2.git | \
         egrep "libssh2-[0-9]+(\.[0-9]+)*[a-zA-Z]?$" | \
         cut -f 2 -d - | sort -t. -k 1,1n -k 2,2n | tail -n 1
    

    输出:

    1.10.0
    

    在第二个sn-p中:

    • 命名和标点符号从 1.x 版本更改为 3.x 版本,因此它们被 egrep 过滤掉了。而不是egrep "OpenSSL(_[0-9])+[a-zA-Z]?$",我会天真地使用egrep -i "OpenSSL([_.-][0-9])+[a-zA-Z]?$"
    • 因此,带有cut 的版本“提取”对于较新的版本会失败。我自然而然地选择使用sed 's/.*openssl.//i' 来做同样的事情。
    • 我再次从使用head 切换到tail
    • 注意 sorting 遇到与第一个 sn-p 相同的问题,即当这些子版本开始滚动时,例如从3.9...3.10...,您需要添加与上述相同的选项。

    解决方案:

    git ls-remote --tags git://git.openssl.org/openssl.git | \
        egrep -i "OpenSSL([_.-][0-9])+[a-zA-Z]?$" | \
        sed 's/.*openssl.//i' | sort -t _ | tail -n 1 | tr _ .
    

    输出:

    3.0.2
    

    【讨论】:

    • 非常感谢...您能解释一下为什么在“OpenSSL([.-][0-9])+[a] 中添加 [.-] -zA-Z]?$"
    • @user16780334 很高兴能帮上忙。这是因为([_.-][0-9])+ 用于匹配修订号和子修订号,包括分隔符。如果您查看变化,分隔符可以是_-.。由于-在字符类中有特殊含义,所以需要放在最后。
    • 再次感谢..您的评论使我在正则表达式中提供更多信息。如果您不介意,我能问一下像这样的简单更改是如何从 1.x 版本更改为 3.x 版本的吗?还有 -i 在 egrep 之后是什么意思?
    • @user16780334 好吧,变化可能很小,但结果却发生了很大变化。在这种情况下,原始的 egrep 正则表达式只是过滤掉了 3.x 版本,因此它们不会出现。 -i 表示 egrep 应该不区分大小写,因为 OpenSSL_1...openssl-3...。对于此类常见的实用程序,您始终可以使用man 来查找命令,即在这种情况下为man egrep
    【解决方案2】:

    您需要执行 grep-oP 选项的 Perl 样式正则表达式匹配。

    获取libssh2 最新版本。

    git ls-remote --tags https://github.com/libssh2/libssh2.git | grep -oP "libssh2-([\d.]*)" | tail -1 | grep -oP "(?<=-).*"
    

    获取openssl 最新版本。

    git ls-remote --tags git://git.openssl.org/openssl.git | grep -oP "openssl-([\d.]*)" | tail -1 | grep -oP "(?<=-).*"
    

    【讨论】:

      猜你喜欢
      • 2018-09-20
      • 1970-01-01
      • 2016-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      相关资源
      最近更新 更多