首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可疑密码管理

可疑密码管理
EN

Code Review用户
提问于 2020-06-30 11:05:33
回答 1查看 301关注 0票数 5

问题

说到保安,我喜欢戴锡箔帽。因此,我使用离线密码管理器Keepass。Keepass允许您通过密码、密钥文件和Windows用户帐户使用多因素身份验证。我只启用了其中的两个,密码和密钥文件。因为我有两台需要访问密钥文件的计算机,所以我把它存储在一个USB卡上。

在Windows上一切都很好,我插入USB,打开数据库,从托盘中弹出USB,删除USB,我可以使用我需要的密码。这总共需要两秒钟。

溶液

然而,在Linux上,这感觉就像一个完整的歌舞。由与以下内容类似的内容组成:

USB lsblk sudo挂载/dev/usb 1//to/文件夹keypass & sudo /dev/USB 1 udisksctl电源关闭-b /dev/USB lsblk #删除USB

虽然这在理论上与Windows没有太大的不同,但它只是一个附加的挂载和卸载。为了获得密码,必须检查lsblk并输入所有这些都是不方便的。所以我决定把它写下来,它只是~6个命令,它能有多难?

鱼液

我是的初学者,以前没有使用过函数或列表。我唯一做过的事情就是更新我的道路。我是个菜鸟,所以我试着把return ("" "")还给我的名单.然而,我有一些经验,在其他,非壳,语言,并认为我已经学会了它。

  • pdev -从UUID中查找分区的UUID、pkname、块路径和挂载点。如果找不到具有匹配UUID的设备,那么它将不断通知用户并尝试重新获取数据。
  • pmount -这需要四个分区的位置参数;UUID、目标挂载点、块路径、当前挂载点。
    • 如果分区有当前挂载点,如果这不是目标挂载点,它将失败。
    • 否则,如果块路径是一个值,那么它将将分区挂载到目标路径。
    • 最后,如果这两件事都不是真的,那就一事无成了。

  • umount_all -这是一个pkname,并卸载驱动器的所有分区。虽然驱动器不太可能有多个分区,但更不可能安装它们。我宁愿错误地站在谨慎的一边。
  • load_passwords --这实际上是“主”函数。它需要一个UUID和一个目标路径。从这里开始:
    1. pdev获取挂载信息。
    2. 找到驱动器的路径。(这将是/dev/usb而不是/dev/usb1),它使用lsblk,因为简单地切断最后一个数字在某些存储设备上是行不通的。(即nvme0n1p1)
    3. 显示分区的信息、块路径、突出显示驱动器的路径和当前挂载点。
    4. 尝试使用pmount挂载驱动器。
    5. 打开键盘。
    6. 询问用户是否希望弹出驱动器。
    7. 如果用户不希望弹出驱动器,则成功退出。
    8. umount_all卸载驱动器上的所有分区。
    9. 关掉硬盘。
    10. 确认设备已成功关机。

  • passwords -传递我使用的UUID和挂载点的方便函数。
代码语言:javascript
复制
function pdev
    while true
        set mounts (lsblk -l -o UUID,PKNAME,PATH,MOUNTPOINT | grep "^$argv[1] " | grep -Po "[^ ]+")
        if set -q mounts[1]
            break
        end
        read -P "Insert key drive "
    end
    for mount in $mounts
        echo $mount
    end
end

function pmount
    if set -q argv[4]
        if test $argv[4] != $argv[2]
            echo "Mounted to wrong directory"
            return 1
        end
    else if set -q argv[3]
        sudo mount UUID=$argv[1] $argv[2]
    end
end

function umount_all
    set blocks (lsblk -l -o PKNAME,PATH,MOUNTPOINT | grep "^$argv[1] ")
    for block_ in $blocks
        set block (echo "$block_" | grep -Po "/[^ ]+")
        if set -q block[2]
            sudo umount "$block[1]"
        end
    end
end

function load_passwords
    set mounts (pdev $argv[1])
    if test $status != 0
        return 1
    end
    set drive (lsblk -o NAME,PATH | grep "^$mounts[2] " | grep -Po "/[^ ]+")
    echo "PATH : $mounts[3]" | grep "$drive"
    echo "MOUNT: $mounts[4]"
    pmount $argv[1] $argv[2] $mounts[3] $mounts[4]
    if test $status != 0
        return 1
    end
    keepass &
    read -P "Eject drive? [Y/n] " -l input
    echo "$input" | grep -Poi "(^)|(^y)" >> /dev/null
    if test $status = 1
        return
    end
    umount_all "$mounts[2]"
    udisksctl power-off -b $drive
    lsblk -o UUID | grep "^$argv[1]#qcStackCode#" >> /dev/null
    if test $status = 1
        return
    end
    echo "Failed to power off drive"
    return 1
end

function passwords
    load_passwords {redacted} /path/to/mountpoint
end

关注

  • 如果不喜欢使用for循环来回显列表中的每个值,以“返回”列表。有更干净的方法吗?安装在$mounts回波$mount端
  • 我不喜欢像$argv[1]这样的名字,而不是$uuid,因为它们会使代码更难理解。是否有明确的方法来指定这些?
  • 这段代码很难读,这就是为什么我在这里写了这么详尽的描述。我可以看到自己忘记了所有这些细微之处,一年后又回到这个问题上去了,是哪个白痴写的?!
  • 我不喜欢所有的功能都是公开的,pmount应该是私有的。
  • 当我能够访问sudo时,我不喜欢使用/path/to/mountpoint。需要输入两个密码才能得到一个有一定讽刺意味的.
  • 我觉得代码有点乱七八糟,不太好。

我也很高兴对我的代码进行任何其他评论。

EN

回答 1

Code Review用户

回答已采纳

发布于 2020-06-30 13:50:38

如果不喜欢使用for循环来回显列表中的每个值,以“返回”列表。有更干净的方法吗?

printf命令将重用格式字符串以使用所有输入:

代码语言:javascript
复制
printf "%s\n" $mounts

我不喜欢像$argv这样的名字,而不是$uuid,因为它们会使代码更难理解。是否有明确的方法来指定这些?

使用-a可供选择function

代码语言:javascript
复制
function load_passwords -a uuid -a mountpath
    set mounts (pdev $uuid)
    ...

这段代码很难读,这就是为什么我在这里写了这么详尽的描述。我可以看到自己忘记了所有这些细微之处,一年后又回到这个问题上去了,是哪个白痴写的?!

抱歉,我忍不住了。在我看来是合理的。如果您担心忘记细微差别,请添加一些注释,包括这个问题的URL。

我不喜欢所有的功能都是公开的,可能应该是私人的。

为什么?里面没有敏感信息。

实现隐私的唯一方法是对源文件进行chmod,这样其他用户就无法读取它们。

当我访问/path/ to /挂载点时,我不喜欢需要sudo。需要输入两个密码才能得到一个有一定讽刺意味的.

假设您有这样做的权限,您可以使用visudo,这样您的用户就不需要为sudo mountsudo umount输入密码了。

我觉得代码有点乱七八糟,不太好。

这就是shell脚本的本质。至少,fish的语法比bash更简洁(也许更详细)。

我是一个Lastpass用户,并且做了类似的努力,通过lpass命令行工具访问密码。

票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/244777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档