Menulis ke file tanpa pengalihan?

12

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 touchtidak memotongnya karena saya perlu menulis cookie ke dalam file, sederhana echotanpa 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?

zoul
sumber
Apakah ada alasan mengapa /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.
Arcege
Contoh shell berfungsi, tapi saya benci menyebut shell dengan hak akses root hanya untuk membuat file sederhana. Perpustakaan tidak mengambil argumen pipa komunikasi (itu AuthorizationExecuteWithPrivileges ), yang dapat digunakan untuk menulis cookie menggunakan tee. Terima kasih!
zoul

Jawaban:

11

Bagaimana dengan ini:

echo -n 'magic' | sudo tee /some/where/file > /dev/null

Tentu ada pengalihan dalam hal ini tetapi tee hanya berjalan sebagai root bukan shell. Bekerja dengan dd of=...terlalu.

stribika
sumber
2
Maaf, saya jelas-jelas mengalami kesulitan menjelaskan diri sendiri akhir-akhir ini. Masalahnya adalah ketika saya ingin menjalankan sesuatu dengan privilege yang ditinggikan, saya harus melalui panggilan perpustakaan khusus (sesuatu seperti 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.
zoul
@ Zoul: Saya pikir Anda sedang menulis skrip shell. Apakah boleh menulis cookie ajaib ke file yang dapat diakses untuk proses yang tidak terjangkau? Jika sudah maka tulis ke file dan panggilan seperti itu doCommandAsRoot("dd", "if=/tmp/unprotected_file", "of=/some/where/file").
stribika
Tidak, ini adalah aplikasi yang dikompilasi secara teratur (pertanyaan diperbarui). Saya hanya mencari perintah "shell" untuk berfungsi sebagai penolong sehingga saya tidak harus menulisnya sendiri. Ya, cookie itu tidak sensitif. The ddcontoh adalah cukup dekat dengan apa yang saya inginkan, terima kasih. Bisakah Anda memikirkan sesuatu yang lebih sederhana?
zoul
Tentu - Anda bisa menggunakan cpatau mvbukan dd.
mattdm
Maksud saya lebih sederhana karena tanpa perlu menyalin :)
zoul
9

Tanpa redirect output, tanpa pipa, tetapi dengan "di sini string":

dd of=/some/where/file <<<'magic'
Rainer Perske
sumber
Satu kelemahan dari pendekatan ini adalah menulis beberapa statistik ke stdout. Anda dapat menggunakan> / dev / null untuk menyembunyikannya, tetapi pada saat itu Anda sebaiknya menggunakan tee.
studgeek
1
Ini bekerja untuk saya dalam situasi yang tidak biasa di mana saya tidak bisa menggunakan redirection atau pipa keluaran. status=noneakan menekan semua output lain dari versi modern GNU coreutils dd.
Michael Hampton
5

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:

writestringtofile 'magic' /some/where/file

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.

mattdm
sumber
Terima kasih, ini diskusi yang bermanfaat. Untungnya "kue ajaib" bukan perangkat keamanan, itu dapat dengan jelas dilihat oleh siapa pun.
zoul
0

spons dari moreutils - menyerap input standar dan menulis ke file:

echo -n 'magic' | sponge /some/where/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

Ilya Murav'jov
sumber