Escape hash mark (#) in / etc / environment

17

Dodam zmienną env do, /etc/environmentale ponieważ wartość zmiennej zawiera znak #, łańcuch jest rozłożony.

MYSQL_PWD="something#no"

Teraz, jeśli zrobię envpowyżej wydajności kodu MYSQL_PWD=something. Jak mogę uciec hash? Próbowałem już \postaci.

Umair A.
źródło
Czy na pewno publikujesz dokładnie to samo, co wkładasz /etc/environment? Ponieważ nie mogłem powielić tego zachowania na Debian Wheezy.
Joseph R.
Niestety nie ma eksportu. Zaktualizowałem moje pytanie.
Umair A.
Na razie zmieniłem MySQL pwd :(
Umair A.
Udało mi się zduplikować twoje zachowanie. Nie zdawałem sobie sprawy, że muszę się wylogować, a następnie zalogować ponownie, aby moja powłoka mogła odczytać /etc/environment.
Joseph R.
@JosephR. - Powielałem to i też byłem zaskoczony. Patrząc na rolę tego pliku, wydaje się on spójny z jego intencją.
slm

Odpowiedzi:

18

Nie wydaje się to możliwe w przypadku /etc/environment. Jest to wspólne miejsce dla zmiennych niezależnych od powłoki. Biorąc to pod uwagę, nie wygląda na to, że obsługuje ciągi ze znakami krzyżyka ( #) w nich i wydaje się, że nie ma sposobu na ucieczkę przed nimi.

Znalazłem to pytanie SF zatytułowane: Jak właściwie uciec przed wiodącą postacią „#” w systemie Linux itp.? . Żadna z tych metod nie działała:

  • control = „cześć”
  • test0 = "# hello"
  • test1 = "h \ #ello"
  • test2 = "h # ello"
  • test3 = "h // # ello"
  • test4 = "h / # ello"
  • test5 = h # ello
  • test6 = h \ #ello
  • test7 = h # ello
  • test8 = h // # ello
  • test9 = h / # ello
  • test10 = „h # ello”
  • test11 = „h \ #ello”
  • test12 = „h # ello”
  • test13 = 'h // # ello'
  • test14 = „h / # ello”

Przyjęta odpowiedź na to pytanie i jaka byłaby moja rada:

Cóż, to trudne zadanie, które chcesz zrobić, /etc/environmentto nie składnia powłoki, wygląda jak jedna, ale nie jest, co frustruje ludzi. Pomysł /etc/environmentbył wspaniały. Niezależny od powłoki sposób ustawiania zmiennych! Tak! Ale praktyczne ograniczenia sprawiają, że jest to bezużyteczne.

Nie możesz tam przekazywać zmiennych. Spróbuj na przykład włożyć MAIL=$HOME/Maildir/w to i zobaczyć, co się stanie. Najlepiej po prostu przestać próbować używać go w jakimkolwiek celu, niestety. Więc nie możesz robić z nim rzeczy, których spodziewałbyś się, gdyby były przetwarzane przez powłokę.

Użyj /etc/profilelub /etc/bashrc.

Jeszcze inne pytania i odpowiedzi uzasadniły, dlaczego tak jest:

Nie ma sposobu /etc/environmentna ucieczkę od # (traktowanego jako komentarz), ponieważ jest on analizowany przez moduł PAM „pam_env” i traktuje go jako prostą listę par KEY = VAL i odpowiednio konfiguruje środowisko. To nie jest bash / shell, parser nie ma języka do interpretacji zmiennych lub ucieczki znaków.

Bibliografia

slm
źródło
czy to błąd, czy jest jakiś powód?
Umair A.
1
@UmairAshraf - nie jest to błąd, tylko ograniczona funkcjonalność ze względu na rolę tego pliku. Ten plik obejmuje wiele technologii powłoki, więc musi być wyposażony w funkcje obsługiwane we wszystkich powłokach, w których będzie używany.
slm
jak idiotyczny; powinien był po prostu użyć tego samego formatu co /proc/environ.
Kaz.
1

Prawdopodobnie za późno, ale wcześniej zadziałały trzy odwrotne ukośniki# .

Jeśli hasło brzmi, powiedz „admin # 123”, możesz je zdefiniować jako

admin\\\#123
Sai Sivaram
źródło
To nie działało dla mnie w /etc/environmentpliku.
Joey V.