Saya menulis aplikasi kompilasi reguler yang perlu membuat file khusus dan menulis cookie ajaib ke dalamnya. Saya tidak bisa menulis file langsung dari aplikasi, model keamanan sistem mengharuskan saya untuk meluncurkan alat bantu dengan hak istimewa untuk melakukan trik. Saya dapat menyediakan sejumlah argumen ke alat bantu. Sekarang saya ingin memilih beberapa perintah sistem yang sangat sederhana yang akan berfungsi sebagai alat bantu dan membuat file untuk saya. Sesuatu seperti ini:
/bin/sh -c "/bin/echo -n 'magic' > /some/where/file"
Sederhana touch
tidak memotongnya karena saya perlu menulis cookie ke dalam file, sederhana echo
tanpa pembungkus shell tidak berfungsi karena perlu pengalihan untuk menulis file. Saya tidak merasa nyaman memanggil shell dengan root privilege untuk melakukan tugas sepele seperti itu. Apakah ada beberapa perintah sistem yang sangat sederhana dan terbatas yang dapat saya panggil untuk menulis file untuk saya?
/bin/sh -c 'echo magic > /path/to/magic/file'
tidak berhasil? Itu akan menjadi file yang dapat dieksekusi dan dua argumen. Anda perlu membuat argumen terakhir sebagai string (dengan sprintf atau yang setara). Apakah ada alasan mengapa ini tidak berhasil untuk Anda? Dari pertanyaan Anda, itu terdengar seperti doCommandAsRoot () tidak mengambil input untuk streaming ke perintah, benar? Kalau tidak, Anda bisa mengganti argumen terakhir dengan'cat > /path/to/magic/file'
dan meneruskan data alih-alih membangun string.tee
. Terima kasih!Jawaban:
Bagaimana dengan ini:
Tentu ada pengalihan dalam hal ini tetapi tee hanya berjalan sebagai root bukan shell. Bekerja dengan
dd of=...
terlalu.sumber
doCommandAsRoot
). Dan fungsi ini hanya menerima jalur ke perintah dan argumennya, jadi tidak ada cara bagi saya untuk menggunakan pengalihan output segera. Saya bisa melalui shell (seperti yang ditunjukkan dalam pertanyaan), tapi saya tidak suka keamanannya.doCommandAsRoot("dd", "if=/tmp/unprotected_file", "of=/some/where/file")
.dd
contoh adalah cukup dekat dengan apa yang saya inginkan, terima kasih. Bisakah Anda memikirkan sesuatu yang lebih sederhana?cp
ataumv
bukandd
.Tanpa redirect output, tanpa pipa, tetapi dengan "di sini string":
sumber
status=none
akan menekan semua output lain dari versi modern GNU coreutilsdd
.Ada pertimbangan lain, yaitu Anda tidak ingin meletakkan nilai cookie ajaib di baris perintah, karena itu dapat diamati oleh pengguna lain. Bahkan jika program ini berumur pendek (termasuk jika program nol keluar dari string baris perintah), ada peluang untuk menyerang. Jadi, teori:
adalah pendekatan yang berbahaya. Oleh karena itu, saya mendukung saran @ stribika: tulis nilai ke file sementara dan salin ke tempatnya. Pastikan untuk menggunakan fungsi aman untuk membuat file sementara (
mkstemp()
) sehingga tidak ada kondisi balapan di sana.sumber
spons dari moreutils - menyerap input standar dan menulis ke file:
Tidak seperti pengalihan shell, spons menyerap semua inputnya sebelum menulis file output. Jika memungkinkan, spons membuat atau memperbarui file output secara atomis dengan mengganti nama file temp ke tempatnya.
Lihat lebih lanjut
sumber