これは次のようになります。これしかし、straceの出力を次のファイルに保存しました。
...
3691 fcntl(2, F_GETFD) = 0
3691 access("/etc/suid-debug", F_OK) = -1 ENOENT (No such file or directory)
3691 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
3691 openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
3691 fstat(3, {st_mode=S_IFREG|0644, st_size=243756, ...}) = 0
3691 mmap(NULL, 243756, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ff0696c2000
3691 close(3) = 0
3691 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libcrypto.so.1.1", O_RDONLY|O_CLOEXEC) = 3
3691 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\t\0\0\0\0\0"..., 832) = 832
3691 fstat(3, {st_mode=S_IFREG|0644, st_size=3076960, ...}) = 0
...
パスを印刷する簡単な方法はありますか?この場合、awkを使用してパスを解析するのは簡単ではないと思いますか?
答え1
grepとsedを一緒に使用することをお勧めします。
... | grep '"/' | sed 's/^.*"\(/[^"]*\)".*$/\1/'
これはスラッシュで始まるデータ文字列からいくつかの誤検出を生成する可能性があり、リテラル二重引用符を含むパス名のために失敗する可能性があります。 。
パスパラメータを使用して、「openat」および他のシステムコールをgrepすることもできます。
... | grep -e openat -e access | sed ...
誤検知をさらに減らすため。
答え2
3番目の引数としてGNU awkを使用してくださいmatch()
。
$ awk 'match($0,/"(\/[^"]+)/,a){print a[1]}' file
/etc/suid-debug
/etc/ld.so.preload
/etc/ld.so.cache
/lib/x86_64-linux-gnu/libcrypto.so.1.1
それ以外の場合は、すべてのUnixシステムのすべてのシェルでawkを使用してください。
$ awk 'match($0,/"\/[^"]+/){print substr($0,RSTART+1,RLENGTH-1)}' file
/etc/suid-debug
/etc/ld.so.preload
/etc/ld.so.cache
/lib/x86_64-linux-gnu/libcrypto.so.1.1
答え3
次のことができます。
grep -Po '(\(|, )"\K/[^"]*'
"
またはで始まる文字以外の/
シーケンス("
を探します, "
。
これで十分です。
grep -Po '"\K/[^"]*'
"
で始まる非文字シーケンスの場合の/
後に"
。
絶対パス(で始まるパス)のみを報告します/
。彼らはそのようなルートの一部ではないことを報告することができwrite("// some C++ comment", ...)
ますwrite("foo \"/bar\" baz"...)
。
相対パスを許可するより厳密な一致を得るには、正規表現でパスパラメータを使用するすべてのシステムコールをオーバーライドする必要があります。サンプルから:
grep -Po '^\d+\s+((open|access)\(|openat\(\S+, )"\K(\\.|[^"])*'
(?!.*\) = -1)
失敗したシステムコールからパスを除外するには、正規表現に(否定予測アサーション)を追加できます。-z
//オプションとファイル関連のシステムコールのみを追跡するを参照してください--successful-only
。-e status=successful
strace
-e trace=%file