Подготовленный в Microsoft deb-пакет с Open R принудительно заменяет /bin/sh на bash
Компания Microsoft опубликовала deb-пакет (microsoft-r-open-mro-3.5.0) с инструментарием Open R (вариант языка R от Microsoft) для Debian и Ubuntu, в установочном сценарии которого обнаружена серия недопустимых оплошностей. В частности, скрипт настройки, вызываемый после установки пакета (postinstall), удаляет /bin/sh, после чего создаёт символическую ссылку /bin/sh на /bin/bash. Если в системе нет /bin/bash то /bin/sh остаётся удалённым и пользователь получает неработающее окружение.
Примечательно, что на идентичный код удаления /bin/sh в RPM-пакетах пользователи обращали внимание ещё в 2016 году. В то время проблема осталась нерешённой, а представитель Microsoft лишь пояснил, что /bin/sh заменяется, так как в Ubuntu в качестве shell по умолчанию применяется dash, а shell-обвязка над Microsoft R Server может работать только в bash. На этот раз критика не осталась без внимания и инженеры из Microsoft обновили deb- и rpm-пакеты, удалив в скрипте postinstall строки замены /bin/sh, вместо которых задействованы dpkg-divert для DEB и update-alternatives для RPM.
#!/bin/bash #TODO: Avoid hard code VERSION number in all scripts VERSION=`echo $DPKG_MAINTSCRIPT_PACKAGE | sed 's/[[:alpha:]|(|[:space:]]//g' | sed 's/\-*//' | awk -F. '{print $1 "." $2 "." $3}'` INSTALL_PREFIX="/opt/microsoft/ropen/${VERSION}" echo $VERSION ln -s "${INSTALL_PREFIX}/lib64/R/bin/R" /usr/bin/R ln -s "${INSTALL_PREFIX}/lib64/R/bin/Rscript" /usr/bin/Rscript rm /bin/sh ln -s /bin/bash /bin/sh
Кроме того, в скриптах есть и другие ошибки, например, в случае наличия уже установленного оригинального R, установочный скрипт завершается ошибкой, а в случае удаления пакета Microsoft удаляет за одним и исполняемые файлы оригинального R (/usr/bin/R, /usr/bin/Rscript). Скрипт prerm:
#!/bin/bash VERSION=`echo $DPKG_MAINTSCRIPT_PACKAGE | sed 's/[[:alpha:]|(|[:space:]]//g' | sed 's/\-*//' | awk -F. '{print $1 "." $2 "." $3}'` INSTALL_PREFIX="/opt/microsoft/ropen/${VERSION}/" rm /usr/bin/R rm /usr/bin/Rscript rm -rf "${INSTALL_PREFIX}/lib64/R/backup"
© OpenNet