У меня есть часть программного обеспечения, которое требует /bin/sh
чтобы быть Bash, но для Ubuntu, значение по умолчанию является Тире, и я хочу сохранить это значением по умолчанию; я не хочу изменять его на Bash постоянно.
Существует ли способ изменить его только для рабочего терминального сеанса? Таким образом, программа, работающая в этом терминале, будет видеть /bin/sh
связанный с ударом, но остальной частью системы будет все еще видеть Тире? Или я могу обмануть программное обеспечение для наблюдения /bin/sh
как Bash, даже если нет?
Я не записал это программное обеспечение и взламывание его для использования /bin/bash
вместо /bin/sh
не действительно опция.
Два ответа уже предлагают chrooting и связывают, монтируется, и существует одна треть, тесно связанная опция: смонтируйте пространства имен. Используя unshare
программа, Вы можете создать новое пространство имен монтирования и монтируетесь в этом пространстве имен, не будет влиять на другие пространства имен.
Например, в одном терминале, я делаю:
muru|[0] ~ sudo unshare -m /bin/bash
root@muru-1604:~# sudo mount --bind /bin/bash /bin/sh
root@muru-1604:~# /bin/sh --version
GNU bash, version 4.4.18(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
root@muru-1604:~# sudo -iu muru
muru|[0] ~ /bin/sh --version # propagates
GNU bash, version 4.4.18(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
И в другом:
$ /bin/sh --version
/bin/sh: 0: Illegal option --
Таким образом, Вы могли запустить эту негибкую программу в ее собственном пространстве имен монтирования.
Если это - сценарий, просто назовите сценарий как
bash scriptname.sh
Никакая потребность изменить ссылки вообще.
Для скомпилированного исполняемого файла можно пойти chroot путем:
mkdir rootfs
cp -a /usr rootfs/
cp -a /lib rootfs/
cp -a /lib64 rootfs/
cp /bin/bash rootfs/bin/sh
cp yourprogram rootfs/
sudo chroot rootfs sh
И затем запущенный Ваша программа или sudo chroot rootfs /yourprogram
Однако на практике нет никакой причины, почему Вы не можете использовать /bin/bash
как символьная ссылка на /bin/sh
. На самом деле до версии 6.10 Ubuntu использовала /bin/bash
как /bin/sh
, и затем они переключились из-за /bin/sh
будучи намного более быстрой, более минимизированной реализацией POSIX /bin/sh
(то есть, это придерживается стандарта POSIX для того, как подобные Unix утилиты операционной системы и ОС должны вести себя и реализовать некоторые свои внутренности), и из-за причин мобильности. Я настоятельно рекомендую читать ответ Gilles также для исторических очерков на как /bin/dash
появился. Что касается совместимости, сценарии, записанные для dash
использование функций POSIX будет работать с bash
будучи превосходной оболочкой по умолчанию. Обычно, это наоборот, который вызывает проблемы - bash
имеет функции, которые не требуются /bin/sh
, как <<<
синтаксис или массивы.
Кроме того, рассматриваемая команда, вероятно, записана с RHEL или CentOS в памяти, который действительно использует /bin/bash
как символьная ссылка на /bin/sh
, предлагает две вещи: они, вероятно, были нацелены на определенную ОС и не придерживались принципов POSIX. В этом случае это также была бы хорошая идея проверить то, чего других вещей требует команда, с тех пор, если это действительно записано с другой ОС в памяти, Вы могли бы столкнуться с большим количеством проблем, чем просто пересоединение /bin/sh
.
Одна возможность была бы связыванием, монтируются единственного файла. Чтобы сделать это, Вы монтируете файл /bin/bash
просто /bin/dash
так bash
вид покрытий или скрывается dash
. Вот шаги (включая реверс):
root@myhost:~# cd /bin
# situation before (bash and dash are different):
root@myhost:/bin# ls -l *sh*
-rwxr-xr-x 1 root root 1113504 Apr 4 20:30 bash
-rwxr-xr-x 1 root root 121432 Jan 25 2018 dash
lrwxrwxrwx 1 root root 4 Jul 13 11:38 sh -> dash
...
# mount /bin/bash over /bin/dash:
root@myhost:/bin# mount --bind /bin/bash /bin/dash
# situation now (bash and dash are the same):
root@myhost:/bin# ls -l *sh*
-rwxr-xr-x 1 root root 1113504 Apr 4 20:30 bash
-rwxr-xr-x 1 root root 1113504 Apr 4 20:30 dash
lrwxrwxrwx 1 root root 4 Jul 13 11:38 sh -> dash
...
# Now everything that runs `/bin/sh` in fact uses `/bin/bash`.
# check what the symlink "sh" says:
root@myhost:/bin# sh --version
GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)
...
# undo the mount:
root@myhost:/bin# umount /bin/dash
# situation now (bash and dash are different again):
root@myhost:/bin# ls -l *sh*
-rwxr-xr-x 1 root root 1113504 Apr 4 20:30 bash
-rwxr-xr-x 1 root root 121432 Jan 25 2018 dash
lrwxrwxrwx 1 root root 4 Jul 13 11:38 sh -> dash
...
# check what the symlink "sh" now says:
root@myhost:/bin# sh --version
sh: 0: Illegal option --
Я не пытался mount --bind /bin/bash /bin/sh
непосредственно скрыть символьную ссылку, все же. Вышеупомянутое mount
прием просто делает удар и тире идентичными так, чтобы sh
относится к bash
хотя это указывает на dash
. Кроме того, это - решение в масштабе всей системы, не только для текущего окна терминала.
Я должен признаться, это могло бы быть излишеством, и просто изменение символьной ссылки временно намного легче. Я просто хотел показать другой возможный путь.
Необходимо смочь изменить его для просто текущей сессии при помощи псевдонима. Прежде, чем выполнить Вашу команду в терминале:
alias sh=bash
Это будет временным и только активным в терминале, от которого это выполнялось.
ОДНАКО: Это НЕ будет РАБОТАТЬ, если Ваш сценарий будет использовать полные пути.
Хорошая идея как таковая, но если программное обеспечение непосредственно называет/bin/sh с явным путем, это не будет работать. Так или иначе то программное обеспечение, кажется, очень правильно не разработано, делая такие предположения. Я, вероятно, выполнил бы его из сценария, который готовит и сбрасывает надлежащую среду, если я должен был использовать его вообще. – ванадий
К сожалению, "взламывание" сценария могло бы быть Вашей единственной опцией. На convo с @vanadium Вы могли создать сценарий обертки как это:
#!/bin/bash
sudo ln -sf /bin/bash /bin/sh
/run/my/script
sudo ln -sf /bin/dash /bin/sh
Однако во время продолжительности Вашего сценария, Вы лучше надеетесь, что ничто в Вашей системе явно не требует тире.