Sudo'ya kök yerine oluşturulan dosyaların kullanıcı adımı sahip olarak ayarlamasını söylemenin bir yolu var mı?


19

Bunu yaparsam sudo cp /etc/foo.txt ~/foo.txt, yeni dosya rootsahibi olarak oluşturulur .

Şu anda, son iki komutu kullanmaktan başka bir yol göremiyorum ( lsuse-case'i netleştirmek için):

belmin@server1$ ls /etc/foo.txt
>  -rw------- 1 root root 3848 Mar  6 20:35 /etc/foo.txt
>
belmin@server1$ sudo cp /etc/foo.txt ~/foo.txt
belmin@server1$ sudo chown belmin: $_

Tercih ederim:

  1. Tek bir sudokomutla.
  2. Geçerli kullanıcımı belirtmek zorunda değilim (belki bir değişken mi kullanıyorsunuz?).

sudo cat /etc/foo.txt > ~/foo.txt. Dosyalar yalnızca bir nedenden ötürü kök tarafından okunabilir olma eğilimindedir, bu nedenle kopyaları kök olmayan kullanıcılar tarafından okunabilir hale getirirken bu nedenle aklınızda bulundurmayı unutmayın.
jw013

Yanıtlar:



14

Bir ile POSIX uyumlucp yapabilirsiniz sudo cp -p foo bariçin aşağıdaki dosya meta verileri korumak kopyalarken:

  • Erişim zamanı
  • Değiştirme zamanı
  • Kullanıcı kimliği
  • Grup kimliği
  • kip

Farklı bir kullanıcı ayarlamak istiyorsanız JennyD'nin çözümü en iyisidir.


2
Bu yalnızca orijinal dosya hedef kullanıcıya ait olduğunda çalışır.
Jenny D

4
Sudo çalıştıran kişinin orijinal dosyanın sahibi olmadığını, aksi halde sudo kullanmaları gerekmeyeceğini düşünüyorum.
EightBitTony

@EightBitTony Sahip olmadığınız sudobir dosyayı kopyalamanız gerekmez. Sonuçta, sadece okuma erişimine ihtiyacınız var .
l0b0

Evet, benim açımdan mistype - ama yine de sudo'ya ihtiyaç duymayacakları için söz konusu kullanıcı kimliğinin dosyayı da okuyamayacağını varsayıyorum. Bu nedenle, son dosyanın sahibi olması amaçlanan kullanıcı kimliğinin orijinal dosyaya erişimi olmadığını varsayalım. Her iki durumda da, bu bir sudo 'sorunu' değil. Cevabınız, bir sahibin korunmasının istenmediğini varsaymamız gerektiğini gösteriyor.
EightBitTony

2
Teorik olarak dosyanın hedef kullanıcıya ait olması, ancak hedef kullanıcının girme izninin olmadığı bir dizinde bulunması mümkündür. Ama pek olası değil :-)
Jenny D

8

Yaparsan:

sudo cat /etc/foo.txt > ~/foo.txt

Daha sonra ~/foo.txtkabuk tarafından sizin tarafınızdan (kimlik bilgilerinizle oluşturulan şekilde) sudoaçılacak ve daha sonra stdout'u ona yönlendirilmiş olarak yürütülecektir.

Sonunda, dosya size ait olacaktır.

Bu tür bir yaklaşım, yapılan şeyleri sınırlamaya da yardımcı olur root. Burada, rootsadece ayrıcalığını açmak için kullanır /etc/foo.txt, potansiyel olarak zararlı olan şeyi yapmaz (yazmak için bir dosya açın, ~/foo.txtörneğin bir symlink ise kötü sonuçlar doğurabilir ).


2
Bu, kullanıcının hedef dizine yazabileceğini varsayar.
Johan

3

Düğmesini kullanarak sudobaşka bir kullanıcıya geçersiniz. Komutanın bütün mesele bu. İlk dosyaya düzenli erişiminizin olmadığını varsayalım, bu yüzden erişim elde etmek için başka bir kullanıcı ( rootbu durumda) olmanız gerekir .

Tek sudobaşına bunu yönetmenin bir yolu yoktur , çünkü tek sudoyapmanız gereken sizi komutu yürütmek için diğer kullanıcıya geçirmektir.

İhtiyacın olacak

  1. iki komut (veya bir bileşik komut) kullanmaya devam et
  2. başka bir komut bul (başka bir cevapta görülen install gibi)
  3. veya bir komut dosyası yazın ve bu komut dosyasını kullanarak çalıştırın sudo.

1

Sudo, oturum açan kullanıcıyı (aslında Sudo'yu çalıştıran) bulmak için kullanabileceğiniz bir ortam değişkeni "SUDO_USER" oluşturur.

Sudo'nun kök saldığını varsayarsak (diğer kullanıcılara erişmek için Sudo'yu kullanmak mümkündür), aşağıdaki iki adımı otomatikleştirmek için bir komut dosyası yazabilirsiniz.

cp source target
chown $SUDO_USER target

(Yalnızca kök dosyaları dağıtabileceğinden, kök olmayan bir kullanıcıya sudo uygularsanız bu çalışmaz.)

Otomatikleştirmek biraz iş olacak. Kaynak tek bir dosyaysa ve hedef bir dizin değilse, işiniz yapılır. Soruyu sorduğunuzu varsayıyorum, çünkü sorun sadece daha karmaşık durumlarda gerçek bir sorun, örn.

cp /path/source/some*files /path/target/directory/

Hangi dosyaların ve hangi dizinlerin geçildiğini, hangilerinin önceden var olduğunu, hangilerinin üzerine yazıldığını ve yalnızca başarıyla kopyalanan dosyaların sahipliğini değiştirmek için karmaşık bir komut dosyası yazılabilir.

Bu iş zaten yapıldı. cpioŞunu kullanabilirsiniz - Kökten sudo'ya sonra, dosyaları kopyalamak için cpio kullanın. cpio'nun kopyalanacak dosyaların bir listesine ihtiyacı vardır, bu yüzden iki adımlı bir işlemdir. Aşağıda lskopyalanacak dosyaların listesini oluşturmak için kullanıyorum .

ls /path/source/some*files | cpio -pdm --owner $SUDO_USER /path/target/directory/

-pdmVasıta "Geçiş modu, dosya değişiklik zamanları gerektiği gibi dizinleri oluşturma koruyun"

--owner $SUDO_USER" belirtilen kullanıcının dosyalara sahip olmasına neden olur.

Son işlenen, cpio'nun dosyaları depolaması gereken dizindir.

Cpio awesomeness hakkında daha fazla bilgi edinmek için buradaki CPIO kılavuz sayfasına gidin

Bunu tek bir sudo komutuyla yapmak da mümkündür. Kullanıcılarınızın dosyalara erişim haklarına sahip olduğunu varsayarsak, sudo dosyasını yalnızca cpio bölümü için kullanın, örneğin:

ls /path/source/some*files | cpio -pdm --owner $USER /path/target/directory/

Yukarıdaki durumda $ SUDO_USER yerine $ USER kullanıyorum çünkü Sudo çalıştırılmadan önce değerlendiriliyor. Alternatif olarak, kullanıcının dosyaları listeleme erişimi yoksa, bir sarmalayıcı komut dosyasına yerleştirin ve sarmalayıcıyı çalıştırmak için sudo kullanın. Bu zorlaşabilir, ancak en basit durumda Sarıcı iki argüman alır: bir kaynak ve bir hedef.

Bu "cp_as_user" sarmalayıcısına gider:

ls $1 | cpio -pdm --owner $SUDO_USER $2

Ardından sargıyı şu şekilde kullanın:

sudo cp_as_user "/ path / to / bazı * dosyalar" / path / to / target / dizin

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.