Sudo gerektiren bir bash betiğinde sadece bir kez şifre nasıl girilir?


21

Veri

  • Bu makinedeki operatör kullanıcılarının kendi cif hisseleri oluşturmasını istiyorum
  • sudoersDosya zaten içeriyor /bin/mount -t cifs //*/* /media/* -o username=*tüm operatörler için komutu
  • Kullanıcıların cifsparolayı iki kez değil, yalnızca bir kez yazarak bir komut dosyası aracılığıyla bir paylaşım paylaşmalarını istiyorum .
  • Sudo şifresi ve cif şifresi aynıdır.

Zaten sahip olduğum şey

Bu komut dosyası çalışıyor:

#!/bin/bash
sudo 'mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'

... ancak kullanıcıların aynı şifreyi iki kez yazmasını gerektirir!

  • Bir kez sudo
  • Bir kere montajın kendisi için

Bu da işe yarar:

#!/bin/bash
echo -n Password: 
read -s szPassword
echo $szPassword | sudo -S sh -c 'echo $szPassword | mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'

... ancak bu, tüm operatör kullanıcılarının yapabilmelerine izin vermemi gerektiriyorsudo sh (büyük güvenlik sorunu)

Soru

Nasıl bir cifs paylaşımına bağlamaya bash koymadan ¹ shiçinde sudoersdosyanın ne de kalıcı / geçici dosyası oluşturma ???

Not 1: piton yok, perl, C, Git, ... lütfen?
Not 2: Şifreyi sudoersdosyadan kaldırabileceğimi biliyorum , ancak güvenliği sıkmaya çalışıyorum, gevşetmeye değil, rahatlıktan vazgeçmeden ...


2
Ne dersiniz printf "%s\n" "$szPassword" "$szPassword" | sudo -S mount -t cifs / ...?
muru

Bunu şimdi deniyorum! @Muru
Fabby

Yanıtlar:


24

Bunun yerine, kullanıcının sudo olarak kullandığı aramayı yapmasını sağlamalısınız sudo script. sadece betiğin root olarak çalıştırılıp çalıştırılmadığını kontrol edin.

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root, use sudo "$0" instead" 1>&2
   exit 1
fi

Kullanıcılarınızın şifresini yakalamaya çalışmayın.


1
Belki bir şeyleri özlüyorum, ancak bunun parola istemi sayısını ikiden bire düşürdüğünü açıklayabilir misiniz? Aksi halde, bunun soruyu nasıl cevapladığını anlamıyorum.
Oliphaunt - Monica

@Oliphaunt İki şifre sorusu göremiyorum, bunu açıklayabilir misiniz? Ayrıca, bu cevap OP'nin istediği değil, ihtiyaç duyduğu şeydir. Komutları root olarak çalıştırmanız gerektiğinde ve diğer araçların nasıl çalıştığını (kök, aksi halde kurtarıp
bırakmadığınızı

1
OP'nin sorunu (anladığım kadarıyla), kullanıcıdan kendi şifresini girmesi istenir sudove sonra tekrar (başarıyla doğrulaması üzerine) istenir mount. Kullanım durumlarında, bu şifreler aynıdır, dolayısıyla OP'nin neden kullanıcının bir kez sadece bu şifreyi girmesini istediğini anlayabiliyorum. Çözümünüzün bu konuda yardımcı olduğuna inanmıyorum. Birinin şifreleri yakalamaması gerektiğine katılıyorum.
Oliphaunt - Monica

Teşekkürler, ama soruyu biraz daha basitleştirmiş olabilirim: Bu zaten bir senaryo, zaten bu testi içeriyor (hariç 1>&2), autostart'da ve sadece bir cif paylaşımındaydı, ama şimdi üç, yani gerçekten bir şifre gereklidir. (Operatör grubunun üyesi olmayan bir başkası tarafından denenmesi durumunda zaten bu testi içerir)
Fabby

@Fabby Hala soruna yanlış şekilde yaklaştığını düşünüyorum. Bu durumlar için, bir CIFS / SMB paylaşımının şifresini güvenli bir şekilde ( ~/.smbcredentialsörneğin düzenleme ) ve hatta sudo'ya ihtiyaç duymadan (gvfs, umount veya polkit kullanıyorsanız) şifreyi "hatırlama" ya yardımcı olur.
Braiam

7

Aptalım ben!

Aşağıdaki komut dosyası:

#!/bin/bash
read -p "Password: " -s szPassword
printf "%s\n" "$szPassword" | sudo --stdin mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER,password="$szPassword"

sadece çalışır ve:

  1. Parola içeren dosyalar oluşturmaz
  2. Kullanıcının birden fazla paylaşım için yalnızca bir şifre yazmasına izin verir (Windows olanlar dahil)
  3. Fazladan ayrıcalıklara gerek yoktur. :-)

1
1 soru: bu komutu işlem listesine ekler mi?
Rinzwind

3
@Rinzwind dahili olarak bash veya zsh içerisinde olmamalıdır. Mount komutu yine de yapabilirdi.
muru

<<<bunun yerine de kullanılabilir printf , ancak daha iyi bir yaklaşım readtamamen düşmek ve sadece sudo --stdinkendi başına kullanmak olacaktır . $ printf "Type out your password\n" && sudo --stdin apt-get update Kullanıcı gibi bir şey hala sudo şifresini yazabilir. ve bu süreç listesine girmeyecek. Fakat elbette, keylogger'lar, olası sudosuçluluklar ve filan ve fiil ve sonsuza dek
fakirler

@SergiyKolodyazhnyy: Düzenlemek için çekinmeyin , dostum!
Fabby

3

sudoBu komutu çalıştırmak için şifre gerektirmez ; mountkalır için şifre istemi .

İçinde sudoersgibi bir şey

ALL        ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*

Bunu ekledikten sonra, sudobu komut için artık bir şifre sormayacak; kullanıcının hala mountkomuta bir şifre sağlaması gerekir .

Not : Bu soruya dahil ettiğinizden sözlü komut aldım; Joker karakterlerinin kullanıcıların kötü şeyler yapmasına izin verip vermeyeceğini kontrol etmedim. sudoersİğrençlik örnekleri için broşürü okuyun . Özellikle, bu satırın sudoerskullanıcının herhangi bir sayıda -oanahtar veya diğer bağımsız değişkenler eklemesine izin verdiğini unutmayın mount. Yaklaşımınızı yeniden düşünmek isteyebilirsiniz, örneğin @Braiam gibi bir komut dosyası ekleyerek ve sudoek bir kimlik doğrulaması olmadan bu işlemi çalıştırmanıza izin verebilir . Daha sonra komut dosyası, kullanıcıların yalnızca çalıştırmalarını istediğiniz belirli bir formu mountçalıştırmasını sağlar.

Ayrıca, tüm kullanıcılar için buna izin vermek yerine, bunu belirli bir grubun üyeleriyle de sınırlayabilirsiniz, örneğin bir grup oluşturabilir cifsmountve sonra

%cifsmount ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*

@Fabby Üzgünüm, bu konuda tehlikeli olan ne? Ayrıca, alaycı bir ipucu tespit ediyor olabilirim, emin değilim.
Oliphaunt - Monica

Peki, sudo şifre gerektirmese bile, mount yine de şifre gerektirebilir. / Etc / sudoers dosyası sadece sudo'yu bir şifre gerektirmeden yapmak için kullanılabilir. Bu, mount'un bir şifre isteyip istemeyeceğini etkilemez. Eğer bir kişi monte edemediyse, sudo başarısızlıkla sonuçlanan bir komutu çalıştırır, bu da muhtemelen bir problem değildir.
TOOGAM

@TOOGAM Niyetim buydu. İki yerine bir şifre.
Oliphaunt - Monica

Niyetim bir sudoers dosyasında bir "operatör" grubunu tutmaktır, böylece bir operatör kendi öğelerini takmaya çalışırsa, yine de bir parola yazmaları gerekir, ancak "standart" operatör bağlarını monte etmek için yalnızca parola yazmaları gerekir 5 kez yerine bir kez ... Ancak çözümünüz başkaları için işe yarayabilir, o yüzden çok oy toplandı ... (ve orijinal yorumlar kaldırıldı)
Fabby

1

Bu sorunlara genel bir çözüm, aşağıdaki başlangıç ​​bölümünü sudo'nuzun üst kısmına komut dosyaları gerektiren şekilde koymaktır:

#!/bin/bash
case $EUID in
   0) : cool we are already root - fall through ;;
   *) # not root, become root for the rest of this session
      # (and ask for the sudo password only once)
      sudo $0 "$@" ;;
esac
# now the present process is effective-UID  (root)
# so there's no need to put sudo in front of commands

any more commands here will run as superuser ...

Açıkçası, senaryodaki bazı komutların sudoçalıştırılması gerekmiyorsa , burada gereksiz bir ayrıcalık yükselmesi söz konusudur.

Neyse, bu küçük ipucunu paylaşacağımı düşündüm. Bu konuda en güzel şey, eğer zaten etkili-üid kök olsaydı (örneğin, zaten sudo altında çağırdıysanız), doğru olanı zarifçe yapıyor olmasıdır. Ayrıca bir hata vermek ve sizi yeniden yazmaya / tekrar çalışmaya zorlamak (sudo ile) daha az kolaydır.

Ayrıca, kullanıcı kimlik bilgilerini sınırlı bir süre boyunca hatırlamayı söyleyen timestamp_timeoutdeğişkeni de kontrol etmek isteyebilirsiniz (ve kesirli olabilir).man 5 sudoerssudo


Kolay bir cevap almak için betiği çok basitleştirdim: komut dosyası zaten içeriyor: #test if root: if not: bail out if [[ $EUID -ne 0 ]]; then echo "This script must be run as root, use sudo "$0" instead" 1>&2 exit 1 fi Önemli olan, aynı şifreye sahip birden fazla dağı içermesidir (yine: kaldırıldı), ancak yine de teşekkürler ...
Fabby

1
Mesele şu ki, yukarıdaki çözüm sadece bir şifrenin yazılmasını gerektirecektir (sudo için). Başka hiçbir şeye ihtiyaç duymamalı. Ayrıca, birden fazla (ikiden fazla) imtiyazlı komut gerektirdiğinde bile, tüm benzer konular için bir geneldir (ve bir hata vermekten ve komutu sudo ile yeniden yazmak zorunda kalmaktan daha zarif).
arielf

Bu should ama değil ! ;-) Bunun nedeni, her cif paylaşım paylaşımının da bir şifre gerektirmesidir. ( Ubuntu şifresinden farklı olabileceğinden , ancak bu durumda operatörlerin Windows ve Ubuntu şifrelerini senkronize tutmaları gibi değildir)
Fabby
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.