Czy jest jakiś sposób na przekazanie funkcji od jednego użytkownika do drugiego?
Na przykład mam mały skrypt Bash, który wykonuję jako root:
#!/bin/bash
user_func(){
whoami
exit
}
su vagrant -c 'user_func'
Jednak funkcja user_func nie jest zdefiniowana dla użytkownika Vagrant, tylko dla rootowania i nie może zostać wykonana.
Inną opcją byłoby posiadanie wielu linii
su vagrant -c 'cmd1'
su vagrant -c 'cmd2'
, etc
Lub, wykonaj wiele poleceń np .: su vagrant -c 'cmd1; cmd2; cmd3;'
, ale wolałbym nie mieć nadmiaru, szczególnie gdy próbujesz wykonać więcej niż 5 poleceń jako użytkownik Vagrant.
Czy można przekazać funkcję innemu użytkownikowi z tego samego skryptu (np. Nie tworząc skryptu na dysku jako inny użytkownik, a następnie wykonując wygenerowany skrypt)? Czy jest jeszcze inna opcja, którą przeoczam?
su
przesłania środowisko.vagrant
tobash
. Jeśli nie,su vagrant -c 'bash -c user_func'
Jest to trochę hackerskie, ale możesz wydrukować definicję funkcji w przekazanej sommandzie
su
i wtedy możesz oczywiście jej użyć.Działa to nawet, jeśli z jakiegoś powodu środowisko spawnowanej powłoki
su
zostanie nadpisane, ponieważ umieszcza definicję po inicjalizacji powłoki. Jeśli napiszesz funkcję wystarczająco kompatybilnie, zadziała nawet wtedy, gdy dwóch użytkowników, o których mowa, używa różnych powłok.źródło
su
powłoki może zostać zastąpione przez czynniki zewnętrzne? Mam na myśli, że w tym przypadku masz pełną kontrolę nadsu
wierszem poleceń, ponieważ jest on w skrypcie. Jak można zastąpić środowisko nowej powłoki?su
może dokonać inicjalizacji środowiska. Równieżsu
sam może usunąć część środowiska dzwoniącego, aby nieco zwiększyć bezpieczeństwo (chociaż zwykle dzieje się tak dzięki bardziej wydajnym alternatywom, takim jaksudo
).Nie masz takiego skryptu, to funkcja. Wygląda na to, że potrzebujesz skryptu. Stwórz odpowiedni skrypt i umieść go, zgodnie z własnymi potrzebami, w
/usr/local/bin
lub w/home/vagrant/bin
, a następnie powinieneś być w stanie npsu vagrant -c '/home/vagrant/bin/myscript.sh'
źródło
Innym, nieco bardziej przenośnym sposobem, aby to zrobić (bez zależności bash) jest wywołanie skryptu przez siebie i zmiana zachowania w zależności od kontekstu (UID) lub parametrów. przykłady tego podano w dokumentacji, w
super
której pokazują skrypt, który wymaga uprawnień roota, wywołując siebie poprzez super, gdy nie jest rootem.źródło