
Я использую сценарий expect для автоматизации передачи некоторых файлов поддержки на терминалы. Файлы поддержки автоматически архивируются в tarball перед отправкой на целевой терминал с помощью scp. Это выполняется внутренней программой expect, которая автоматически заполняет пароль для scp, поэтому нам не нужно вводить пароль. Я могу копировать отдельные файлы без проблем, но когда я пытаюсь скопировать файл tar.gz, он изменяет разрешения для каталога /tmp. Я устанавливал chmodding для каталога /tmp обратно на 1777 для разрешений и chowning для root.root, как это обычно и делается, но это не всегда работает. Это вызывает ошибки sqlite из-за того, что sqlite не может записать временный файл в /tmp, что очень мешает. Как мне определить точную причину этого? Я знаю, что это должно быть связано с файлом tar.gz, но у меня было впечатление, что tar сохранит разрешения для файла.
разрешения на файл в моем каталоге следующие:
-rw-rw-r-- 1 aembree aembree 88K Oct 2 15:20 dropin.tar.gz
Перед передачей /tmp выглядит так в ls -al:
drwxrwxrwt 15 root root 8.4K Oct 2 15:08 tmp
После переноса /tmp выглядит так:
drwxrwxr-x 15 10539 10539 8.4K Oct 2 15:01 tmp
Выполняется следующая команда tar:
tar -vPczf /home/aembree/bin/resources/dev/dropin.tar.gz --exclude='helperscript' -C $dropinlist . > /home/aembree/bin/resources/logs/tarlog
Как только файл окажется на удаленной машине, expect выполнит следующую команду для его распаковки:
send "cd /tmp ; tar -xzf dropin.tar.gz ; rm dropin.tar.gz ; cd ;\n"
решение1
Вы включили .
в свою исходную коллекцию, указанную в tar
. Проблема возникает, когда вы извлекаете tarball и применяются разрешения. Ваш исходный каталог .
извлекается и применяются разрешения. К сожалению, в точке извлечения .
фактически находится /tmp
.
Исправление — либо исключить .
из tarball, либо создать временный каталог внутри, /tmp
в который все это извлечь.