Да. Это возможно. Но если ваш сценарий будет длиннее, я рекомендую сделать это в других командах, используя ControlMaster
, как это делает Ansible, иначе вы потеряетесь во всех кавычках, обратных косых чертах и прочем, что вы можете увидеть в своем сообщении.
scp script1.sh remote:/tmp/
ssh remote "bash /tmp/script.sh"
и ваш script.sh
могут содержать еще один аналогичный пакет с удаленной машины на другую. Также сценарий может содержать rm /tmp/script.sh
для самоочистки.
Además de publicar -el procesamiento de la salida strace
, no hay nada disponible para ignorar las llamadas al sistema fallidas en strace
. No sería demasiado difícil de agregar, mire la función syscall_exiting_trace
ensyscall.c
.
Si prefiere seguir el ángulo de procesamiento posterior -, Ole Tange ya se ha encargado de eso por usted de una manera más completa de lo que es probable que llegue aquí :el La herramientatracefile
ejecutará strace
y filtrará la información que está buscando de una manera muy legible. Consulte Listar los archivos a los que accede un programa para obtener más detalles. Otra respuesta a esa pregunta enumera otros enfoques posibles, incluido LoggedFS que encuentro muy útil.
Otra opción es usar SystemTap ; por ejemplo
#!/usr/bin/env stap
global stored_filename, stored_path
probe syscall.open {
stored_filename = filename
}
probe syscall.open.return {
if (execname() == "cat" && $return >= 0) {
printf("opened %s\n", stored_filename)
}
}
probe syscall.openat {
stored_filename = filename
stored_path = dfd_str
}
probe syscall.openat.return {
if (execname() == "cat" && $return >= 0) {
printf("opened %s in %s\n", stored_filename, stored_path)
}
}
mostrará el nombre de cualquier archivo abierto con éxito por cualquier proceso cat
.
Возможное решение:
strace -e trace=file sleep 1 2>&1 | grep -v "= -1 ENOENT" > strace.log
strace
по умолчанию выводит на stderr
, поэтому перенаправьте его на stdout
.
Несколько более надежным шаблоном (, т.е. несколько меньшим риском случайного пропуска неправильных строк ), может быть
| grep -v "= -1 ENOENT [(]No such file or directory[)]$"
Т.е. скопируйте -вставьте конец строки, «избегая» квадратных скобок (, которые в противном случае могли бы рассматриваться как специальные символы ), и добавьте специальный символ $
в конец, который «привязывает» шаблон к концу линии.
Я не могу найти лучшего варианта в man strace
. Быстрые и грязные манипуляции с текстом — это Unix Way :-P.
Почти наверняка можно делать то, что вы хотите, с помощью пользовательского сценария gdb
. Однако это больше работы, и у меня нет готового сценария.
Другой вопрос относится к сценарию tracefile
, который можно запустить с параметром -e
. Это по-прежнему реализуется путем анализа вывода strace
, поэтому он также не кажется полностью надежным, но я думаю, возможно, вы бы предпочли его.https://gitlab.com/ole.tange/tangetools/blob/master/tracefile/tracefile