Разверните и выполните что-нибудь с Java в UNIX

У меня есть процесс Java (демон), который работает. Этот процесс используется как услуга. С помощью этого сервиса я могу загрузить подписанный zip-архив с доверенного сервера. После того, как я распаковал ZIP-архив, я хочу запустить двоичный файл в «распакованной» папке.

Проблема в том, что этот двоичный файл не является исполняемым (в его файловом режиме нет «x») ... Я знаю, что его можно установить с помощью Java, но мне нужен общий способ.

Есть ли у вас какие-либо идеи, как сделать развертывание красивым способом?

(Да, это должна быть Java)

В основном я хочу восстановить биты файлового режима Unix после распаковки ZIP-архива. Есть ли Java Lib, которая может это сделать?


person alexvetter    schedule 01.03.2012    source источник
comment
Что вы подразумеваете под хорошим способом? Если у вас есть контроль над файлами, попадающими в архив, просто убедитесь, что бинарный файл имеет правильные режимы, прежде чем упаковывать его.   -  person Perception    schedule 01.03.2012
comment
@Perception: не все zip-компрессоры поддерживают сохранение битов файлового режима Unix. И не все zip декомпрессоры поддерживают его восстановление...   -  person thkala    schedule 01.03.2012
comment
@thkala Это то, что мне нужно. Есть ли Java Lib, которая может это сделать?   -  person alexvetter    schedule 01.03.2012
comment
@alexvetter: я не знаю ни одной библиотеки Java Zip, поддерживающей разрешения Unix. Существует по крайней мере один связанный вопрос SO здесь.   -  person thkala    schedule 01.03.2012
comment
Хм, очевидно, TrueZip изначально поддерживает расширенные атрибуты файла, но он не кажется полным до такой степени, что его можно использовать для разрешений Unix...   -  person thkala    schedule 01.03.2012


Ответы (2)


Вы можете легко вызовите команду chmod из вашего Java-приложения, чтобы добавить это отсутствует x бит. chmod является стандартным для Unix, как и сам исполняемый бит (x).

Или вы можете сделать это прямо из Java.

Если вы хотите, чтобы исполняемый бит оставался установленным при распаковке, вам, вероятно, не следует использовать библиотеки распаковки Java. Попробуйте использовать команду Unix unzip для распаковки архива — она поддерживает сохранение и восстановление файлов Unix. биты файлового режима в течение довольно долгого времени. Если у вашего поставщика Unix его нет, вы можете получить его из источника.

person thkala    schedule 01.03.2012
comment
Извините, вы не помогаете. Я могу установить исполняемый флаг прямо из Java. Я не знаю обо всех двоичных файлах, поэтому не могу установить флаг. Лучше всего было бы распаковать архив, а флаги уже установлены. - person alexvetter; 01.03.2012
comment
'unzip -X' сохраняет GID/UID. Проблема в том, что jarsigner (инструмент, который я использую для подписи) не сохраняет флаги. Так что из коробки работать не будет. Я думаю о добавлении метаинформационного файла, который содержит все исполняемые файлы. 'найти . -executable -type f' может помочь с этим. - person alexvetter; 02.03.2012
comment
@alexvetter: так что к тому времени, когда ваше приложение получит архив, исполняемые биты уже потеряны :-/ - person thkala; 02.03.2012
comment
ZipArchiveEntry Apache Commons Compress имеет метод getExternalAttributes(). С его помощью вы можете получить флаги (777) (вы должны преобразовать длинное представление в восьмеричное). Но в любом случае, как я уже сказал, это не сработает для меня (проблема с jarsigner). Если дело доходит до обычного zip-файла, ваш ответ будет лучшим. - person alexvetter; 02.03.2012
comment
Я собираюсь реализовать другой способ убедиться, что zip-файлы не были изменены. - person alexvetter; 02.03.2012

Если вы упаковываете свои файлы с помощью tar, а затем, при необходимости, сжимаете, ваши разрешения сохраняются такими, какими они были до упаковки. Используйте --preserve-permissions при распаковке.

person Erik Ekman    schedule 01.03.2012