Яндекс.Диск в графике в GNU/Linux? Легко и просто

Содержание

Введение

  1. Два варианта работы с Яндекс.Диском.

  2. Установка консольной утилиты с помощью скрипта.

  3. Настройка одного Яндекс.Диска в GNU/Linux с графическим интерфейсом.

  4. Настройка нескольких Яндекс.Дисков в GNU/Linux с графическим интерфейсом.

Заключение

Введение

Компания Яндекс предоставляет официальный консольный клиент для подключения к Яндекс.Диску в операционной системе GNU/Linux. Этот клиент покрывает потребности самых взыскательных пользователей, обеспечивая одновременную работу с несколькими Яндекс.Дисками (с разными логинами). У него только один (для некоторых -- принципиальный) недостаток: он запускается в консоли.

Графические интерфейсы от сторонних разработчиков существуют, однако они заточены под конкретные дистрибутивы и могут не заработать в других.

Универсальный способ сделать Яндекс.Диск в любом дистрибутиве GNU/Linux графическим заключается в том, чтобы "скрестить" консольную программу с двухпанельным файл-менеджером, входящим в любой дистрибутив -- Krusader. Он является программой из графической среды KDE, но может быть установлен в любой графической среде (при этом количество пакетов, которые он тянет по зависимостям, невелико).

Поскольку при этом обеспечивается наглядность, скорость работы (через горячие клавиши) и возможность доступа к нескольким Яндекс.Дискам одновременно, плодом указанного "скрещивания" становится этакий "облачный крестоносец".

1. Два варианта работы с Яндекс.Диском

Возможны два варианта работы с Яндекс.Диском:

  1. имеется только одна учетная запись Яндекса и необходимо соответствующий ей Яндекс.диск связать с конкретной директорией на компьютере пользователя, обеспечив запуск демона, вывод информации о состоянии, синхронизацию и публикацию (получение публичных ссылок) на файлы или директории, а также останов демона;

  2. имеется несколько учетных записей Яндекса, и для каждой из них необходимо связать свою директорию на компьютере пользователя и организовать работу вышеуказанных функций.

Далее в статье указаны решения для обоих вариантов.

Предполагается, что у пользователя уже установлен файл-менеджер Krusader. Команды для инсталляции программных пакетов приводятся в скрипте установки для дистрибутива Debian, но их легко адаптировать для других дистрибутивов. При выводе консольных команд знак "$" указывает на то, что работа идет из-под текущего пользователя. Все приведенные примеры отлажены и стабильно работают в ОС Debian 11.

2. Установка консольной утилиты yandex-disk

Вначале следует установить консольную утилиту yandex-disk, для которой имеется официальный репозиторий от Яндекс. Чтобы не выполнять вручную ряд рутинных действий, предлагается для установки утилиты использовать bash-скрипт "yandex-disk-debian-installation.sh", который выглядит так:

#!/bin/bash
#
# Скрипт загружает ключ электронной подписи официального репозитория yandex-disk с сайта yandex.ru,
# инсталлирует его, подключает указанный репозиторий, загружает из него и инсталлирует 
# последнюю версию консольной программы yandex-disk для Debian GNU/Linux.
# 
# Запускается из-под рута.
#
# Д.В. Юревич, версия 1.0 от 14.08.2021.

clear

printf "============================================================\r\n"
printf "Установка последней версии консольной программы yandex-disk\n\rдля Debian GNU/Linux из официального репозитория yandex.ru\n\r"
printf "============================================================\r\n"
printf "Для продолжения нажмите <Ввод>"
read x

printf "\n\rЗагружаю ключ электронной подписи официального репозитория yandex-disk с сайта yandex.ru\n\r"
printf "Для продолжения нажмите <Ввод>"
read x

curl -#fSLo /usr/share/keyrings/YANDEX-DISK-KEY.GPG http://repo.yandex.ru/yandex-disk/YANDEX-DISK-KEY.GPG
if [ -e /usr/share/keyrings/YANDEX-DISK-KEY.GPG ]
   then
     printf "\n\rЗагрузка удалась. Произвожу добавление репозитория yandex-disk...\n\r"
     echo "deb [signed-by=/usr/share/keyrings/YANDEX-DISK-KEY.GPG arch=amd64] http://repo.yandex.ru/yandex-disk/deb/ stable main" > /etc/apt/sources.list.d/yandex-disk.list

     printf "\n\rПроизвожу обновление репозиториев с учетом добавленного...\n\r"
     printf "Для продолжения нажмите <Ввод>"
     read x

     apt update
     
     printf "\n\rИнсталлирую последнюю версию консольной программы yandex-disk...\r\nДля продолжения нажмите <Ввод>"     
     read x

     apt install -y yandex-disk

     printf "\n\rВы желаете установить программу xclip (понадобится для графической работы с Яндекс.Диском из файл-менеджера krusader)? Наберите 'да'/'yes' или 'нет'/'no': "
     read answer
          
     while [ "$answer" != "y" ] && [ "$answer" != "yes" ] && [ "$answer" != "д" ] && [ "$answer" != "да" ] && [ "$answer" != "n" ] && [ "$answer" != "no" ] && [ "$answer" != "н" ] && [ "$answer" != "нет" ]
        do
           printf "\n\rНаберите 'да'/'yes' или 'нет'/'no': "
           read answer
        done
     
     if [ "$answer" == "y" ] || [ "$answer" == "yes" ] || [ "$answer" == "д" ] || [ "$answer" == "да" ]
        then
           # инсталляция xclip
           printf "\n\rИнсталлирую программу xclip...\n\r"
           apt install -y xclip
     fi
     
     printf "\n\rГотово!\n\r"
   
   else
     printf "\n\rОшибка! Загрузка эл. ключа репозитория не удалась.\n\r"
     printf "Пытаюсь скачать отдельный пакет и установить его без добавления репозитория...\n\r"
     printf "Для продолжения нажмите <Ввод>"
     read x
     
     curl -#fSLo /var/cache/apt/archives/yandex-disk_latest_amd64.deb http://repo.yandex.ru/yandex-disk/yandex-disk_latest_amd64.deb
     
     if [ -e /var/cache/apt/archives/yandex-disk_latest_amd64.deb ]
       then
         printf "\n\rЗагрузка отдельного пакета удалась!\n\r"
         printf "Устанавливаю в системе отдельный пакет yandex-disk, но из-за того, что репозиторий не подключен, он не будет регулярно обновляться.\n\r"
         printf "Для продолжения нажмите <Ввод>"
         read x
         
         apt install -y /var/cache/apt/archives/yandex-disk_latest_amd64.deb

         printf "\n\rВы желаете установить программу xclip (понадобится для графической работы с Яндекс.Диском из файл-менеджера krusader)? Наберите 'да'/'yes' или 'нет'/'no': "
         read answer
          
         while [ "$answer" != "y" ] && [ "$answer" != "yes" ] && [ "$answer" != "д" ] && [ "$answer" != "да" ] && [ "$answer" != "n" ] && [ "$answer" != "no" ] && [ "$answer" != "н" ] && [ "$answer" != "нет" ]
            do
               printf "\n\rНаберите 'да'/'yes' или 'нет'/'no': "
               read answer
            done
     
         if [ "$answer" == "y" ] || [ "$answer" == "yes" ] || [ "$answer" == "д" ] || [ "$answer" == "да" ]
            then
               # инсталляция xclip
               printf "\n\rИнсталлирую программу xclip...\n\r"
               apt install -y xclip
         fi
         
         printf "\n\rГотово!\n\r"
         
       else
         printf "\n\rОшибка! Загрузка отдельного пакета не удалась. Программа не была установлена.\n\r"
     fi
fi

Делаем файл скрипта исполняемым для рута (предварительно войдя под учетной записью рута):

chmod u+x yandex-disk-debian-installation.sh

Запускаем скрипт из-под рута:

./yandex-disk-debian-installation.sh

Скрипт загрузит и установит ключ электронной подписи репозитория yandex-disk, добавит его в систему, произведет обновление списка ПО с учетом нового репозитория, после чего установит в системе консольную утилиту yandex-disk. Кроме того, скрипт предложит установить программу xclip, которая понадобится для организации графического интерфейса; следует подтвердить установку, набрав "да".

3. Настройка одного Яндекс.диска в GNU/Linux с графическим интерфейсом

Это самый простой и наиболее распространенный среди пользователей вариант: имеется только одна учетная запись Яндекса и необходимо настроить ее для работы с Яндекс.диском, связав его с конкретной директорией на компьютере.

3.1. Настройка консольной программы yandex-disk для работы с одним Яндекс.Диском

Для первоначальной настройки предлагается использовать bash-скрипт "yandex-disk-debian-settings.sh", содержимое которого находится под спойлером:

#!/bin/bash
#
# Скрипт позволяет настроить прежде установленную консольную программу yandex-disk для Debian GNU/Linux.
# Запускается из-под учетной записи конкретного пользователя (не из-под рута).
# 
# Д.В. Юревич, версия 1.0 от 14.08.2021.

clear

printf "===============================================================\r\n"
printf "Настройка консольной программы yandex-disk для Debian GNU/Linux\n\r"
printf "===============================================================\r\n"
printf "Для продолжения нажмите <Ввод>"
read x

printf "\n\rВы хотите настроить программу yandex-disk:\n\r"
printf "  1 -- для подключения только одного Яндекс.Диска;\n\r"
printf "  2 -- для подключения нескольких разных Яндекс.Дисков (с разными учетными записями)?\n\r"
printf "Для продолжения укажите Ваш вариант: "
read y

while [ "$y" != "1" ] && [ "$y" != "2" ]
  do
    printf "\n\rВыберите один из двух вариантов -- 1 или 2: "
    read y
  done
  
if [ "$y" == "1" ]
  then
    printf "\n\r-------------------------------------------------------\n\r"
    printf "Произвожу настройку для подключения одного Яндекс.Диска"
    printf "\n\r-------------------------------------------------------\n\r"
    printf "Пожалуйста, в любом браузере войдите в ту учетную запись на Яндексе, диск которой Вы хотите настроить, и перейдите по адресу:\n\r\n\rhttps://ya.ru/device\n\r\n\rПроцедура настройки укажет Вам секретный код, который необходимо будет ввести в браузере.\n\r"
    printf "Когда будете готовы, нажмите <Ввод>"
    read x

    printf "\n\rЗапускаю стандартную процедуру настройки yandex-disk'а...\n\r\n\r"
    
    yandex-disk setup
    
  elif [ "$y" == "2" ]
    then
      printf "\n\r------------------------------------------------------------\n\r"
      printf "Произвожу настройку для подключения нескольких Яндекс.Дисков"
      printf "\n\r------------------------------------------------------------\n\r\n\r"
      printf "* Для удобства использования предлагается, чтобы каждый Яндекс.Диск получил свой идентификатор.\n\r\n\r"
      printf "* В простейшем случае Вы можете выбрать в качестве идентификаторов целые числа и нумеровать Яндекс.диски  1, 2, 3... и т.д. В таком случае файлы токенов дисков будут иметь названия passwd_1, passwd_2, passwd_3... и т.д., а конфигурационные файлы -- названия config_1, config_2, config_3... и т.д.\n\r\n\r"
      printf "* Однако Вы можете выбрать в качестве идентификаторов имена. Например, назвать свои диски lib, my, extra и т.д. В таком случае файлы токенов дисков будут иметь названия passwd_lib, passwd_my, passwd_extra... и т.д., а конфигурационные файлы -- названия config_lib, config_my, config_extra... и т.д.\n\r\n\r"
      printf "* Эти идентификаторы будут использоваться при работе с Яндекс.Дисками из графического интерфейса файл-менеджера krusader, поэтому Вам необходимо будет их помнить. Вы всегда можете посмотреть названия в директории настроек: ~/.config/yandex-disk.\n\r\n\r"
      printf "Для продолжения нажмите <Ввод>"
      read x
      
      if ! [ -e ~/.config/yandex-disk ]
        then
           # если не существует директория настроек yandex-disk'а, создаем ее
           mkdir ~/.config/yandex-disk
      fi
            
      answer="y"
      
      while [ "$answer" == "y" ] || [ "$answer" == "yes" ] || [ "$answer" == "д" ] || [ "$answer" == "да" ]
        do
          printf "\n\r.................................\n\r"
          printf "Настройка очередного Яндекс.Диска"
          printf "\n\r.................................\n\r\n\r"
          
          printf "Укажите, какой идентификатор будет иметь Яндекс.Диск в системе: "
          read disk_id
          
          printf "\n\rНастраиваю диск \"$disk_id\"\n\r\n\r"
          printf "Пожалуйста, в любом браузере войдите в ту учетную запись на Яндексе, диск которой Вы хотите настроить, и перейдите по адресу:\n\r\n\rhttps://ya.ru/device\n\r\n\rПроцедура настройки укажет Вам секретный код, который необходимо будет ввести в браузере.\n\r"
          printf "Когда будете готовы, нажмите <Ввод>"
          read x
          
          yandex-disk token ~/.config/yandex-disk/passwd_$disk_id
          
          if [ -e ~/.config/yandex-disk/passwd_$disk_id ]
            then
               # токен создан, можно создавать конфигурационный файл
               printf "\n\rСоздаю новый конфигурационный файл: ~/.config/yandex-disk/config_$disk_id.cfg.\n\r"
               echo "auth=\"~/.config/yandex-disk/passwd_$disk_id\"" > ~/.config/yandex-disk/config_$disk_id.cfg
               
               printf "\n\rУкажите полный путь к директории, к которой подключен Яндекс.Диск: "
               read disk_dir
               printf "\n\rПодключается директория: $disk_dir.\n\r"
               echo "dir=\"$disk_dir\"" >> ~/.config/yandex-disk/config_$disk_id.cfg
               
               printf "\n\rДля подключения используется прокси-сервер? Наберите 'да'/'yes' или 'нет'/'no': "
               read answer
          
               while [ "$answer" != "y" ] && [ "$answer" != "yes" ] && [ "$answer" != "д" ] && [ "$answer" != "да" ] && [ "$answer" != "n" ] && [ "$answer" != "no" ] && [ "$answer" != "н" ] && [ "$answer" != "нет" ]
                  do
                     printf "\n\rНаберите 'да'/'yes' или 'нет'/'no': "
                     read answer
                  done
               
               if [ "$answer" == "y" ] || [ "$answer" == "yes" ] || [ "$answer" == "д" ] || [ "$answer" == "да" ]
                 then
                    # используется прокси
                    printf "\n\rВведите параметры Вашего прокси-сервера. Примеры:\n\r"
                    printf "* по умолчанию, как в системе: proxy=auto\n\r"
                    printf "* протокол, адрес, порт: proxy=https,127.0.0.1,80\n\r"
                    printf "* или: proxy=https,127.0.0.1,443\n\r"
                    printf "* плюс логин и пароль: proxy=https,127.0.0.1,80,login,password\n\r"
                    printf "* или: proxy=socks4,my.proxy.local,1080,login,password\n\r"
                    printf "* или: proxy=socks5,my.another.proxy.local,1081\n\r"
                    
                    read disk_proxy
                    
                    printf "\n\rУказывается прокси-сервер: $disk_proxy.\n\r"
                    echo "proxy=\"$disk_proxy\"" >> ~/.config/yandex-disk/config_$disk_id.cfg
                 else
                    # не используется прокси
                    echo "proxy=\"no\"" >> ~/.config/yandex-disk/config_$disk_id.cfg
               fi
               
               printf "\n\rНастройка завершена успешно!\n\r"
          fi
          
          printf "\n\rВы хотите настроить в системе еще один Яндекс.Диск? Наберите 'да'/'yes' или 'нет'/'no': "
          read answer
          
          while [ "$answer" != "y" ] && [ "$answer" != "yes" ] && [ "$answer" != "д" ] && [ "$answer" != "да" ] && [ "$answer" != "n" ] && [ "$answer" != "no" ] && [ "$answer" != "н" ] && [ "$answer" != "нет" ]
             do
                printf "\n\rНаберите 'да'/'yes' или 'нет'/'no': "
                read answer
             done

        done
fi

Придаем ему права исполняемого файла для текущего пользователя:

$ chmod u+x yandex-disk-debian-settings.sh

Запускаем скрипт из-под текущего пользователя:

$ ./yandex-disk-debian-settings.sh

Выбираем вариант 1, который соответствует настройке только одного Яндекс.диска.

В браузере входим в ту учетную запись, для которой настраиваем диск, и заранее переходим по адресу

https://ya.ru/device

поскольку на следующем шаге программа настройки сгенерирует секретный код и предложит его ввести в браузере по указанному адресу (на это дается только 5 мин).

Переключаемся обратно на скрипт, нажимаем "Ввод".

Программа спрашивает, использовать ли прокси-сервер -- если да, то примеры описания прокси-сервера см. ниже, в пункте 4. Для обычных пользователей в подавляющем большинстве случаев ответ "no".

Происходит авторизация: скрипт генерирует секретный код, который необходимо скопировать (в консоли по комбинации клавиш Ctrl-Shift-C), переключиться в браузер (где открыта страница https://ya.ru/device) и ввести код там (Ctrl-V).

Если авторизация прошла успешно, скрипт напишет, что "токен сохранен в ~/yandex-disk/passwd".

Далее скрипт запрашивает путь к директории на компьютере пользователя, которая будет связана с удаленным Яндекс.Диском. Можно просто нажать "Ввод", тогда будет принята директория по умолчанию ~/Yandex.Disk (это действительно удобно), или же ввести свой путь.

Скрипт спрашивает, запускать ли демон при каждом входе в систему -- в большинстве случаев это удобно и можно ответить положительно.

Если все прошло успешно, скрипт запустит демон и напишет "Готово".

3.2. Настройка графического интерфейса для работы с одним Яндекс.Диском

Настройку графического интерфейса предлагается производить с использованием штатных средств файл-менеджера Krusader. Создаем 6 файлов с расширением .xml, которые будут плагинами для файл-менеджера. При этом рекомендуется задать файлам именно эти имена, так как имена отображаются в Krusader как пункты меню (содержимое файлов см. под спойлерами):

"Krusader. Яндекс.Диск. 1. Запуск.xml"

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE KrusaderUserActions>
<KrusaderUserActions>
 <action name="yd_start">
  <title>&amp;Запуск</title>
  <tooltip>Запуск Яндекс.Диска в фоновом режиме</tooltip>
  <category>Яндекс.Диск</category>
  <command executionmode="collect_output">yandex-disk start</command>
  <defaultshortcut>Ctrl+Shift+F5</defaultshortcut>
 </action>
</KrusaderUserActions>

"Krusader. Яндекс.Диск. 2. Статус.xml"

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE KrusaderUserActions>
<KrusaderUserActions>
 <action name="yd_status">
  <title>&amp;Статус</title>
  <tooltip>Вывод текущего статуса Яндекс.Диска</tooltip>
  <category>Яндекс.Диск</category>
  <command executionmode="collect_output">yandex-disk status</command>
  <defaultshortcut>Ctrl+Shift+F6</defaultshortcut>
 </action>
</KrusaderUserActions>

"Krusader. Яндекс.Диск. 3. Синхронизация.xml"

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE KrusaderUserActions>
<KrusaderUserActions>
 <action name="yd_sync">
  <title>&amp;Синхронизация</title>
  <tooltip>Синхронизация компьютера с Яндекс.Диском</tooltip>
  <category>Яндекс.Диск</category>
  <command executionmode="collect_output">yandex-disk sync</command>
  <defaultshortcut>Ctrl+Shift+F7</defaultshortcut>
 </action>
</KrusaderUserActions>

"Krusader. Яндекс.Диск. 4. Получение ссылки.xml"

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE KrusaderUserActions>
<KrusaderUserActions>
 <action name="yd_publish">
  <title>&amp;Получение ссылки</title>
  <tooltip>Получение ссылки на файл или директорию</tooltip>
  <category>Яндекс.Диск</category>
  <command executionmode="collect_output">yandex-disk publish %aCurrent%  | xclip -selection clipboard &amp;&amp; xclip -selection clipboard -out &amp;&amp; printf "Ссылка скопирована в буфер обмена\n\r"</command>
  <defaultshortcut>Ctrl+Shift+F8</defaultshortcut>
 </action>
</KrusaderUserActions>

"Krusader. Яндекс.Диск. 5. Отмена публикации.xml"

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE KrusaderUserActions>
<KrusaderUserActions>
 <action name="yd_unpublish">
  <title>&amp;Отмена публикации</title>
  <tooltip>Отмена публикации файла или директории</tooltip>
  <category>Яндекс.Диск</category>
  <command executionmode="collect_output">yandex-disk unpublish %aCurrent%  | xclip -selection clipboard &amp;&amp; xclip -selection clipboard -out</command>
  <defaultshortcut>Ctrl+Shift+F9</defaultshortcut>
 </action>
</KrusaderUserActions>

"Krusader. Яндекс.Диск. 6. Завершение.xml"

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE KrusaderUserActions>
<KrusaderUserActions>
 <action name="yd_stop">
  <title>&amp;Завершение</title>
  <tooltip>Завершение работы Яндекс.диска</tooltip>
  <category>Яндекс.Диск</category>
  <command executionmode="collect_output">yandex-disk stop</command>
  <defaultshortcut>Ctrl+Shift+F10</defaultshortcut>
 </action>
</KrusaderUserActions>

Переходим в Krusader: "Настройка" --> "Настроить Krusader" --> "Меню пользователя" --> "Запустить менеджер действий":

Нажимаем слева вверху значок "Загрузить действие" и выбираем для загрузки последовательно файлы плагинов в соответствии с тем, как они пронумерованы (в таком порядке они будут появляться в контекстном меню Krudaser'а): "Krusader. Яндекс.Диск. 1. Запуск.xml", "Krusader. Яндекс.Диск. 2. Статус.xml"... и т.д.

В результате загрузки плагинов в "Менеджере действий" появится новый пункт "Яндекс.Диск", в котором будут присутствовать подпункты "&Завершение", "&Запуск", ... и т.д.:

Нажимая последовательно на подпункты, можно ознакомиться с тем, какие для отдельных действий с Яндекс.Диском назначены по умолчанию комбинации клавиш:

Если эти комбинации по какой-то причине не подходят, прямо здесь, в "Менеджере действий", их можно заменить на другие.

Закрываем "Менеджер действий" и убеждаемся в том, что теперь указанные действия с Яндекс.Диском доступны как из основного меню Krusader: "Меню" --> "Действия" --> "Яндекс.Диск",

так и из контекстного меню (выставляем на файле или директории и нажимаем правую клавишу мыши --> "Меню пользователя" --> "Яндекс.Диск"):

Убедимся в работоспособности графического интерфейса.

Запуск -- Ctrl-Shift-F5: запускает демон и выводит информацию об этом в отдельном окне (планка Krusader может находится в любом месте файловой системы, а не только в пределах основной директории Яндекс.Диска):

Если демон уже запущен, сообщает об этом:

Статус -- Ctrl-Shift-F6: выводит информацию о статусе Яндекс.Диска (планка Krusader может находится в любом месте файловой системы, а не только в пределах основной директории Яндекс.Диска):

Синхронизация -- Ctrl-Shift-F7: запускает синхронизацию или сообщает о том, что она уже произведена автоматически (планка Krusader может находится в любом месте файловой системы, а не только в пределах основной директории Яндекс.Диска):

Получение ссылки -- Ctrl-Shift-F8: для использования данной функции необходимо поставить планку Krusader на тот файл или на ту директорию, которую следует опубликовать. При публикации директории по ссылке стороннему пользователю будут доступны в ней все файлы и все поддиректории. Ссылка на файл или директорию при этом копируется в буфер обмена:

Если планка стоит на файле или директории, которые не находятся в одной из поддиректорий основной директории Яндекс.Диска (в нашем примере -- ~/Yandex.Disk), то данный файл или директория будут вначале полностью скопированы в корень основной директории Яндекс.Диска, а потом на данную копию будет сделана ссылка. В ряде случаев это удобно.

Отмена публикации -- Ctrl-Shift-F9: аналогично предыдущему случаю, планка Krusader ставится на файл или директорию, которые уже были опубликованы (для них были созданы публичные ссылки). После выполнения данной операции доступ к ним для сторонних лиц будет закрыт.

Завершение -- Ctrl-Shift-F10: завершает работу демона и выводит сообщение (планка Krusader может находится в любом месте файловой системы, а не только в пределах основной директории Яндекс.Диска):

4. Настройка нескольких Яндекс.Дисков (с несколькими учетными записями) в GNU/Linux с графическим интерфейсом

4.1. Идентификаторы для Яндекс.Дисков

Это более сложный случай настройки, который предполагает, что диски, соответствующие разным учетным записям Яндекс, могут подключаться пользователем в разное время и соотноситься с разными директориями на компьютере пользователя. Для удобства работы предлагается, чтобы каждый Яндекс.Диск получил от пользователя свой идентификатор, который будет использоваться в графическом интерфейсе.

В простейшем варианте это могут быть целые числа: 1, 2, 3... и т.д., причем назначать их пользователь может в произвольном порядке. Выбор чисел в качестве идентификаторов дисков имеет чисто практическое преимущество: при вводе с клавиатуры при запросе со стороны графического интерфейса можно быстро набрать число на дополнительной числовой клавиатуре и не переключать раскладку. Однако при этом пользователю следует помнить, какому числу какой соответствует аккаунт (и диск) Яндекса. В приведенных ниже примерах в качестве идентификатора дисков выбраны именно числа.

Тем не менее, в качестве идентификаторов можно выбрать обычные символьно-числовые последовательности (которые, естественно, не должны совпадать между собой), например: lib, my, extra или aurora123. Чем длиннее будет идентификатор, тем больше символов придется вводить каждый раз при работе с Яндекс.Диском. Идентификаторы используются при работе с Яндекс.Дисками из графического интерфейса файл-менеджера Krusader, поэтому пользователю необходимо их помнить.

Если интересны технические подробности, раскройте спойлер.

В техническом отношении идентификаторы будут определять имена файлов настроек консольной утилиты yandex-disk, к которой обращается графический интерфейс. Файлы находятся в директории ~/.config/yandex-disk и представляют собой файлы токенов (они будут иметь названия passwd_{id}, где {id} -- выбранный пользователем идентификатор, например, passwd_1 или passwd_lib) и файлы конфигурации (с названиями config_{id}, например, config_1 или config_lib и т.д.). Рекомендуется заранее продумать выбор идентификаторов для Яндекс.Дисков.

4.2. Настройка консольной программы yandex-disk для работы с несколькими Яндекс.Дисками

После установки консольной утилиты (см. пункт 2) для добавления очередного Яндекс.Диска предлагается использовать скрипт "yandex-disk-debian-settings.sh", содержание которого находится под спойлером (оно точно такое же, как в случае с подключением одного Яндекс.Диска):

#!/bin/bash
#
# Скрипт позволяет настроить прежде установленную консольную программу yandex-disk для Debian GNU/Linux.
# Запускается из-под учетной записи конкретного пользователя (не из-под рута).
# 
# Д.В. Юревич, версия 1.0 от 14.08.2021.

clear

printf "===============================================================\r\n"
printf "Настройка консольной программы yandex-disk для Debian GNU/Linux\n\r"
printf "===============================================================\r\n"
printf "Для продолжения нажмите <Ввод>"
read x

printf "\n\rВы хотите настроить программу yandex-disk:\n\r"
printf "  1 -- для подключения только одного Яндекс.Диска;\n\r"
printf "  2 -- для подключения нескольких разных Яндекс.Дисков (с разными учетными записями)?\n\r"
printf "Для продолжения укажите Ваш вариант: "
read y

while [ "$y" != "1" ] && [ "$y" != "2" ]
  do
    printf "\n\rВыберите один из двух вариантов -- 1 или 2: "
    read y
  done
  
if [ "$y" == "1" ]
  then
    printf "\n\r-------------------------------------------------------\n\r"
    printf "Произвожу настройку для подключения одного Яндекс.Диска"
    printf "\n\r-------------------------------------------------------\n\r"
    printf "Пожалуйста, в любом браузере войдите в ту учетную запись на Яндексе, диск которой Вы хотите настроить, и перейдите по адресу:\n\r\n\rhttps://ya.ru/device\n\r\n\rПроцедура настройки укажет Вам секретный код, который необходимо будет ввести в браузере.\n\r"
    printf "Когда будете готовы, нажмите <Ввод>"
    read x

    printf "\n\rЗапускаю стандартную процедуру настройки yandex-disk'а...\n\r\n\r"
    
    yandex-disk setup
    
  elif [ "$y" == "2" ]
    then
      printf "\n\r------------------------------------------------------------\n\r"
      printf "Произвожу настройку для подключения нескольких Яндекс.Дисков"
      printf "\n\r------------------------------------------------------------\n\r\n\r"
      printf "* Для удобства использования предлагается, чтобы каждый Яндекс.Диск получил свой идентификатор.\n\r\n\r"
      printf "* В простейшем случае Вы можете выбрать в качестве идентификаторов целые числа и нумеровать Яндекс.диски  1, 2, 3... и т.д. В таком случае файлы токенов дисков будут иметь названия passwd_1, passwd_2, passwd_3... и т.д., а конфигурационные файлы -- названия config_1, config_2, config_3... и т.д.\n\r\n\r"
      printf "* Однако Вы можете выбрать в качестве идентификаторов имена. Например, назвать свои диски lib, my, extra и т.д. В таком случае файлы токенов дисков будут иметь названия passwd_lib, passwd_my, passwd_extra... и т.д., а конфигурационные файлы -- названия config_lib, config_my, config_extra... и т.д.\n\r\n\r"
      printf "* Эти идентификаторы будут использоваться при работе с Яндекс.Дисками из графического интерфейса файл-менеджера krusader, поэтому Вам необходимо будет их помнить. Вы всегда можете посмотреть названия в директории настроек: ~/.config/yandex-disk.\n\r\n\r"
      printf "Для продолжения нажмите <Ввод>"
      read x
      
      if ! [ -e ~/.config/yandex-disk ]
        then
           # если не существует директория настроек yandex-disk'а, создаем ее
           mkdir ~/.config/yandex-disk
      fi
            
      answer="y"
      
      while [ "$answer" == "y" ] || [ "$answer" == "yes" ] || [ "$answer" == "д" ] || [ "$answer" == "да" ]
        do
          printf "\n\r.................................\n\r"
          printf "Настройка очередного Яндекс.Диска"
          printf "\n\r.................................\n\r\n\r"
          
          printf "Укажите, какой идентификатор будет иметь Яндекс.Диск в системе: "
          read disk_id
          
          printf "\n\rНастраиваю диск \"$disk_id\"\n\r\n\r"
          printf "Пожалуйста, в любом браузере войдите в ту учетную запись на Яндексе, диск которой Вы хотите настроить, и перейдите по адресу:\n\r\n\rhttps://ya.ru/device\n\r\n\rПроцедура настройки укажет Вам секретный код, который необходимо будет ввести в браузере.\n\r"
          printf "Когда будете готовы, нажмите <Ввод>"
          read x
          
          yandex-disk token ~/.config/yandex-disk/passwd_$disk_id
          
          if [ -e ~/.config/yandex-disk/passwd_$disk_id ]
            then
               # токен создан, можно создавать конфигурационный файл
               printf "\n\rСоздаю новый конфигурационный файл: ~/.config/yandex-disk/config_$disk_id.cfg.\n\r"
               echo "auth=\"~/.config/yandex-disk/passwd_$disk_id\"" > ~/.config/yandex-disk/config_$disk_id.cfg
               
               printf "\n\rУкажите полный путь к директории, к которой подключен Яндекс.Диск: "
               read disk_dir
               printf "\n\rПодключается директория: $disk_dir.\n\r"
               echo "dir=\"$disk_dir\"" >> ~/.config/yandex-disk/config_$disk_id.cfg
               
               printf "\n\rДля подключения используется прокси-сервер? Наберите 'да'/'yes' или 'нет'/'no': "
               read answer
          
               while [ "$answer" != "y" ] && [ "$answer" != "yes" ] && [ "$answer" != "д" ] && [ "$answer" != "да" ] && [ "$answer" != "n" ] && [ "$answer" != "no" ] && [ "$answer" != "н" ] && [ "$answer" != "нет" ]
                  do
                     printf "\n\rНаберите 'да'/'yes' или 'нет'/'no': "
                     read answer
                  done
               
               if [ "$answer" == "y" ] || [ "$answer" == "yes" ] || [ "$answer" == "д" ] || [ "$answer" == "да" ]
                 then
                    # используется прокси
                    printf "\n\rВведите параметры Вашего прокси-сервера. Примеры:\n\r"
                    printf "* по умолчанию, как в системе: proxy=auto\n\r"
                    printf "* протокол, адрес, порт: proxy=https,127.0.0.1,80\n\r"
                    printf "* или: proxy=https,127.0.0.1,443\n\r"
                    printf "* плюс логин и пароль: proxy=https,127.0.0.1,80,login,password\n\r"
                    printf "* или: proxy=socks4,my.proxy.local,1080,login,password\n\r"
                    printf "* или: proxy=socks5,my.another.proxy.local,1081\n\r"
                    
                    read disk_proxy
                    
                    printf "\n\rУказывается прокси-сервер: $disk_proxy.\n\r"
                    echo "proxy=\"$disk_proxy\"" >> ~/.config/yandex-disk/config_$disk_id.cfg
                 else
                    # не используется прокси
                    echo "proxy=\"no\"" >> ~/.config/yandex-disk/config_$disk_id.cfg
               fi
               
               printf "\n\rНастройка завершена успешно!\n\r"
          fi
          
          printf "\n\rВы хотите настроить в системе еще один Яндекс.Диск? Наберите 'да'/'yes' или 'нет'/'no': "
          read answer
          
          while [ "$answer" != "y" ] && [ "$answer" != "yes" ] && [ "$answer" != "д" ] && [ "$answer" != "да" ] && [ "$answer" != "n" ] && [ "$answer" != "no" ] && [ "$answer" != "н" ] && [ "$answer" != "нет" ]
             do
                printf "\n\rНаберите 'да'/'yes' или 'нет'/'no': "
                read answer
             done

        done
fi

Придаем ему права исполняемого файла для текущего пользователя:

$ chmod u+x yandex-disk-debian-settings.sh

Запускаем скрипт в консоли:

$ ./yandex-disk-debian-settings.sh

Выбираем вариант 2 -- подключение нескольких Яндекс.Дисков, читаем напоминалку о выборе идентификаторов для разных дисков и нажимаем "Ввод".

Выбираем идентификатор для первого диска -- допустим, 1.

Скрипт напоминает о том, что необходимо войти в браузер, залогиниться с той учетной записью Яндекса, диск которой подключается, и перейти в браузере по адресу

https://ya.ru/device

Делаем это, возвращаемся в окно консоли, нажимаем "Ввод", копируем секретный код (Shift-Ctrl-C) и вставляем его в окне браузера (Ctrl-V), после чего подтверждаем в браузере разрешение на подключение.

Если все прошло хорошо, в консоли появляются два сообщения:

Токен сохранен в ~/.config/yandex-disk/passwd_1

Создаю новый конфигурационный файл: ~/.config/yandex-disk/config_1.cfg.

Далее указываем полный путь к директории на компьютере пользователя, которую подключаем к данной записи Яндекс.Диска.

Если подключение идет не через прокси-сервер, то отвечаем, что его нет. При наличии прокси возможны разные варианты описания его параметров. Скрипт выведет примеры того, как можно задать параметры:

  • по умолчанию, как в системе: proxy=auto

  • протокол, адрес, порт: proxy=https,127.0.0.1,80

  • или: proxy=https,127.0.0.1,443

  • плюс логин и пароль: proxy=https,127.0.0.1,80,login,password

  • или: proxy=socks4,my.proxy.local,1080,login,password

  • или: proxy=socks5,my.another.proxy.local,1081

На основании примеров задаем параметры прокси-сервера.

После этого скрипт спрашивает, настроить ли еще один Яндекс.Диск для другой учетной записи. Следует иметь в виду, что другие учетные записи можно настраивать позже, отдельно, запуская скрипт повторно.

4.3. Настройка графического интерфейса для работы с несколькими Яндекс.Дисками

Настройку графического интерфейса предлагается производить с использованием штатных средств файл-менеджера Krusader. Создаем 6 текстовых файлов с расширением .xml, которые будут плагинами для файл-менеджера. При этом рекомендуется задать файлам именно эти имена, так как имена отображаются в Krusader как пункты меню (содержимое файлов под спойлерами):

"Krusader. Яндекс.Диски. 1. Запуск.xml"

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE KrusaderUserActions>
<KrusaderUserActions>
 <action name="yds_start">
  <title>&amp;Запуск</title>
  <tooltip>Запуск Яндекс.Диска в фоновом режиме</tooltip>
  <category>Яндекс.Диски</category>
  <command executionmode="collect_output">yandex-disk start -c ~/.config/yandex-disk/config_%_Ask("Укажите подключаемый диск", "")%.cfg</command>
  <defaultshortcut>Alt+Shift+F5</defaultshortcut>
 </action>
</KrusaderUserActions>

"Krusader. Яндекс.Диски. 2. Статус.xml"

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE KrusaderUserActions>
<KrusaderUserActions>
 <action name="yds_status">
  <title>&amp;Статус</title>
  <tooltip>Вывод текущего статуса Яндекс.Диска</tooltip>
  <category>Яндекс.Диски</category>
  <command executionmode="collect_output">yandex-disk status -c ~/.config/yandex-disk/config_%_Ask("Вывод статуса: укажите диск", "")%.cfg</command>
  <defaultshortcut>Alt+Shift+F6</defaultshortcut>
 </action>
</KrusaderUserActions>

"Krusader. Яндекс.Диски. 3. Синхронизация.xml"

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE KrusaderUserActions>
<KrusaderUserActions>
 <action name="yds_sync">
  <title>&amp;Синхронизация</title>
  <tooltip>Синхронизация компьютера с Яндекс.Диском</tooltip>
  <category>Яндекс.Диски</category>
  <command executionmode="collect_output">yandex-disk sync -c ~/.config/yandex-disk/config_%_Ask("Укажите диск для синхронизации", "")%.cfg</command>
  <defaultshortcut>Alt+Shift+F7</defaultshortcut>
 </action>
</KrusaderUserActions>

"Krusader. Яндекс.Диски. 4. Получение ссылки.xml"

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE KrusaderUserActions>
<KrusaderUserActions>
 <action name="yds_publish">
  <title>&amp;Получение ссылки</title>
  <tooltip>Получение ссылки на файл или директорию</tooltip>
  <category>Яндекс.Диски</category>
  <command executionmode="collect_output">yandex-disk publish  -c ~/.config/yandex-disk/config_%_Ask("Получение ссылки: укажите диск", "")%.cfg %aCurrent%  | xclip -selection clipboard &amp;&amp; xclip -selection clipboard -out &amp;&amp; printf "Ссылка скопирована в буфер обмена\n\r"</command>
  <defaultshortcut>Alt+Shift+F8</defaultshortcut>
 </action>
</KrusaderUserActions>

"Krusader. Яндекс.Диски. 5. Отмена публикации.xml"

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE KrusaderUserActions>
<KrusaderUserActions>
 <action name="yds_unpublish">
  <title>&amp;Отмена публикации</title>
  <tooltip>Отмена публикации файла или директории</tooltip>
  <category>Яндекс.Диски</category>
  <command executionmode="collect_output">yandex-disk unpublish  -c ~/.config/yandex-disk/config_%_Ask("Отмена публикации: укажите диск", "")%.cfg %aCurrent%  | xclip -selection clipboard &amp;&amp; xclip -selection clipboard -out</command>
  <defaultshortcut>Alt+Shift+F9</defaultshortcut>
 </action>
</KrusaderUserActions>

"Krusader. Яндекс.Диски. 6. Завершение.xml"

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE KrusaderUserActions>
<KrusaderUserActions>
 <action name="yds_stop">
  <title>&amp;Завершение</title>
  <tooltip>Завершение работы Яндекс.диска</tooltip>
  <category>Яндекс.Диски</category>
  <command executionmode="collect_output">yandex-disk stop -c ~/.config/yandex-disk/config_%_Ask("Завершение работы: укажите диск", "")%.cfg</command>
  <defaultshortcut>Alt+Shift+F10</defaultshortcut>
 </action>
</KrusaderUserActions>

Переходим в Krusader: "Настройка" --> "Настроить Krusader" --> "Меню пользователя" --> "Запустить менеджер действий":

Нажимаем слева вверху значок "Загрузить действие" и выбираем для загрузки последовательно плагины в соответствии с тем, как они пронумерованы (в таком порядке они будут появляться в контекстном меню Krudaser'а): "Krusader. Яндекс.Диск. 1. Запуск.xml", "Krusader. Яндекс.Диск. 2. Статус.xml"... и т.д.

В результате загрузки плагинов в "Менеджере действий" появится новый пункт "Яндекс.Диски", в котором будут присутствовать подпункты "&Завершение", "&Запуск", ... и т.д.:

Нажимая последовательно на подпункты, можно ознакомиться с тем, какие для отдельных действий с Яндекс.Диском назначены по умолчанию комбинации клавиш:

  • Запуск -- Alt-Shift-F5

  • Статус -- Alt-Shift-F6

  • Синхронизация -- Alt-Shift-F7

  • Получение ссылки -- Alt-Shift-F8

  • Отмена публикации -- Alt-Shift-F9

  • Завершение -- Alt-Shift-F10

Если эти комбинации по какой-то причине не подходят, прямо здесь, в "Менеджере действий", их можно заменить на другие.

Закрываем "Менеджер действий" и убеждаемся в том, что теперь указанные действия с Яндекс.Диском доступны как из основного меню Krusader: Меню --> Действия --> Яндекс.Диск, так и из контекстного меню (выставляем на файле или директории и нажимаем правую клавишу мыши --> Меню пользователя --> Яндекс.Диск).

Убедимся в работоспособности графического интерфейса.

Запуск -- Ctrl-Shift-F5: в отдельном запрашивает идентификатор диска (в нашем примере -- это 1), запускает демон и выводит информацию об этом в другом окне. Планка Krusader может находится в любом месте файловой системы, а не только в пределах основной директории запускаемого Яндекс.Диска:

Если демон уже запущен, сообщает об этом:

Статус -- Ctrl-Shift-F6: в отдельном запрашивает идентификатор диска, выводит информацию о статусе Яндекс.Диска. Планка Krusader может находится в любом месте файловой системы, а не только в пределах основной директории Яндекс.Диска:

Синхронизация -- Ctrl-Shift-F7: в отдельном запрашивает идентификатор диска, запускает синхронизацию или сообщает о том, что она уже произведена автоматически. Планка Krusader может находится в любом месте файловой системы, а не только в пределах основной директории Яндекс.Диска:

Получение ссылки -- Ctrl-Shift-F8: для использования данной функции необходимо поставить планку Krusader на тот файл или на ту директорию, которую следует опубликовать. При публикации директории по ссылке стороннему пользователю будут доступны в ней все файлы и все поддиректории. Идет запрос на идентификатор Яндекс.Диска, потом выводится информация в отдельном окне, а ссылка на файл или директорию при этом копируется в буфер обмена:

Если планка стоит на файле / директории, которые не находятся в одной из поддиректорий основной директории используемого Яндекс.Диска, то данный файл или директория будут вначале полностью скопированы в основную директорию используемого Яндекс.Диска, а потом на данную копию будет сделана ссылка. В ряде случаев это удобно.

Отмена публикации -- Ctrl-Shift-F9: аналогично предыдущему случаю, планка Krusader ставится на файл или директорию, которые уже были опубликованы (для них были созданы публичные ссылки). После выполнения данной операции доступ к ним для сторонних лиц будет закрыт:

Завершение -- Ctrl-Shift-F10: завершает работу демона и выводит сообщение (планка Krusader может находится в любом месте файловой системы, а не только в пределах основной директории Яндекс.Диска):

Заключение

Установка и настройка графического интерфейса для Яндекс.Диска на компьютере с ОС GNU/Linux требует запуска двух исполняемых скриптов (из-под рута и из-под обычного пользователя), а также шести файлов, которые являются плагинами для файл-менеджера Krusader. Если пользователь регулярно использует Яндекс.Диск, то данные восемь файлов имеет смысл сохранить в отдельной директории и использовать впоследствии многократно.

Желаемый результат по установке и настройке на новом компьютере занимает всего несколько минут. В то же время наличие графического интерфейса, горячих клавиш и вывод информационных сообщений делает работу с Яндекс.Диском в GNU/Lunux эффективной и приятной.

Комментарии (5)


  1. zxosa
    21.09.2021 05:02

    Webdav покрывает, а клиент в линуксе не может работать в upload, только синхронизация


    1. Vadiok
      21.09.2021 09:48

      Формально webdav работает, но, как минимум, на бесплатном тарифе загрузить через него можно только какие-то мелкие текстовые файлы, скорость на аплоад крайне низкая.


    1. Dmitry_Yurevich Автор
      21.09.2021 16:22

      Конечно, спасибо за замечание. Консольный клиент Яндекс.Диска в GNU/Linux'е работает только в режиме синхронизации, это его особенность. Есть опция "--exclude-dirs=DIR1,DIR2,...", но она позволяет исключить из синхронизации лишь директории целиком. В тех задачах, где востребован режим синхронизации, скорость и стабильность консольного клиента нареканий не вызывают.


  1. insecto
    21.09.2021 07:49

    Статья про настройку чего-то в линуксе скриншотами. Последние времена настают!


    1. LinuxCertifiedInstructor
      22.09.2021 14:03

      Нормальная статья (получше многих переводных на Хабре, а тут человек сам поразбирался и всё понятно описал) — настраивал видно что текстовым редактором, а скриншоты только демонстрирую работу настроек.

      P.S. Смущает директория «Свт.Николай» на скриншотах)