Bas komut dosyasında sudo'yu yoksay


9

Küçük bir bash betiğim var:

#!/bin/bash

touch dummy.txt

Ben bu komut dosyası ile yürütmek sudoo zaman dummy.txthangi kök korumalı olacak oluşturur .

Ne yapmak istiyorum:

Ne olursa olsun bu komut kullanılarak yürütülür olsun sudoveya normal bir kullanıcı, dosya dummy.txtgerekir değil kök korunmalıdır.


4
"Kök korumalı" ile ne kastediyorsanız, sahipliğinizi ve izinlerinizi istediğiniz gibi ayarlamak için chownve chmodkomut dosyanızda kullanabilirsiniz.
fkraiem

1
"Kök korumalı" derken ne demek istediğiniz belli değil. Sadece kök kullanıcının okuyabileceği / yazabileceği (örn. Dosya izinleri 700 gibi bir şeye ayarlanmış) veya kök kullanıcının dosya sahibi olduğu anlamına mı geliyor?

1
@DoritoStyle karışıklık için özür dilerim. By kök korumalı , demek kök kullanıcı dosya sahibidir.
İsimsiz

Yanıtlar:


22

Senaryoda aracılığıyla çalıştırılıyor ise test edebilir sudokullanarak EUIDve SUDO_USERdeğişkenler ve ardından yürütmek toucholarak SUDO_USEReğer doğruysa - gibi bir şey

#!/bin/bash

if [[ $EUID -eq 0 ]] && [[ -n $SUDO_USER ]]; then
  sudo -u "$SUDO_USER" touch dummy.txt
else
  touch dummy.txt
fi

2
==Dize karşılaştırması için kullanıldığını unutmayın . Yana $EUIDtamsayı değeri döndürmek gerekiyordu, ben kullanmak tavsiye ederim -edkarşılaştırma. Kullanıcı adlarında boşluklara izin verilir , bu nedenle büyük olasılıkla $SUDO_USERdeğişkeni belirtin. Aksi takdirde, iyi cevap - bu şahsen kullanacağım bir şey.
Sergiy Kolodyazhnyy

@steeldriver aradığım şey buydu. Teşekkürler!!
İsimsiz

1
sudo -uKök olarak çalıştığını algılarsa , komut dosyasının kendisini yeniden çalıştırmasını sağlayabilirsiniz. OP bir senaryoda birden fazla komutun bulunmasından bahsetti. Ancak hatalarda sonsuz bir döngüden kaçınmaya dikkat edin.
Peter Cordes

1
İçinde bölünen bir kelime yok, [[...]]bu yüzden ifS deyimi içindeki değişkeni alıntılamak kesinlikle gerekli değil ve tahmin ediyorum -edbir yazım hatasıydı-eq
Arronical

@ Arronik evet, bu yazım hatasıydı -eq. Bilmiyordum [[kelime bölme yok. Teşekkürler. Şahsen, hala iyi senaryo alışkanlıkları uğruna teklif ediyorum
Sergiy Kolodyazhnyy

9

Komut dosyanızın çalıştırılması amaçlanmamışsa root, sorunu çözmenin en güvenli yolu komut dosyasının yürütülmesini en baştan iptal etmektir:

if [ "$EUID" = 0 ]; then
   echo "This script must NOT be run as root" 
   exit 1
fi

İsteğe bağlı olarak, komut dosyanızı sudo -u FALLBACK_USER "$0"basit bir şekilde iptal etmek yerine yedek kullanıcı (örn. ) Olarak yeniden yürütebilirsiniz .

Tek tek komutların tuhaflıklarını düzeltmeye çalışmak, komut dosyanızın gereksiz yere karmaşık ve hata ayıklamasını zorlaştıracaktır. Her değiştirdiğinizde, tüm testleri iki kez (normal kullanıcı olarak, sonra root) yapmanız ve rootortaya çıkan tüm ilgili hataları düzeltmeniz gerekir . Yani geleceğe dönük bir çözüm değil.


6

Varsayılan olarak, kök hesabı ile oluşturulan dosyalar aşağıdaki gibi izinlere sahiptir:

-rw-r--r-- 1 root root 0 11 17 23:25 rootfile.txt

Burada dosya kök kullanıcı ve kök grubuna aittir ve kök tarafından okunabilir ve yazılabilir, ancak yalnızca diğerleri tarafından okunabilir.

En basit yaklaşım sadece chownorijinal kullanıcıya geri dosya olacaktır .

chown username:group_name dummy.txt

$SUDO_USERYalnızca sudoçağrıldığında erişilebilen bir değişkeni kullanabilirsiniz , şöyle :

chown "$SUDO_USER":"$SUDO_USER" dummy.txt

Komut dosyasını normal kullanıcı olarak çalıştırıyorsanız, chownbölüme hiç gerek yoktur, bu nedenle &&komut dosyası kök olarak çalıştırıldığında durumu test etmek için if-ifadesi veya test kullanmayı düşünebilirsiniz ve bu satırlar boyunca bir şeyler yapın:

#!/bin/bash
touch dummy.txt
[ $UID -eq 0 ] && chown "$SUDO_USER":"$SUDO_USER" dummy.txt

Yukarıda önerilen yaklaşım. chmodKullanıcılar ve grup için okuma-yazma-yürütme izinlerini değiştirmek için kullanma gibi başka şeyler de vardır , ancak önerilmez.


cevabın için teşekkürler. Ama QI sadece açıkladı basit senaryoda gerçek durumda orijinal script birçok dosya oluşturacak. Linux'ta sudo'yu görmezden gelemeyiz mi?
İsimsiz

1
@Komutun tamamını ile çalıştırıyorsanız sudo, o zaman hayır - görmezden gelemezsiniz. Seçeneğiniz, komut dosyasını normal kullanıcı olarak çalıştırmanız (neden burada yapmadığınızı anlamıyorum, çünkü burada sadece kullanıcı için bir dosya oluşturuyorsunuz) veya cevabımda gösterdiğim gibi dosya sahipliğini değiştiriyorsunuz.
Sergiy Kolodyazhnyy

Bu en doğru çözümdür ve ölçeklendirmek o kadar da zor olmamalı.
civciv
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.