Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Проблема с KeePassXC и базой на облачном диске Google Drive  (Прочитано 349 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн alixey

  • Автор темы
  • Любитель
  • *
  • Сообщений: 54
    • Просмотр профиля
Столкнулся с такой проблемой.
Есть Ununtu 20, со штатным рабочим столом (который называется Ubuntu, но является GNOME).
Через панель управления подключил онлайн-аккаунт Google Drive. Успешно с ним работаю - например могу открыть xls-файл, отредактировать и сохранить обратно.
Но с KeePassXC проблема - когда я открываю базу, она открывается в режиме read-only, и я не могу сохранять изменения.
Если в KeePassXC попробовать сохранить базу под новым именем (команда "Сохранить как"), то либо выдает ошибку сохранения, либо крашится gvfs.
Вот здесь описан очень похожий случай: https://www.linux.org.ru/forum/desktop/13633586
А тут описан похожий баг KeePassXC с SMB, который приводит к открытию базы в режиме "только чтение": https://github.com/keepassxreboot/keepassxc/issues/803

Оффлайн alixey

  • Автор темы
  • Любитель
  • *
  • Сообщений: 54
    • Просмотр профиля
Сделал такой скрипт синхронизации:
#!/bin/sh

OPT="-q --auto-confirm"
CMD="/usr/bin/rclone"
FILE=passwords.kdbx
RPATH=gd:
LPATH=~/Clouds/keepass

META=`$CMD lsjson ${RPATH}${FILE} 2> /dev/null`
RC=$?
if [ $RC != 0 ]; then
echo "Remote file error!"
exit 1
fi

RTIME=`echo $META | jq -r '.[0].ModTime'`
RTIME=`date --date="$RTIME" +"%s"`

mkdir -p $LPATH
LTIME=0
if [ -s $LPATH/$FILE ]; then
LTIME=`date -r $LPATH/$FILE +"%s"`
fi

echo "File: $FILE"
echo "- remote: $RTIME (`date --date="@$RTIME" --rfc-3339=seconds`)"
ARG=
if [ $LTIME -eq 0 ]; then
echo "- locale: not exists"
echo "SYNC: REMOTE -> LOCAL"
ARG=R
else
echo "- locale: $LTIME (`date --date="@$LTIME" --rfc-3339=seconds`)"
if   [ $LTIME -eq $RTIME ]; then
DIFF=0
elif [ $LTIME -gt $RTIME ]; then
DIFF=`expr $LTIME - $RTIME`
elif [ $LTIME -lt $RTIME ]; then
DIFF=`expr $RTIME - $LTIME`
else
DIFF=0
fi
if [ $DIFF -eq 0 ]; then
echo "SYNC: SKIPPED"
else
echo "- diff: $DIFF"
if [ $LTIME -gt $RTIME ]; then
echo "SYNC: LOCAL -> REMOTE"
ARG=L
else
echo "SYNC: REMOTE -> LOCAL"
ARG=R
fi
fi
fi
if [ -z $ARG ]; then
exit
fi

if [ "$ARG" = "L" ]; then
$CMD $OPT copy "${LPATH}/${FILE}" "${RPATH}"
else
$CMD $OPT copy "${RPATH}${FILE}" "${LPATH}"
fi

При автономное запуске работает.
Но я бы хотел автоматически выгружать базу в облако при ее локальном изменении.
Как я понял, мне нужно привязать этот скрипт к inotify. Не покажите на примере, как это сделать?

Оффлайн soarin

  • Старожил
  • *
  • Сообщений: 1850
  • ubuntu 20.04
    • Просмотр профиля
Ну там в похожем баге написано, что починено 15 мая 2020 года.
То есть в дефолтном KeepassXC не будет.
Может на свежей версии с сайта нормально заработает.

Оффлайн alixey

  • Автор темы
  • Любитель
  • *
  • Сообщений: 54
    • Просмотр профиля
Понятно. Придется ждать, пока в репозитории обновят.

Сделал такой скрипт:
#!/bin/sh

CLOUD="gd:"
LOCAL="$HOME/Clouds/keepass"
FILE="password.kdbx"
FILE_TIMESTAMP=

RCLONE="/usr/bin/rclone"
RCLONE_OPTS="-q --auto-confirm"

KEEPASS="/usr/bin/keepassxc"
KEEPASS_OPTS=""

# Проверка и подготовка
proc_prepare ()
{
if [ ! -f "${LOCAL}/${FILE}" ]; then
echo "* Database not exists, download from cloud store..."
proc_download
fi
}

# Запуск KeePassXC
proc_start ()
{
echo "* Start KeePassXC..."
FILE_TIMESTAMP=`date -r "${LOCAL}/${FILE}" +'%s'`
echo "* Database timestamp: $FILE_TIMESTAMP"
$KEEPASS $KEEPASS_OPTS "${LOCAL}/${FILE}"
NEW_TIMESTAMP=`date -r "${LOCAL}/${FILE}" +'%s'`
if [ $FILE_TIMESTAMP -ne $NEW_TIMESTAMP ]; then
echo "* Database changed, update cloud"
proc_upload
fi
}

# Автоматическая синхронизация файла данных
proc_autosync ()
{

echo "* Check cloud timestamp..."
CLOUD_TS=`$CMD lsjson ${RPATH}${FILE} 2> /dev/null`
RC=$?
if [ $RC != 0 ]; then
echo "! Remote access error!"
exit 1
fi
CLOUD_TS=`echo $CLOUD_TS | jq -r '.[0].ModTime'`
CLOUD_TS=`date --date="$CLOUD_TS" +'%s'`
echo "* Cloud timestamp: $CLOUD_TS (`date --date="@$CLOUD_TS" --rfc-3339=seconds`)"

echo "* Check local timestamp..."
if [ ! -d "${LOCAL}" ]; then
mkdir -p "${LOCAL}"
fi
mkdir -p $LPATH
if [ -f "${LOCAL}/${FILE}" ]; then
LOCAL_TS=`date -r "${LOCAL}/${FILE}" +'%s'`
echo "* Local timestamp: $LOCAL_TS (`date --date="@$LOCAL_TS" --rfc-3339=seconds`)"
else
LOCAL_TS=0
echo "* Local timestamp: none"
fi

echo "* Compare databases..."
if   [ $LOCAL_TS -eq $CLOUD_TS ]; then
RCLONE_SRC=
elif [ $LOCAL_TS -gt $CLOUD_TS ]; then
RCLONE_SRC=LOCAL
elif [ $LOCAL_TS -lt $CLOUD_TS ]; then
RCLONE_SRC=CLOUD
else
RCLONE_SRC=ERROR
fi
if [ -n "$RCLONE_SRC" ]; then
if   [ "ERROR" = "$RCLONE_SRC" ]; then
echo "! Comparsion fail"
RC=-1
elif [ "CLOUD" = "$RCLONE_SRC" ]; then
echo "* SYNC: CLOUD -> LOCAL"
$RCLONE $RCLONE_OPTS copy "${CLOUD}${FILE}" "${LOCAL}"
RC=$?
elif [ "LOCAL" = "$RCLONE_SRC" ]; then
echo "* SYNC: LOCAL -> CLOUD"
$RCLONE $RCLONE_OPTS copy "${LOCAL}${FILE}" "${CLOUD}"
RC=$?
else
RC=0
fi
fi

}

# Загрузка файла данных из облака в локальное хранилище
proc_download ()
{
if [ ! -d "${LOCAL}" ]; then
echo "* Create local store"
mkdir -p "${LOCAL}"
fi
$RCLONE $RCLONE_OPTS copy "${CLOUD}${FILE}" "${LOCAL}"
}

# Загрузка файла данных из локального хранилища в облако
proc_upload ()
{
if [ ! -d "${LOCAL}" ]; then
echo "! Local store not exists, fail"
exit 1
fi
if [ ! -f "${LOCAL}/${FILE}" ]; then
echo "! Local database not exists, fail"
exit 1
fi
$RCLONE $RCLONE_OPTS copy "${LOCAL}/${FILE}" "${CLOUD}"
}

proc_prepare
proc_start
Просьба просмотреть, все ли с ним нормально.

Пользователь добавил сообщение 01 Декабрь 2020, 17:05:45:
И еще пара вопросов, если не сложно.

Как мне мой скрипт вынести на рабочий стол или панель быстрого запуска?
Я создавал новый значок (через команду Create Launcher), прописывал в качестве строки запуска "sh ~/scripts/keepass.sh" (а также со всеми возможными вариациями путей) никакой реакции, значок не становился запускаемым.
А если я запускаю скрипт вручную, то все работает, но все то время, пока KeePassXC запущен, на экране также висит консольное окно скрипта. Можно ли его скрыть?

У меня установлена версия 2.4.3. На сайте последняя версия 2.6.2.
Как мне установить последнюю версию?
Здесь: https://packages.ubuntu.com/source/keepassxc
есть версия 2.6.2 для пакета hirsuite - как его можно выбрать?
« Последнее редактирование: 01 Декабрь 2020, 17:05:45 от alixey »

Оффлайн Usermaster

  • Старожил
  • *
  • Сообщений: 1158
    • Просмотр профиля
Здесь
https://keepassxc.org/download/
есть appimage версия 2.6.2, работает без установки.

Оффлайн alixey

  • Автор темы
  • Любитель
  • *
  • Сообщений: 54
    • Просмотр профиля
Не подскажите, как ее установить?
Просто скачать, поставить атрибут "исполняемый" и запускать ?

Оффлайн Usermaster

  • Старожил
  • *
  • Сообщений: 1158
    • Просмотр профиля
Именно так.
Портативная версия, представляет из себя исволняемый файл в виде образа внутри со всеми зависимостями для запуска.
« Последнее редактирование: 01 Декабрь 2020, 21:43:42 от Usermaster »

Оффлайн F12

  • Старожил
  • *
  • Сообщений: 2634
    • Просмотр профиля
Придется ждать, пока в репозитории обновят.
- боюсь долго ждать придется :)
- в оф. репах 18.04.5 LTS так и не обновили, до сих пор 2.3.1, в репах 20.04.1 LTS - 2.4.3, вот не знаю что там в 20.10... но думаю, тоже не самая свежая, в лучшем случае какая ни будь из тех, что была актуальна за месяц-другой до выхода этого релиза ::)

Пользователь добавил сообщение 02 Декабрь 2020, 09:54:31:
вот не знаю что там в 20.10...
- о, уже знаю, 2.6.1, информация с https://packages.ubuntu.com/source/keepassxc
« Последнее редактирование: 02 Декабрь 2020, 09:54:31 от F12 »

Оффлайн alixey

  • Автор темы
  • Любитель
  • *
  • Сообщений: 54
    • Просмотр профиля
В версии 2.6.2 (использую исполняемый образ) проблема решена, работает непосредственно с облачного диска.
Пока так и оставлю, скрипт синхронизации получается ненужным.

Пользователь добавил сообщение 02 Декабрь 2020, 11:19:34:
Поправка, в 2.6.2 все еще хуже, намного.
Подключаю (через Наутилус) облачный диск, запускаю KeePassXC, открываю с него файл, допустим password.kdbx.
Файл открывается, но имя базы в заголовке меняется с password на что-то вроде ACvLca2oUHdEmR9hcdP1Ml_P5iMD5RYeG (как я понимаю, это какой-то внутренний идентификатор файла в облаке).
С базой можно работать, но при сохранении она сохраняется в облако уже с именем ACvLca2oUHdEmR9hcdP1Ml_P5iMD5RYeG.
И если облачный диск размонтировать, а потом снова подключить (например после перезагрузки), то KeePassXC уже не может открыть базу паролей, потому что не находит файл password.kdbx. И другие клиенты KeePass (например на смартфоне и другом десктопе) так же не могут открыть эту базу.

Пользователь добавил сообщение 02 Декабрь 2020, 11:55:55:
Вообщем вернул обратно версию 2.4.3 и скрипт синхронизации.
Помогите сделать стартер к этому скрипту, чтобы его можно было запускать с рабочего стола или панели быстрого запуска.
Если я делаю симлинк, то при запуске выдается запрос, что делать - запустить или просмотреть.
Если сделать desktop-файл, то он не запускается.
Вот содержимое desktop-файла:
#!/usr/bin/env xdg-open
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Icon=keepassxc
Exec=sh $HOME/scripts/keepass.sh
Name=KeePassSync

И еще вопрос - можно ли консольное окно сделать скрытым?

Пользователь добавил сообщение 02 Декабрь 2020, 12:19:42:
Написал так: Exec=/home/user/scripts/keepass.sh
Теперь работает. Причем именно так, как мне надо - с невидимым терминалом.
Это баг или фича?

Раньше путь указывал через ~ и $HOME - не работало.
С тильдой понятно, не должно работать.
А почему не работало с $HOME?

Пользователь добавил сообщение 02 Декабрь 2020, 12:49:24:
Финальные версии.

Скрипт-стартер:
#!/bin/sh

CLOUD="gd:"
LOCAL="$HOME/Clouds/keepass"
FILE="passwords.kdbx"
FILE_TIMESTAMP=
LOG="$0.log"

RCLONE="/usr/bin/rclone"
RCLONE_OPTS="-q --auto-confirm"

KEEPASS="/usr/bin/keepassxc"
KEEPASS_OPTS=""

# Запись в журнал
log ()
{
[ -t 1 ] && echo "$*"
if [ -z "$*" ]; then
echo >> "$LOG"
else
echo "`date "+%Y-%m-%d %H:%M:%S"` [pid $$]: $*" >> "$LOG"
fi
}

# Проверка и подготовка
proc_prepare ()
{
if [ ! -f "${LOCAL}/${FILE}" ]; then
echo "* Database not exists, download from cloud store..."
proc_get
fi
}

# Запуск KeePassXC
proc_start ()
{
echo "* Check cloud store..."
proc_sync
FILE_TIMESTAMP=`date -r "${LOCAL}/${FILE}" +'%s'`
echo "* Database timestamp: $FILE_TIMESTAMP"
echo "* Start KeePassXC..."
$KEEPASS $KEEPASS_OPTS "${LOCAL}/${FILE}"
NEW_TIMESTAMP=`date -r "${LOCAL}/${FILE}" +'%s'`
if [ $FILE_TIMESTAMP -ne $NEW_TIMESTAMP ]; then
echo "* Database changed, update cloud"
proc_put
fi
}

# Автоматическая синхронизация файла данных
proc_sync ()
{

echo "* Check cloud timestamp..."
CLOUD_TS=`$RCLONE $RCLONE_OPTS lsjson ${CLOUD}${FILE} 2> /dev/null`
RC=$?
if [ $RC != 0 ]; then
echo "! Remote access error!"
exit 1
fi
CLOUD_ID=`echo $CLOUD_TS | jq -r '.[0].ID'`
CLOUD_TS=`echo $CLOUD_TS | jq -r '.[0].ModTime'`
CLOUD_TS=`date --date="$CLOUD_TS" +'%s'`
echo "* Cloud timestamp: $CLOUD_TS (`date --date="@$CLOUD_TS" --rfc-3339=seconds`)"
echo "* Cloud ID: $CLOUD_ID"
log "INFO: ID [$CLOUD_ID], timestamp `date --date="@$CLOUD_TS" --rfc-3339=seconds`"

echo "* Check local timestamp..."
if [ ! -d "${LOCAL}" ]; then
mkdir -p "${LOCAL}"
fi
if [ -f "${LOCAL}/${FILE}" ]; then
LOCAL_TS=`date -r "${LOCAL}/${FILE}" +'%s'`
echo "* Local timestamp: $LOCAL_TS (`date --date="@$LOCAL_TS" --rfc-3339=seconds`)"
else
LOCAL_TS=0
echo "* Local timestamp: none"
fi

echo "* Compare databases..."
if   [ $LOCAL_TS -eq $CLOUD_TS ]; then
RCLONE_SRC=
elif [ $LOCAL_TS -gt $CLOUD_TS ]; then
RCLONE_SRC=LOCAL
elif [ $LOCAL_TS -lt $CLOUD_TS ]; then
RCLONE_SRC=CLOUD
else
RCLONE_SRC=ERROR
fi
if [ -n "$RCLONE_SRC" ]; then
if   [ "ERROR" = "$RCLONE_SRC" ]; then
echo "! Comparsion fail"
RC=-1
elif [ "CLOUD" = "$RCLONE_SRC" ]; then
echo "* SYNC: CLOUD -> LOCAL"
$RCLONE $RCLONE_OPTS copy "${CLOUD}${FILE}" "${LOCAL}"
RC=$?
log "SYNC: CLOUD -> LOCAL, RC=$RC"
elif [ "LOCAL" = "$RCLONE_SRC" ]; then
echo "* SYNC: LOCAL -> CLOUD"
$RCLONE $RCLONE_OPTS copy "${LOCAL}${FILE}" "${CLOUD}"
RC=$?
log "SYNC: LOCAL -> CLOUD, RC=$RC"
else
RC=0
fi
fi

}

# Загрузка файла данных из облака в локальное хранилище
proc_get ()
{
if [ ! -d "${LOCAL}" ]; then
echo "* Create local store"
mkdir -p "${LOCAL}"
fi
$RCLONE $RCLONE_OPTS copy "${CLOUD}${FILE}" "${LOCAL}"
RC=$?
log "GET: CLOUD -> LOCAL, RC=$RC"
}

# Загрузка файла данных из локального хранилища в облако
proc_put ()
{
if [ ! -d "${LOCAL}" ]; then
echo "! Local store not exists, fail"
exit 1
fi
if [ ! -f "${LOCAL}/${FILE}" ]; then
echo "! Local database not exists, fail"
exit 1
fi
$RCLONE $RCLONE_OPTS copy "${LOCAL}/${FILE}" "${CLOUD}"
RC=$?
log "PUT: LOCAL -> CLOUD, RC=$RC"
}

proc_prepare
proc_start

desktop-файл:
#!/usr/bin/env xdg-open
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Icon=keepassxc
Exec=/home/user/scripts/keepass.sh
Name=KeePassSync
« Последнее редактирование: 02 Декабрь 2020, 12:49:24 от alixey »

 

Страница сгенерирована за 0.112 секунд. Запросов: 26.