Od na zawsze używaliśmy do uruchamiania skryptów użytkownika od innego użytkownika crontab w ten sposób:
00 12 * * 1 su - user2 -c "/home/user2/myscript.sh"
W ten sposób skrypt jest uruchamiany po załadowaniu powłoki interaktywnej ~ / .bash_profile.
Jednak ostatnio załataliśmy Bash do wersji 4.3.27 z powodu luki „shellshock”, która już nie działa.
Nadal mamy kopię starego basha, więc możemy przetestować problem:
[root ~]$ /bin/bash --version
GNU bash, versión 4.3.30(1)-release (x86_64-unknown-linux-gnu)
[root ~]$ /bin/bash.old --version
GNU bash, versión 4.1.2(1)-release (x86_64-redhat-linux-gnu)
[root ~]$ echo "export MYNEWVAR=helo" >> /home/usertest/.bash_profile
[root ~]$ su -s /bin/bash - usertest -c "env | grep MYNEWVAR"
[root ~]$ su -s /bin/bash.old - usertest -c "env | grep MYNEWVAR"
MYNEWVAR=helo
Czy to jest oczekiwane zachowanie? lub przegapiliśmy, aby włączyć niektóre funkcje w skonfigurować kompilacja krokowa?
Pozdrowienia.
command-line
bash
shell
su
.bash-profile
vegatripy
źródło
źródło
Odpowiedzi:
Zaktualizowane od głosowania obniżającego, więc proszę, jeśli to poprawi problem, tak jak wygląda, gdy użyłem maszyny wirtualnej i archa, zagłosuj, więc otrzymam -1 usuwany.
Jeśli twój system używa SUDO, zobacz drugą połowę poniżej ...
W przypadku systemów używających TYLKO SU:
W niektórych systemach może być aliasowany, więc nawet jeśli użyjesz su, automatycznie użyje su - co wymusza użycie zmiennych nowego użytkownika, które znajdują się w ich bashrc
Spójrz na swój osobisty użytkownik bash.rc, aby znaleźć wspomniany alias poniżej i usunąć go. To powinno powstrzymać go przed próbą użycia zmiennych ustawionych przez użytkownika root.
strona: https://wiki.archlinux.org/index.php/su
Odpowiedni bit:
Dla systemów SUDO
To z powodu konfiguracji sudo. Użyłem następującego pytania / odpowiedzi, aby przejść: https://askubuntu.com/questions/128413/setting-the-path-so-it-applies-to-all-users-including-root-sudo
Gruntownie:
Strona podręcznika dla
sudoers
stwierdza:i tak to się rozwiązuje:
Możesz więc wykonać następujące czynności, aby zachować zmienne podczas używania sudo
spowoduje to otwarcie ustawień sudo. Następnie, zgodnie z tym, co zrobiłem, dodajesz poniższe poniżej
Defaults secure_path="blah"
Defaults env_keep +="VARIABLE VARIABLE VARIABLE"
(WYKLUCZAJĄC ŚCIEŻKĘ taką, jaka jest ustawiona przez secure_path) i są to pojedyncze spacje między każdą zmienną, jeśli chcesz zachować więcej niż 1.
a to, co to robi, mówi sudo, które zmienne env należy zachować, a nie lekceważyć.
Gdy skończysz, przytrzymaj ctrl i naciśnij o, aby napisać Out naciśnij Enter i powiedz tak, aby zapisać [nawet jeśli określa plik tmp, jest OK, zostanie zapisany z powrotem do głównej konfiguracji, po prostu powiedz tak, gdy zostaniesz zapytany, czy chcesz zastąpić].
To powinno pozwolić ci na utrzymanie dowolnych zmiennych, które chcesz (duża jest zmienna JAVA_HOME, a także http_proxy, jeśli używasz proxy).
Powinno to wyglądać mniej więcej tak, jak poniżej: określona zmienna:
aby sprawdzić, czy wyjdzie z otwartych okien terminala i ponownie je otworzy i uruchom
To powinno być to, co ustawiłeś, teraz problem
i teraz powinno pozostać niezmienione.
Odniesienie Grails_home pochodzi ode mnie, pomagając innemu użytkownikowi na społecznościach ubuntu, więc po prostu podporządkuj go nazwie twojej zmiennej.
źródło