Untuk menghadapi nama file sewenang-wenang (termasuk yang mengandung karakter newline), yang trik yang biasa adalah untuk menemukan file di dalam .//.
bukan .
. Karena //
biasanya tidak dapat terjadi saat melintasi pohon direktori, Anda yakin bahwa //
sinyal awal nama file baru di find
(atau di sini lsattr -R
) output.
lsattr -R .//. | awk '
function process() {
i = index(record, " ")
if (i && index(substr(record,1,i), "i"))
print substr(record, i+4)
}
{
if (/\/\//) {
process()
record=$0
} else {
record = record "\n" $0
}
}
END{process()}'
Perhatikan bahwa output masih akan dipisahkan baris baru. Jika Anda perlu mengolahnya, Anda harus menyesuaikannya. Misalnya, Anda bisa menambahkan -v ORS='\0'
agar dapat memberinya makan ke GNU xargs -r0
.
Juga perhatikan bahwa lsattr -R
(setidaknya 1,42.13) tidak dapat melaporkan flag file yang jalurnya lebih besar dari PATH_MAX (biasanya 4096), sehingga seseorang dapat menyembunyikan file yang tidak dapat diubah tersebut dengan memindahkan direktori induknya (atau komponen jalur mana pun yang mengarah ke itu, kecuali dirinya sendiri karena tidak dapat diubah) ke dalam direktori yang sangat dalam.
Pekerjaan di sekitar akan digunakan find
dengan -execdir
:
find . -execdir sh -c '
a=$(lsattr -d "$1") &&
case ${a%% *} in
(*i*) ;;
(*) false
esac' sh {} \; -print0
Sekarang, dengan -print0
, itu pasca-proses, tetapi jika Anda berniat untuk melakukan apa pun dengan jalur tersebut, perhatikan bahwa setiap panggilan sistem pada jalur file yang lebih besar dari PATH_MAX akan tetap gagal dan komponen direktori bisa diganti namanya dalam interval tersebut.
Jika kita ingin mendapatkan laporan yang dapat diandalkan tentang pohon direktori yang berpotensi dapat ditulis oleh orang lain, ada beberapa masalah yang melekat pada lsattr
perintah itu sendiri yang perlu kita sebutkan:
- cara
lsattr -R .
melintasi pohon direktori, itu tergantung pada kondisi balapan. Orang dapat membuatnya turun ke direktori di luar pohon direktori yang dirutekan .
dengan mengganti beberapa direktori dengan symlink pada saat yang tepat.
- bahkan
lsattr -d file
memiliki kondisi balapan. Atribut tersebut hanya berlaku untuk file atau direktori biasa. Begitu lsattr
juga yang lstat()
pertama untuk memeriksa bahwa file tersebut dari jenis yang tepat dan kemudian open()
diikuti oleh ioctl()
untuk mengambil atribut. Tapi itu panggilan open()
tanpa O_NOFOLLOW
(atau O_NOCTTY). Seseorang dapat mengganti file
dengan symlink /dev/watchdog
misalnya antara lstat()
dan open()
dan menyebabkan sistem reboot. Itu harus dilakukan open(O_PATH|O_NOFOLLOW)
diikuti oleh fstat()
, openat()
dan di ioctl()
sini untuk menghindari kondisi balapan.