Mam oprogramowanie, które wymaga /bin/sh
Bash, ale dla Ubuntu domyślnym jest Dash i chcę zachować to domyślne; Nie chcę na stałe zmieniać go na Bash.
Czy istnieje sposób, aby to zmienić tylko w przypadku uruchomionej sesji terminala? Więc program działający w tym terminalu będzie widział /bin/sh
link do bash, ale reszta systemu nadal będzie widzieć Dash? Czy mogę oszukać oprogramowanie, aby wyświetlało się /bin/sh
jako Bash, nawet jeśli nie jest?
Nie napisałem tego oprogramowania i włamanie go do użycia /bin/bash
zamiast /bin/sh
nie jest tak naprawdę opcją.
command-line
bash
sh
corwin
źródło
źródło
/bin/sh
jestbash
to błąd, a to powoduje, że rzeczywiste problemy (jak jesteś ustaleniu). Jeśli nikt nie narzeka, może się nigdy nie zmienić.Odpowiedzi:
Dwie odpowiedzi już sugerują chrootowanie i łączenie wierzchowców, a istnieje trzecia, ściśle powiązana opcja: przestrzenie nazw montowania . Za pomocą
unshare
programu możesz utworzyć nową przestrzeń nazw montowań, a montowania w tej przestrzeni nazw nie będą miały wpływu na inne przestrzenie nazw.Na przykład w jednym terminalu wykonuję:
A w innym:
Abyś mógł uruchomić ten nieelastyczny program we własnej przestrzeni nazw montowania.
źródło
Jeśli jest to skrypt, po prostu wywołaj go jako
W ogóle nie trzeba zmieniać linków.
Aby skompilować plik wykonywalny, możesz wybrać trasę chroot:
A następnie uruchom swój program lub
sudo chroot rootfs /yourprogram
Jednak w praktyce nie ma powodu, dla którego nie można użyć
/bin/bash
jako dowiązania symbolicznego/bin/sh
. W rzeczywistości przed wersją 6.10 Ubuntu używało/bin/bash
jako/bin/sh
, a następnie przełączyło się z powodu/bin/sh
znacznie szybszej i szczuplejszej implementacji POSIX/bin/sh
(to znaczy, że jest zgodny ze standardem POSIX, jeśli chodzi o to, jak powinny zachowywać się narzędzia systemu operacyjnego i systemu operacyjnego uniksopodobnego oraz zaimplementować niektóre z ich elementów wewnętrznych) oraz ze względu na przenośność. Zdecydowanie polecam również przeczytanie odpowiedzi Gillesa, aby zapoznać się z historycznymi notatkami na temat tego, jak/bin/dash
powstało. Jeśli chodzi o kompatybilność, skrypty napisane w celudash
korzystania z funkcji POSIX będą działały zbash
domyślną powłoką idealnie w porządku. Zwykle jest na odwrót, co powoduje problemy -bash
funkcjami, które nie są wymagane/bin/sh
, takie jak<<<
składnia lub tablice.Dodatkowo, to polecenie jest prawdopodobnie napisane z myślą o RHEL lub CentOS, które używa
/bin/bash
jako dowiązania symbolicznego/bin/sh
, sugeruje dwie rzeczy: prawdopodobnie celowały w określony system operacyjny i nie przestrzegały zasad POSIX. W takim przypadku dobrym pomysłem byłoby również sprawdzenie, jakich innych rzeczy wymaga polecenie, ponieważ jeśli jest napisane z myślą o innym systemie operacyjnym, możesz napotkać więcej problemów niż tylko ponowne połączenie/bin/sh
.źródło
ln
lubcp -l
).mount --rbind --make-rslave
raczej niżcp -r
. Może być również ustawiony tylko do odczytu. Równieżsudo chroot
uruchamia skrypt jako root, który może nie być optymalna.Jedną z możliwości może być podłączenie jednego pliku. Aby to zrobić, należy zamontować plik
/bin/bash
tuż nad/bin/dash
takbash
rodzaj osłon lub ukrywadash
. Oto kroki (w tym odwrotne):I nie próbował
mount --bind /bin/bash /bin/sh
bezpośrednio ukryć dowiązania, choć. Powyższamount
sztuczka sprawia, że bash i myślnik są identyczne, więcsh
odnosi się do tego,bash
chociaż wskazujedash
. Jest to również rozwiązanie systemowe, nie tylko dla bieżącego okna terminala.Muszę wyznać, że może to być przesada, a po prostu tymczasowa zmiana dowiązania symbolicznego jest znacznie łatwiejsza. Chciałem tylko pokazać inny możliwy sposób.
źródło
Powinieneś być w stanie to zmienić tylko dla bieżącej sesji przy użyciu aliasu. Przed uruchomieniem polecenia w terminalu:
Będzie to tymczasowe i aktywne tylko w terminalu, z którego zostało wykonane.
JEDNAK: NIE DZIAŁA, jeśli skrypt używa ścieżek bezwzględnych.
Niestety „hakowanie” skryptu może być Twoją jedyną opcją. Na konwój z @vanadium możesz utworzyć skrypt otoki w następujący sposób:
Jednak podczas trwania skryptu lepiej jest mieć nadzieję, że nic w systemie nie wymaga wyraźnego myślnika.
źródło