На Ваш вопрос трудно ответить точно, потому что Вы не сказали, что соединяет каналом, Вы являетесь передающими демону, и Вы не указали полномочия ~agent
. Если Вы запускаете демона в ~agent/incoming
каталог и передача это относительные пути, затем так как демон находится в automaton
группа, которую это сможет считать, пишут и удаляют файлы в ~agent/incoming
каталог.
Я предполагаю то, что происходит:
~agent
каталог не является исполняемым файлом демону.~agent
как компонент (говорят, это - полный путь).Когда процесс доступы /home/agent/incoming/foo
, это должно иметь полномочия выполнения на всех каталогах, которые пересечены: /
, /home
, /home/agent
и /home/agent/incoming
(больше, если некоторые из них являются символьными ссылками).
Если доступы демона foo
в то время как его текущий каталог ~agent/incoming
, это только должно иметь полномочия выполнения на текущем каталоге (~agent/incoming
) самостоятельно. Необходимо удаться сделать тот каталог текущим; chdir
требует, чтобы процесс имел доступ к целевому каталогу. Это возможно, если Вы сначала изменяетесь на желаемый каталог при выполнении, как (говорят) agent
пользователь, затем выполняет что-то как su daemon -c daemon-command
.
GNU coreutils cp
работы, потому что это было записано тот путь. Запись в блочные устройства не является сложной, это - по существу та же операция как пишущий в регулярный файл.
Однако Вы не должны использовать cp
тот путь. Можно сделать это, если Вы уверены, что это - GNU coreutils, который работает. Но существуют другие ароматы cp
вокруг, например busybox cp
не поддерживает запись в устройства вообще; это удаляет связь (удаляет) узел устройства и создает новый файл в его месте вместо этого.
dd
более безопасно в том отношении. Это было сделано для записи в устройства и приносит инструменты (бакалавр наук, ищите, пропустите, рассчитайте...), Вам часто нужно при контакте с устройствами. Это должно сделать ожидаемую вещь во всех ароматах dd
.
Ваше ожидание отличается от программы / проектирование системы. Что мы скажем об этом?:-)
"Все - файл"...
Вы могли прокрутить CP и/или dd strace -e trace=open
и будет видеть, что syscall является тем же и для регулярных файлов и для блочных устройств. Если syscall не говорит им независимо, почему CP должно заботиться?
cp
, dd
или даже cat
(и вероятно несколько других команд).
– Hennes
17.04.2013, 14:49
dd
взят для этого, потому что это более гибко. cp
может скопировать целые "файлы" только.
– Hauke Laging
17.04.2013, 14:53
< /dev/sdb1 > ~/disk.iso
.
–
18.04.2013, 03:40
Хорошо насколько я знаю, все это cp
делает
С нормальными файлами это может привести к также
Теперь/dev/mapper /* являются блочными устройствами (или быть определенными, символьными ссылками на блочные устройства). У этого действительно есть статические размеры файла. Поэтому, если Вы открываете те файлы, каждого write()
вызов просто перезапишет n байты конечного файла, который Вы отправили в него (предполагающий, что существует нет fseek()
звоните где угодно).
Так, давайте запишем CP нашего собственного плохого человека:
#include <stdlib.h>
#include <stdio.h>
void usage() {fprintf(stderr, "Usage: cp <srcFile> <tgtFile>\n"); exit(1);}
void error(const char *msg) {fprintf(stderr, "Error: %s\n", msg); exit(2);}
void printPosAndSize(FILE *f) {
off_t curPos = ftello(f);
fseeko(f, 0, SEEK_END);
off_t size = ftell(f);
fseeko(f, curPos, SEEK_SET);
printf("Pos: %llu,\tSize: %llu\n", curPos, size);
}
int main(int argc, const char *argv[]) {
if (argc != 3) usage();
const char *srcPath = argv[1];
const char *tgtPath = argv[2];
FILE *inFile = fopen(srcPath, "rb");
FILE *outFile = fopen(tgtPath, "wb");
printf("inFile: %s, outfile: %s\n", srcPath, tgtPath);
if (!inFile) error("Couldn't open source file!");
if (!outFile) error("Couldn't open target file!");
while (!feof(inFile)) {
char buff[2048];
size_t count = fread(buff, 1, sizeof(buff), inFile);
fwrite(buff, 1, count, outFile);
printPosAndSize(outFile);
}
fclose(inFile);
fclose(outFile);
return 0;
}
Это CP запишет 2 048-байтовые блоки от file1 до file2. Если Вы просто скопируете регулярные файлы, то вывод будет похож на это:
# copying to new file:
$ sudo ./cp /var/log/syslog /tmp/foo.txt
inFile: /var/log/syslog, outfile: /tmp/foo.txt
Pos: 2048, Size: 2048
Pos: 4096, Size: 4096
Pos: 4949, Size: 4949
# overwriting existing file:
$ sudo ./cp /var/log/syslog /tmp/foo.txt
inFile: /var/log/syslog, outfile: /tmp/foo.txt
Pos: 2048, Size: 2048
Pos: 4096, Size: 4096
Pos: 4949, Size: 4949
Я выполняю его дважды, чтобы показать Вам, что не имеет значения, если конечный файл существовал прежде, чем открыть его в режиме записи. Как только Вы пишете в него, его содержание полностью перезаписывается, и размер файла отражает это.
Так, давайте попробуем что-то другое: $ sudo./cp/var/log/syslog/dev/null inFile:/var/log/syslog, outfile:/dev/null На месте продажи: 0, Размер: 0 На месте продажи: 2048, Размер: 0 На месте продажи: 974, Размер: 0
/dev/null
устройство посимвольного ввода-вывода. У этого всегда есть размер 0. Вывод просто пишут в них (например, в последовательный порт) и забывают впоследствии.
Но давайте доберемся до Вашего вопроса: Что происходит, если Вы пишете в блочное устройство (Осторожность! Выполнение этого сделает все данные по устройству нечитабельными, поскольку это уничтожает метаинформацию диска! Я использовал старую Карту памяти для этой демонстрации),
$ sudo ./cp /var/log/syslog /dev/sdb
inFile: /var/log/syslog, outfile: /dev/sdb
Pos: 2048, Size: 2003828736
Pos: 4096, Size: 2003828736
Pos: 5306, Size: 2003828736
Файл блока просто открыт в положении 0 и перезаписанном байте байтом (не касаясь всех других данных).
cat image.bin > /dev/mapper/loop0p1
в busybox? – jdh8 10.02.2017, 19:52