说到保安,我喜欢戴锡箔帽。因此,我使用离线密码管理器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和一个目标路径。从这里开始:pdev获取挂载信息。/dev/usb而不是/dev/usb1),它使用lsblk,因为简单地切断最后一个数字在某些存储设备上是行不通的。(即nvme0n1p1)pmount挂载驱动器。umount_all卸载驱动器上的所有分区。passwords -传递我使用的UUID和挂载点的方便函数。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$argv[1]这样的名字,而不是$uuid,因为它们会使代码更难理解。是否有明确的方法来指定这些?pmount应该是私有的。sudo时,我不喜欢使用/path/to/mountpoint。需要输入两个密码才能得到一个有一定讽刺意味的.我也很高兴对我的代码进行任何其他评论。
发布于 2020-06-30 13:50:38
如果不喜欢使用for循环来回显列表中的每个值,以“返回”列表。有更干净的方法吗?
printf命令将重用格式字符串以使用所有输入:
printf "%s\n" $mounts我不喜欢像$argv这样的名字,而不是$uuid,因为它们会使代码更难理解。是否有明确的方法来指定这些?
function load_passwords -a uuid -a mountpath
set mounts (pdev $uuid)
...这段代码很难读,这就是为什么我在这里写了这么详尽的描述。我可以看到自己忘记了所有这些细微之处,一年后又回到这个问题上去了,是哪个白痴写的?!
抱歉,我忍不住了。在我看来是合理的。如果您担心忘记细微差别,请添加一些注释,包括这个问题的URL。
我不喜欢所有的功能都是公开的,可能应该是私人的。
为什么?里面没有敏感信息。
实现隐私的唯一方法是对源文件进行chmod,这样其他用户就无法读取它们。
当我访问/path/ to /挂载点时,我不喜欢需要sudo。需要输入两个密码才能得到一个有一定讽刺意味的.
假设您有这样做的权限,您可以使用visudo,这样您的用户就不需要为sudo mount和sudo umount输入密码了。
我觉得代码有点乱七八糟,不太好。
这就是shell脚本的本质。至少,fish的语法比bash更简洁(也许更详细)。
我是一个Lastpass用户,并且做了类似的努力,通过lpass命令行工具访问密码。
https://codereview.stackexchange.com/questions/244777
复制相似问题