Обратите внимание, что ответ с использованием Archive::Tar
считывает архив в память. Используя модуль Python tarfile
, этого можно избежать. К сожалению, стримить с stdin
мне пока не удалось, так как extractfile
пытается искать.
#!/usr/bin/env python3
import tarfile
import sys
with tarfile.open(name=sys.argv[1], mode="r") as in_tar, \
tarfile.open(fileobj=sys.stdout.buffer, mode="w|") as out_tar:
for member in in_tar.getmembers():
member.uname = member.gname = "root"
if member.isfile():
with in_tar.extractfile(member) as file:
out_tar.addfile(member, file)
else:
out_tar.addfile(member)
Обновление:Следующая программа Go работает с потоками:
package main
import (
"archive/tar"
"io"
"log"
"os"
)
func main() {
tr := tar.NewReader(os.Stdin)
tw := tar.NewWriter(os.Stdout)
for {
hdr, err := tr.Next()
if err == io.EOF {
break
} else if err != nil {
log.Fatal(err)
}
hdr.Uname, hdr.Gname = "root", "root"
if err := tw.WriteHeader(hdr); err != nil {
log.Fatal(err)
}
if hdr.Typeflag == tar.TypeReg {
if _, err := io.Copy(tw, tr); err != nil {
log.Fatal(err)
}
}
}
if err := tw.Close(); err != nil {
log.Fatal(err)
}
}
Наконец-то ПОНЯЛ!!!!!! Наша внутренняя команда клонировала наш сервер в среду UAT, которая создала копию всех заданий / crontab и т. Д. Спасибо за всю помощь.
Если вы уверены, что cron его не запускает, -посмотрите нет ли зависшего процесса или, возможно, он есть у другого пользователя в cron (это нужно сделать от имени пользователя root ).