Bash'te başka bir kullanıcıya bir işlev mi iletiyorsunuz?


11

Bir işlevi bir kullanıcıdan başka bir kullanıcıya geçirebilmemin bir yolu var mı?

Örneğin, Kök olarak yürüttüğüm küçük bir Bash betiğim var:

#!/bin/bash
user_func(){
  whoami
  exit
}
su vagrant -c 'user_func'

Ancak, user_func İşlevi Vagrant kullanıcısı için değil, yalnızca Kök için tanımlanır ve yürütülemez.

Diğer seçeneğim birden fazla satır

su vagrant -c 'cmd1' 
su vagrant -c 'cmd2'
, etc 

Veya, ex: birden çok komut yürütmek su vagrant -c 'cmd1; cmd2; cmd3;', ama özellikle Vagrant kullanıcı olarak 5'den fazla komut yürütmeye çalışırken fazlalığı tercih etmem.

Aynı komut dosyasından başka bir kullanıcıya İşlev aktarmak mümkün mü (örn. Disk üzerinde farklı bir kullanıcı olarak komut dosyası oluşturma ve sonra oluşturulan komut dosyasını çalıştırma)? Yoksa göz ardı ettiğim başka bir seçenek var mı?

Yanıtlar:


10

exportÖnce bu işlev tanımına ihtiyacınız var gibi görünüyor :

#!/bin/bash
user_func (){
  whoami
  exit
}
export -f user_func
su vagrant -c 'user_func'

hile yapmalı.

Bunun değişken adı yerine bir işlev adı olduğunu -fsöyler export. Alıntı help export:

Daha sonra yürütülen komutların ortamına otomatik dışa aktarma için her bir NAME'yi işaretler. ....

Seçenekler:

 -f   refer to shell functions

Yorumlarda peterph ve Stephane'nin işaret ettiği gibi, bu iki şeyi varsayar:

  1. Senin o sukomut kullanıcının ortamı üzerine yazmaz
  2. Bu vagrantgiriş kabuğu bash. Değilse, suStephane tarafından sağlanan alternatif komut satırını kullanabilirsiniz :

    su vagrant -c 'bash -c user_func'

Aslında tam da umduğum şey buydu. İşlevi dışa aktarabileceğinizin farkında değildim. Bu, örnek komut dosyasını düzenledikten sonra umduğum gibi çalıştı. Teşekkürler!
gdieckmann

1
Güzel, ama suçevreyi geçersiz kılan durumlarda çalışmaz .
peterph

1
Bir giriş kabuğu eğer sadece çalıştığını unutmayın vagrantolduğunu bash. Değilse,su vagrant -c 'bash -c user_func'
Stéphane Chazelas

6

Biraz acayip, ama geçirilen somonun içindeki fonksiyonun tanımını yazdırabilir ve suelbette kullanabilirsiniz.

$ function foo { do_some_stuff_here; }
$ su test -c "$(typeset -f foo); foo"

Bu, herhangi bir nedenle, ortaya çıkan kabuğun ortamının suüzerine yazılsa bile işe yarayacaktır , çünkü kabuk başlatma işleminden sonra tanımı koyar. İşlevi yeterince uyumlu yazarsanız, söz konusu iki kullanıcı farklı kabuklar kullandığında bile çalışır.


+1 Gerçekten düzgün numara! Yine de bir soru, sukabuğun ortamının üzerine harici faktörler yazılabilir mi? Yani, bu durumda subir komut dosyasında olduğu için komut satırı üzerinde tam kontrole sahip olursunuz . Yeni kabuğunun ortamının üzerine nasıl yazılabilir?
Joseph R.

Örneğin, ortaya çıkan kabuk suortamın bir miktar başlatılmasını yapabilir. Ayrıca su, güvenliği biraz sıkılaştırmak için arayanın ortamından bazılarını çıkarabilir (bu genellikle daha güçlü alternatifler tarafından yapılır sudo).
peterph

0

Bu bir senaryo değil, bir fonksiyon. Yine de bir senaryo istiyormuşsunuz gibi geliyor . Uygun bir senaryo yapın ve gereksinimlerine göre, koyun ya /usr/local/bin, ya içinde /home/vagrant/binve örneğin mümkün olması gerekenden dahasu vagrant -c '/home/vagrant/bin/myscript.sh'


Örnek bir komut dosyasındaki bir işlevdir. Umudum, bu tek komut dosyasında (Kök ve Vagrant kullanıcısı olarak çalışan komutlar) yapmak istediğiniz her şeyi dahil etmek ve Kök kullanıcı için ayrı bir komut dosyası ve Vagrant kullanıcısı için ayrı bir komut dosyası olması gerekmiyordu.
gdieckmann

0

Bunu yapmanın bir başka daha taşınabilir yolu (bash bağımlılığı yok) Komut dosyanızın kendini çağırmasını ve davranışını bağlam (uid) veya parametrelere göre değiştirmesini sağlamaktır. bunun örnekleri, superkök izinlerine ihtiyaç duyan bir komut dosyasını gösterdikleri ve kök olmadığında kendini süper olarak çağıran belgelerinde verilmiştir .

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.