Yeniden yönlendirmeden bir dosyaya yazılsın mı?


13

Özel bir dosya oluşturmak ve içine sihirli bir çerez yazmak için gereken düzenli bir derlenmiş uygulama yazıyorum. Dosyayı doğrudan uygulamadan yazamıyorum, sistem güvenlik modeli, hile yapmak için yükseltilmiş ayrıcalıklara sahip bir yardımcı araç başlatmamı gerektiriyor. Yardımcı araca istediğiniz sayıda argüman sağlayabilirim. Şimdi yardımcı araç olarak hizmet verecek ve dosyayı benim için yaratacak çok basit bir sistem komutu seçmek istiyorum. Bunun gibi bir şey:

/bin/sh -c "/bin/echo -n 'magic' > /some/where/file"

Basit touchben dosyasına çerez, bir basit yazmaya gerek olarak kesmek yok echodosyayı yazmak için yeniden yönlendirme ihtiyacı olarak iş yapmaz sarıcı kabuk olmadan. Böylesine önemsiz bir görevi yerine getirmek için kabuğu ayrıcalıklarla çağırmak beni rahat hissetmiyor. Dosyayı benim için yazmak için arayabileceğim gerçekten basit, kısıtlanmış bir sistem komutu var mı?


Çalışmamasının bir nedeni var mı /bin/sh -c 'echo magic > /path/to/magic/file'? Bu yürütülebilir bir dosya ve iki argüman olabilir. Son bağımsız değişkeni bir dize olarak (sprintf veya eşdeğeriyle) oluşturmanız gerekir. Bunun sizin için işe yaramamasının bir nedeni var mı? Sorunuzdan, doCommandAsRoot () komutuna akış için girdi almıyor gibi görünüyor, değil mi? Aksi takdirde, son bağımsız değişkeni değiştirebilir ve 'cat > /path/to/magic/file'bir dize oluşturmak yerine verileri iletebilirsiniz.
Arcege

Kabuk örneği çalışır, ancak basit bir dosya oluşturmak için kabuğu kök ayrıcalıklarıyla çağırmaktan nefret ederim. Kütüphane , çerezi kullanarak yazmak için kullanılabilecek bir iletişim kanalı argümanı ( AuthorizationExecuteWithPrivileges ) alır tee. Teşekkürler!
zoul

Yanıtlar:


11

Buna ne dersin:

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

Elbette bu yönlendirmeler var ama sadece tee bir kabuk değil kök olarak çalışır. İle dd of=...de çalışır .


2
Üzgünüm, son zamanlarda kendimi açıklamakta zorlanıyorum. Sorun şu ki, yükseltilmiş ayrıcalıklarla bir şey çalıştırmak istediğimde, özel bir kütüphane çağrısından (bir şey gibi doCommandAsRoot) geçmem gerekiyor . Ve bu işlev yalnızca komuta ve argümanlarına giden bir yolu kabul eder, bu yüzden çıktı yönlendirmesini hemen kullanmamın bir yolu yoktur. Kabuktan geçebilirim (soruda gösterildiği gibi), ancak güvenlik açısından hoşlanmıyorum.
zoul

@zoul: Bir kabuk senaryosu yazdığınızı sanıyordum. Sihirli çerezi ayrıcalıksız işlemler için erişilebilir bir dosyaya yazmak uygun mudur? Öyleyse, böyle bir dosyaya yazın ve arayın doCommandAsRoot("dd", "if=/tmp/unprotected_file", "of=/some/where/file").
stribika

Hayır, düzenli olarak derlenmiş bir uygulamadır (soru güncellendi). Sadece kendim yazmak zorunda kalmamam için yardımcı olarak "kabuk" komutları arıyorum. Evet, çerez hassas bir şey değil. ddÖrnek İstediğimi oldukça yakın, teşekkür ederim. Daha basit bir şey düşünebilir misiniz?
zoul

Tabii - kullanabilirsiniz cpveya mvyerine dd.
mattdm

Kopyalamaya gerek kalmadan daha basit demek istiyorum :)
zoul

9

Çıktı yönlendirmesi olmadan, boru olmadan, ancak "here string" ile:

dd of=/some/where/file <<<'magic'

Bu yaklaşımın bir dezavantajı, dd'nin stdout'a bazı istatistikler yazmasıdır. Gizlemek için> / dev / null tuşunu kullanabilirsiniz, ancak bu noktada tee de kullanabilirsiniz.
studgeek

1
Bu benim için çıkış yeniden yönlendirme veya borular kullanamayacağım alışılmadık bir durumda işe yaradı. status=noneGNU coreutils'in modern sürümlerindeki diğer tüm çıktıları bastıracaktır dd.
Michael Hampton

5

Başka bir husus daha var, bu da diğer kullanıcıların gözlemleyebileceği için sihirli çerezin değerini bir komut satırına koymak istemediğinizdir. Program kısa ömürlü olsa bile (programın komut satırı dizesini sıfırlayıp sıfırlamadığı da dahil), saldırı fırsatı vardır. Yani, teorik olarak:

writestringtofile 'magic' /some/where/file

tehlikeli bir yaklaşımdır. Bu nedenle, @ stribika'nın önerisini onaylıyorum: değeri geçici bir dosyaya yazın ve yerine kopyalayın. Geçici dosyayı ( mkstemp()) oluşturmak için güvenli bir işlev kullandığınızdan emin olun, böylece orada bir yarış koşulu da olmaz.


Teşekkür ederim, bu yararlı bir tartışma. Neyse ki "sihirli çerez" bir güvenlik aracı değildir, herkes tarafından açıkça görülebilir.
zoul

0

moreutils sünger - standart girişi ıslatın ve bir dosyaya yazın:

echo -n 'magic' | sponge /some/where/file

Kabuk yönlendirmesinden farklı olarak, sünger çıktı dosyasını yazmadan önce tüm girdilerini emer. Sünger mümkünse geçici bir dosyayı yerine yeniden adlandırarak çıktı dosyasını atomik olarak oluşturur veya güncelleştirir.

Daha fazlasını görün

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.