動機

keepass2真的有點慢,所以換回去keepassxc,同時找一個辦法避免每次開機都要打master key 所以我把dropbox給裝上去了

windows

存master key

  1. 先到認證館管理員加master key,雖然說是明碼,但總比直接寫在script上好
  1. CredentialManager
  • Install-Module -Name CredentialManager -Scope CurrentUser
  1. 在powershell就可以用下面的script拿密碼
  • (Get-StoredCredential -Target keepassxc).GetNetworkCredential().password | keepassxc.exe --pw-stdin --keyfile $keyfile_path $dbfile_path --localconfig $localconf_path --config $conf_path

開機時執行

在startup中放跑指令的捷徑,這捷徑不能用New-Item去生,Value的檢查不會過

$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut("$home\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\mykeepassxc.lnk")
$Shortcut.TargetPath = "C:\Windows\System32\cmd.exe"
$Shortcut.Arguments = "/c start /min `"`" powershell -WindowStyle Hidden -Command `"$home\MyKeepassXC\StartCustomKeepass.ps1`""
$Shortcut.IconLocation = "C:\Program Files\KeePassXC\KeePassXC.exe"
$Shortcut.save()

ScheduledJob (keepassxc會跑在背景,會看不到)

  1. 用管理者權限開powershell
  2. 用下面的script就能在開機時跑指定的腳本
$trigger = New-JobTrigger -AtStartup
Register-ScheduledJob -Trigger $trigger -FilePath $home\MyKeepassXC\StartCustomKeepass.ps1 -Name StartCustomKeepass

這裡是把local的config與dropbox的連在一起,只要改了設定就能同步到其他台

function Set-ConfAsHardLink {
    param (
        [string]$HostPath,
        [string]$CloudPath
    )
    if(!(Test-Path -Path $HostPath)) {
        New-Item -ItemType HardLink -Path $HostPath -Value $CloudPath
    } elseif(!(Get-ItemProperty $HostPath).LinkType -eq "HardLink") {
        Remove-Item $HostPath
        New-Item -ItemType HardLink -Path $HostPath -Value $CloudPath
    }
}

Set-ConfAsHardLink -HostPath "$home\AppData\Local\KeePassXC\keepassxc.ini" -CloudPath $localconf_path
Set-ConfAsHardLink -HostPath "$home\AppData\Roaming\KeePassXC\keepassxc.ini" -CloudPath $conf_path

powershell試用感想

把指令存成string

整體操作起來很像物件,但是還是有不順手的地方,像keepassxc.exe因為沒有加到PATH所以要放絕對路徑

但是,直接用環境變數湊出來的路徑會有space!! 不會自己跳掉,所以沒辦法直接放到變數這個時候要用Invoke-expression

然而,Invoke-expression前面接pipe,跑出來個結果不對,但是把pipe包到整個Invoke-expression又很長 所以就變成不存變數直接展開了,原本以為所有指令都可以當成一級函數亂丟,結果不行

sudo

powershell沒有sudo,有人寫,但要裝 可以用runas,但是會彈出另一個視窗,不適合script去跑

對一個bash用習慣的人來說真的不習慣

物件

指令跑完可以像物件一樣存取,函數也是用named args,十分人性化,這點一定要給好評 還有居然可以在script看到type!! 這真的太贊了

linux(ubuntu)

存master key

  1. 用keyring

開機時執行

  1. 加下面的內容到.config/autostart/StartCustomKeepass.sh.desktop,沒有folder自己建
[Desktop Entry]
Type=Application
Exec=$HOME/MyKeepassXC/StartCustomKeepass.sh
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[en_US]=keepassxc
Name=keepassxc
Comment[en_US]=
Comment=

難搞的systemd

systemd可以管理proc的生存狀態,但是我真的用不起來,一個是所有指令要用絕對路徑 另一個最重要的是,我的keyring或是secret-tool在systemd中都拿不到密碼,這應該與keyring的實現機制有關,之後再看看

linux沒有指令可以區分hardlink與一般file,只能用inode的編號

Set_ConfAsHardLink() {
    hostPath=$1
    cloudPath=$2
    if [ ! -f $hostPath ];
    then
	    ln $cloudPath $hostPath
    else
	hostInode=$(ls -i $hostPath | awk '{print $1 }')
	cloudInode=$(ls -i $cloudPath | awk '{print $1 }')

	if [ $hostInode -eq $cloudInode ];
	then
	    rm $hostPath
	    ln $cloudPath $hostPath
	fi
    fi
}

Set_ConfAsHardLink $host_localconf_path $localconf_path
Set_ConfAsHardLink "$HOME/.config/keepassxc/keepassxc.ini" $conf_path

KeeShare

這個功能就是我想跳回來的其中一個理由

KeeShare就像分割db,可以選某個folder給別人看或改

使用步驟

  1. 先開keepassxc的keeshare讓他可以讀與寫keeshare的檔案 (只要設定一次)
  2. 到需要分出去的folder點編輯群組
  3. 到keeshare,選匯出(只寫出去)或同步(寫出去也接收其他的新增),存keeshare的檔案
  4. 開一個新的db檔,創一個folder
  5. 到keeshare,選匯入(只收來自source的更改)或同步(寫出去也接收其他的新增)
  6. 如果選同步可以在新的db寫一個entry,去存,之後到原本的db去看,會看到新的entry

Ref

Automatic Database Opening Database Sharing with KeeShare

How to store and read user credentials from Windows Credentials manager