Привет! Я наткнулся на эту проблему и написал простой скрипт, который перечисляет все снапшоты в формате JSON (он также создаёт файл snapshot.json). Пожалуйста, всегда проверяй и тестируй скрипты, прежде чем их запускать. Я не несу ответственности, если что-то пойдёт не так (хотя ничего не должно случиться, он просто переcчитывает их). Использует команды pct listsnapshot <LXCID> и qm listsnapshot <VMID>.
* Перечисляет все снапшоты для обеих ВМ и контейнеров.
* Исключает "current" снапшоты (это не настоящие снапшоты — это "Ты здесь").
* Извлекает имя снапшота, метку времени и описание.
* Форматирует вывод в чистый JSON для удобства разбора.
Просто сохрани скрипт как list_snapshots в твоем узле Proxmox и запусти его с помощью bash list_snapshots. Если хочешь, можешь поместить его в /bin, чтобы не пришлось каждый раз указывать путь к файлу. Хотя я не уверен, что это сломает что-нибудь при обновлении.
`#!/bin/bash`
# Инициализируем JSON объект
echo "{ \"vms\": [" > snapshots.json
# Получаем снапшоты ВМ
first_vm=true
for vm in $(qm list | awk 'NR>1 {print $1}'); do
snapshot_list=$(qm listsnapshot $vm | grep -v "current" | awk '{$1=""; print $0}' | sed 's/^ *//')
if [[ ! -z "$snapshot_list" ]]; then
if [ "$first_vm" = false ]; then
echo "," >> snapshots.json
fi
first_vm=false
echo "[" >> snapshots.json
while read -r name date time desc; do
name=$(echo "$name" | sed 's/`->//g' | xargs) # Удаляем маркер в начале и убираем лишние пробелы
timestamp="$date $time"
description=$(echo "$desc" | xargs) # Убираем лишние пробелы
# Обрабатываем случай, когда описание отсутствует
if [[ -z "$description" ]]; then
description="no-description"
fi
echo " { \"vmid\": \"$vm\", \"name\": \"$name\", \"timestamp\": \"$timestamp\", \"description\": \"$description\" }," >> snapshots.json
done <<< "$snapshot_list"
# Удаляем последнюю запятую и закрываем JSON массив
sed -i '$ s/,$//' snapshots.json
echo "]" >> snapshots.json
fi
done
echo "], \"containers\": [" >> snapshots.json
# Получаем снапшоты контейнеров
first_ct=true
for ct in $(pct list | awk 'NR>1 {print $1}'); do
snapshot_list=$(pct listsnapshot $ct | grep -v "current" | awk '{$1=""; print $0}' | sed 's/^ *//')
if [[ ! -z "$snapshot_list" ]]; then
if [ "$first_ct" = false ]; then
echo "," >> snapshots.json
fi
first_ct=false
echo "[" >> snapshots.json
while read -r name date time desc; do
name=$(echo "$name" | sed 's/`->//g' | xargs) # Удаляем маркер в начале и убираем лишние пробелы
timestamp="$date $time"
description=$(echo "$desc" | xargs) # Убираем лишние пробелы
# Обрабатываем случай, когда описание отсутствует
if [[ -z "$description" ]]; then
description="no-description"
fi
echo " { \"ctid\": \"$ct\", \"name\": \"$name\", \"timestamp\": \"$timestamp\", \"description\": \"$description\" }," >> snapshots.json
done <<< "$snapshot_list"
# Удаляем последнюю запятую и закрываем JSON массив
sed -i '$ s/,$//' snapshots.json
echo "]" >> snapshots.json
fi
done
echo "] }" >> snapshots.json
# Выводим JSON
cat snapshots.json
Ожидаемый вывод: JSON: {
"vms": [
[
{ "vmid": "112", "name": "goti", "timestamp": "2024-05-17 21:27:03", "description": "no-description" }
],
[
{ "vmid": "131", "name": "ansible_test", "timestamp": "2024-11-04 12:32:39", "description": "no-description" }
],
[
{ "vmid": "530", "name": "totally_legit_snapshot_name", "timestamp": "2025-01-17 14:29:16", "description": "no-description" }
]
],
"containers": [
[
{ "ctid": "135", "name": "update", "timestamp": "2024-11-30 12:15:26", "description": "no-description" }
]
]
}